smo演算法的目標是求出一系列alpha和b,一旦求出了這些alpha,就很容易計算出權重向量w 並得到分隔超平面。
偽**如下:
建立乙個alpha向量並將其初始化為0向量
當迭代次數小於最大迭代次數時(外迴圈)
對資料集中的每個資料向量(內迴圈):
如果該資料向量可以被優化:
隨機選擇另外乙個資料向量
同時優化這兩個向量
如果兩個向量都不能被優化,退出內迴圈
如果所有向量都沒被優化,增加迭代數目,繼續下一次迴圈
下面給出**:
from numpy import
*def
loaddataset
(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
defselectjrand
(i,m)
:import random
j=iwhile
(j==i)
: j=
int(random.uniform(
0,m)
)return j
defclipalpha
(aj,h,l)
:if aj>h:
aj=h
if l>aj:
aj=l
return aj
defsmo******
(datamatin,classlabels,c,toler,maxiter)
: datamatrix=mat(datamatin)
;labelmat=mat(classlabels)
.transpose(
) b=
0;m,n=shape(datamatrix)
alphas=mat(zeros(
(m,1))
)iter=0
while
(iter
: alphapairschanged=
0for i in
range
(m):
fxi=
float
(multiply(alphas,labelmat)
.t*(datamatrix*datamatrix[i,:]
.t))
+b #fxi=wx+b
ei=fxi-
float
(labelmat[i]
)#計算誤差if(
(labelmat[i]
*ei<
-toler)
and(alphas[i]
((labelmat[i]
*ei>toler)
and(alphas[i]
>0)
):#判斷是否能優化
j=selectjrand(i,m)
#隨機選取j
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]
)#用於調整使得α[j]處於(0,c)中
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 #eta=2*--
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]
)#改變α[j]同時在滿足約束條件下改變α[i]
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
)and
(c>alphas[i]
):b=b1
elif(0
)and
(c>alphas[j]
):b=b2
else
:b=(b1+b2)
/2.0
#計算b
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
最後先搞懂數學原理再去看**,否則會一頭霧水。 支援向量機專題 線性支援向量機
原文 當資料線性不可分時,使用硬間隔支援向量機很難得到理想的結果。但是如果資料近似線性可分,可以採用軟間隔支援向量機 線性支援向量機 進行分類。這通常適用於有少量異常樣本的分類,如果使用線性支援向量機,它會盡量使得所有訓練樣本都正確,如下圖所示。顯然這並不是最好的結果,軟間隔支援向量機可以權衡 間隔...
支援向量機
支援向量機 svm 一種專門研究有限樣本 的學習方法。是在統計學習理論基礎之上發展而來的。沒有以傳統的經驗風險最小化原則作為基礎,而是建立在結構風險最小化原理的基礎之上,發展成為一種新型的結構化學習方法。結構風險最小歸納原理 解決了有限樣本或小樣本的情況下獲得具有優異泛化能力的學習機器。包含了學習的...
支援向量機
支援向量 與分離超平面距離最近的樣本點的例項 優點 泛化錯誤率低,計算開銷不大,結果易解釋 缺點 對引數調節和核函式選擇敏感,原始分類器不加修改僅適用於處理二分類問題 適合資料型別 數值型和標稱型資料 每次迴圈中選擇兩個alpha進行優化處理。一旦找到一對合適的alpha,那麼久增大其中乙個同時減小...