本文主要是介绍SVM编程实现python,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
深入解析python版SVM源码系列--简化版SMO算法
SVM使用SMO算法来解决其中涉及到的二次规划问题。一个简单版本的SMO算法的实现如下:
''' 随机选择随机数,不等于J ''' def selectJrand(i,m):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 # 返回挑选好的随机数''' 门限函数 ''' def clipAlpha(aj,H,L): # 最大不能超过H,最小不能低于Lif aj > H: aj = Hif L > aj:aj = Lreturn aj''' 简化版的SMO函数 ''' def smoSimple(dataMatIn, classLabels, C, toler, maxIter): # 输入数据,标记,常数C,容错率,最大迭代次数dataMatrix = mat(dataMatIn); # 转换成矩阵labelMat = mat(classLabels).transpose() # 转换成矩阵,并转置,标记成为一个列向量,每一行和数据矩阵对应m,n = shape(dataMatrix) # 行,列 b = 0; # 参数b的初始化alphas = mat(zeros((m,1))) # 参数alphas是个list,初始化也是全0,大小等于样本数iter = 0 # 当前迭代次数,maxIter是最大迭代次数while (iter < maxIter): # 当超过最大迭代次数,推出alphaPairsChanged = 0 # 标记位,记录alpha在该次循环中,有没有优化for i in range(m): # 第i个样本fXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b # 第i样本的预测类别Ei = 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) # 随机选择第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])
这篇关于SVM编程实现python的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!