深入解析python版SVM源码系列(四)

SMO算法在SVM源码中的更新步骤是最为重要的,如下:

#是否可以继续优化if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)):j = selectJrand(i,m) # 随机选择第j个样本fXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b # 样本j的预测类别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”; continueeta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T – dataMatrix[i,:]*dataMatrix[i,:].T – dataMatrix[j,:]*dataMatrix[j,:].Tif eta >= 0: print “eta>=0″; continuealphas[j] -= labelMat[j]*(Ei – Ej)/etaalphas[j] = clipAlpha(alphas[j],H,L) (alphas[i] += labelMat[j]b1 = 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,:].Tif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0# 说明alpha已经发生改变alphaPairsChanged += i:%d, pairs changed %d” % (iter,i,alphaPairsChanged)

这个算法步骤是这样子的:

Step 1:首先随机选择两个alpha_i和alpha_j,如果它们满足:

说明它们可以进行优化,也就是不满足KKT条件。

对应的源码部分是:

if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)):

Step 2:如果选择的两个alpha是可以更新优化的,那么我们使用下面的算法(SMO的核心)来学习两个新的alpha:

参考:

,生活不要太劳累,弄得自己很疲惫,快乐幸福多体会,

深入解析python版SVM源码系列(四)

相关文章:

你感兴趣的文章:

标签云: