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

SVM使用SMO算法来解决其中涉及到的二次规划问题。一个简单版本的SMO算法的实现如下:

”’随机选择随机数,不等于J”’:j=i #we want to select any J not equal to iwhile (j==i):j = int(random.uniform(0,m)) # 一直在挑选随机数j,直到不等于i,随机数的范围在0~mreturn j # 返回挑选好的随机数”’门限函数”’: # 最大不能超过H,最小不能低于Lif aj > H:aj = Hif L > aj:aj = Lreturn aj”’简化版的SMO函数”’: # 输入数据,标记,常数C,容错率,最大迭代次数dataMatrix = mat(dataMatIn); # 转换成矩阵labelMat = mat(classLabels).transpose() # 转换成矩阵,并转置,标记成为一个列向量,每一行和数据矩阵对应m,n = shape(dataMatrix) # 行,列 b = 0; # 参数b的初始化alphas = mat(zeros((m,1))) # 参数alphas是个list,初始化也是全0,,大小等于样本数iter = (iter < maxIter): # 当超过最大迭代次数,推出alphaPairsChanged = i in range(m): # 第i个样本fXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b # 第i样本的预测类别Ei = fXi – float(labelMat[i])((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) (abs(alphas[j] – alphaJold) < alphas[i] += labelMat[j]*labelMat[i]*(alphaJold – alphas[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 += % (iter,i,alphaPairsChanged): iter = % iter# 只有当某次优化更新达到了最大迭代次数,这个时候才返回优化之后的alpha和breturn b,alphas

使用SMO算法可以迭代更新参数alphas,而依据alphas我们可以得到最终的分类决策超平面的参数w和b。

只做第一个我,不做第二个谁。

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

相关文章:

你感兴趣的文章:

标签云: