生活随笔
收集整理的這篇文章主要介紹了
SVM SMO方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考資料:https://blog.csdn.net/v_JULY_v/article/details/7624837
def
smoSimple(dataMatIn
, classLabels
, C
, toler
, maxIter
):dataMatrix
= mat(dataMatIn
); labelMat
= mat(classLabels
).transpose()b
= 0; m
,n
= shape(dataMatrix
)alphas
= mat(zeros((m
,1)))iter
= 0while (iter
< maxIter
):alphaPairsChanged
= 0for i in
range(m
):fXi
= float(multiply(alphas
,labelMat
).T
*(dataMatrix
*dataMatrix
[i
,:].T
)) + bEi
= fXi
- float(labelMat
[i
])#
if checks
if an example violates KKT conditions
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
)) + bEj
= 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"); continueeta
= 2.0 * dataMatrix
[i
,:]*dataMatrix
[j
,:].T
- dataMatrix
[i
,:]*dataMatrix
[i
,:].T
- dataMatrix
[j
,:]*dataMatrix
[j
,:].T
if eta
>= 0: print
("eta>=0"); continuealphas
[j
] -= labelMat
[j
]*(Ei
- Ej
)/etaalphas
[j
] = clipAlpha(alphas
[j
],H
,L
)if (abs(alphas
[j
] - alphaJold
) < 0.00001): print
("j not moving enough"); continuealphas
[i
] += labelMat
[j
]*labelMat
[i
]*(alphaJold
- alphas
[j
])#update i by the same amount as j
#the update is in the oppostie directionb1
= b
- Ei
- labelMat
[i
]*(alphas
[i
]-alphaIold
)*dataMatrix
[i
,:]*dataMatrix
[i
,:].T
- labelMat
[j
]*(alphas
[j
]-alphaJold
)*dataMatrix
[i
,:]*dataMatrix
[j
,:].Tb2
= 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
= b1elif
(0 < alphas
[j
]) and (C
> alphas
[j
]): b
= b2
else: b
= (b1
+ b2
)/2.0alphaPairsChanged
+= 1print
("iter: %d i:%d, pairs changed %d" % (iter
,i
,alphaPairsChanged
))if (alphaPairsChanged
== 0): iter
+= 1else: iter
= 0print
("iteration number: %d" % iter
)return b
,alphas
總結
以上是生活随笔為你收集整理的SVM SMO方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。