首页 > 分享 > 支持向量机(SVM)的SMO算法实现与核函数应用

支持向量机(SVM)的SMO算法实现与核函数应用

前言:
本篇文章主要实现了《机器学习实战》的支持向量机部分,我在代码中也尽量描述了对应公式的哪些变量。我建议搭配《统计学习方法》进行实战,下面这篇博文对于公式推导也是很不错的。

https://blog.csdn.net/u011067360/article/details/26503719

另外本篇依赖于jupyter notebook。故在代码后面会出现相应的结果。

正文:

SMO算法求支持向量机

SMO算法中的辅助函数

def loadDataSet(fileName): """读取数据""" dataMat = [];labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr = line.strip().split('t') dataMat.append([float(lineArr[0]),float(lineArr[1])]) labelMat.append(float(lineArr[2])) return dataMat,labelMat123456789

def selectJrand(i,m): """ 参数i:第一个alpha的下标,参数m:所有alpha的数目 在某个区间范围随机取一个整数 """ j = i while(j == i ): j = int (random.uniform(0,m)) return j123456789

def clipAlpha(aj,H,L): """用于在数值太大时进行调整""" if aj > H: aj = H if L > aj: aj = L return aj1234567

dataArr,labelArr = loadDataSet("E:\DataMining\Project\MLBook\机器学习实战源代码\machinelearninginaction\Ch06\testSet.txt")1 简化版SMO算法

def smoSimple(dataMatIn,classLabels,C,toler,maxIter): """参数dtatMatIn:数据集 参数classLabels:类别标签 参数C:常数C 参数toler:容错率 参数maxIter:退出前最大的循环次数""" dataMatrix = mat(dataMatIn);labelMat =mat(classLabels).transpose() b = 0;m,n = shape(dataMatrix) alphas = mat(zeros((m,1))) iter = 0 #储存在没有任何alpha改变的情况下遍历数据集的次数 while(iter < maxIter): alphaPairsChanged = 0 #记录alpha是否已优化 for i in range(m): #multiply() 数组元素对应相乘 #fXi 是预测值 fXi = float(multiply(alphas,labelMat).T * (dataMatrix * dataMatrix[i,:].T)) + b Ei = fXi - float(labelMat[i]) #违反KKT条件最严重 # 以下几种情况出现将会出现不满足:(ui是预测值,ai是变量alpha) #yiui<=1但是ai<C则是不满足的,而原本ai=C #yiui>=1但是ai>0则是不满足的而原本ai=0 #yiui=1但是ai=0或者ai=C则表明不满足的,而原本应该是0<ai<C #所以要找出不满足KKT的这些ai,并更新这些ai #在考虑这些点时有首先考虑0<ai<C对应的样本点(即对应的样本点是在间隔边界上的支持向量) if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): #随机选择第二个alpha j = selectJrand(i,m) 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]) if L==H: print('L==H') continue #最优修改量eta eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T if eta >= 0: print('eta>=0') continue #之所以是-= 是因为前面eta的求法对比书上公式是相

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

相关知识

R语言与支持向量机SVM应用实例
【病害检测】基于支持向量机SVM实现植物叶片病害检测,含准确率附Matlab代码
探索MATLAB支持向量机分类:从入门到精通
基于花授粉算法优化实现SVM数据分类
支持向量机(SVM)代码实现学习记录
机器学习实践:基于支持向量机算法对鸢尾花进行分类
SVM在植物叶子疾病识别中的应用
KNN、NB、SVM实现鸢尾花分类
sklearn机器学习支持向量机案例解析
支持向量机的鸢尾花分类设计及实现

网址: 支持向量机(SVM)的SMO算法实现与核函数应用 https://m.huajiangbk.com/newsview1882171.html

所属分类:花卉
上一篇: 一种防辐射装置的制作方法
下一篇: 安徽省辐射环境监督站2024年能