from numpy import
*
#smo演算法中的輔助函式
defloaddataset
(filename)
:#功能:匯入資料庫;輸入:檔名;輸出:資料矩陣,標籤向量
datamat =
;labelmat =
fr =
open
(filename)
for line in fr.readlines():
linearr = line.strip(
).split(
'\t')[
float
(linearr[0]
),float
(linearr[1]
)])float
(linearr[2]
))return datamat,labelmat
#功能:在(0,m)的區間範圍內隨機選擇乙個除i以外的整數
#輸入:不能選擇的整數i,區間上界m
#輸出:隨機選擇的整數
defselectjrand
(i,m)
: j=i
while
(j==i)
: j =
int(random.uniform(
0,m)
)return j
#功能:保證aj在[l,h]裡面
#輸入:要調整的數aj,區間上界h,區間下屆l
#輸出:調整好的數aj
defclipalpha
(aj,h,l)
:if aj > h:
aj = h
if l > aj:
aj = l
return aj
#功能:簡化版smo演算法
#輸入:資料矩陣datamatin,標籤向量classlabels,常數c,容錯率toler,最大迭代次數maxiter
#輸出:超平面位移項b,拉格朗日乘子alpha
defsmo******
(datamatin,classlabels,c,toler,maxiter)
:#參見plata**
datamatrix = mat(datamatin)
#轉換矩陣型別,便於進行線性代數操作
labelmat = mat(classlabels)
.transpose(
)#轉置矩陣
b =0 m,n = shape(datamatrix)
#獲取資料矩陣的行數和列數,表示訓練樣本個數和特徵值個數
alphas = mat(zeros(
(m,1))
)#m*1階矩陣
iter=0
while
(iter
< maxiter)
: alphapairschanged =
0for i in
range
(m):
fxi =
float
(multiply(alphas,labelmat)
.t*(datamatrix*datamatrix[i,:]
.t))
+b ei = fxi -
float
(labelmat[i]
)#誤差if(
(labelmat[i]
*ei <
-toler)
and(alphas[i]
< c)
)or \
((labelmat[i]
*ei > toler)
and(alphas[i]
>0)
):j = selectjrand(i,m)
fxj =
float
(multiply(alphas,labelmat)
.t*(datamatrix*datamatrix[j,:]
.t))
+b ej = fxj -
float
(labelmat[j]
) alphaiold = alphas[i]
.copy(
) alphajold = alphas[j]
.copy()if
(labelmat[i]
!= labelmat[j]):
l =max(
0, alphas[j]
- alphas[i]
) h =
min(c, c + alphas[j]
- alphas[i]
)else
: l =
max(
0, alphas[j]
+ alphas[i]
- c)
h =min(c, alphas[j]
+ alphas[i]
)if l==h:
print
("l==h");
continue
eta =
2.0* datamatrix[i,:]
*datamatrix[j,:]
.t - datamatrix[i,:]
*datamatrix[i,:]
.t - datamatrix[j,:]
*datamatrix[j,:]
.t if eta >=0:
print
("eta>=0");
continue
alphas[j]
-= labelmat[j]
*(ei - ej)
/eta
alphas[j]
= clipalpha(alphas[j]
,h,l)if(
abs(alphas[j]
- alphajold)
<
0.00001):
print
("j not moving enough");
continue
alphas[i]
+= labelmat[j]
*labelmat[i]
*(alphajold - alphas[j]
)#update i by the same amount as j
#the update is in the oppostie direction
b1 = b - ei- labelmat[i]
*(alphas[i]
-alphaiold)
*datamatrix[i,:]
*datamatrix[i,:]
.t - labelmat[j]
*(alphas[j]
-alphajold)
*datamatrix[i,:]
*datamatrix[j,:]
.t b2 = b - ej- labelmat[i]
*(alphas[i]
-alphaiold)
*datamatrix[i,:]
*datamatrix[j,:]
.t - labelmat[j]
*(alphas[j]
-alphajold)
*datamatrix[j,:]
*datamatrix[j,:]
.t if(0
< alphas[i]
)and
(c > alphas[i]
): b = b1
elif(0
< alphas[j]
)and
(c > alphas[j]
): b = b2
else
: b =
(b1 + b2)
/2.0
alphapairschanged +=
1print
("iter: %d i:%d, pairs changed %d"%(
iter
,i,alphapairschanged))if
(alphapairschanged ==0)
:iter+=1
else
:iter=0
print
("iteration number: %d"
%iter
)return b,alphas
#測試以上演算法
dataarr,labelarr = loaddataset(r'選擇你自己的資料集儲存路徑\testset.txt'
)b,alphas = smo******(dataarr,labelarr,
0.6,
0.001,40
)
機器學習實戰 5 支援向量積
1 是一種二分類模型,它的目的是尋找乙個超平面來對樣本進行分割,分割的原則是間隔最大化,最終轉化為乙個凸二次規劃問題來求解。由簡至繁的模型包括 當訓練樣本線性可分時,通過硬間隔最大化,學習乙個線性可分支援向量機 當訓練樣本近似線性可分時,通過軟間隔最大化,學習乙個線性支援向量機 當訓練樣本線性不可分...
《機器學習實戰》原始碼解析(九) PCA
from numpy import import matplotlib import matplotlib.pyplot as plt pca演算法,共兩個函式 第乙個函式,用於清洗資料 輸入 原始資料集,分隔符 輸出 清洗後的資料集,乙個可以計算的矩陣 defloaddataset filenam...
機器學習(三) 支援向量機
支援向量機是一種判別模型,它構建乙個超平面使得距離這個超平面最近的點的距離最大。支援向量機的任務是在較低的模型泛化誤差下尋找乙個合適的超平面。如果超平面的函式是如下表示式 那麼超平面與資料點 label 1 之間的幾何關係為 定義 幾何間隔和函式間隔 因此,轉換為帶約束的優化問題 我們無法保證資料是...