注意:阅读本文前,需要读者先对SVM的基本原理有个简单了解,对python编程也有简单了解。

一、SVM和神经网络的区别

SVM,即是支撑向量机,在小规模样本的模式识别中,效果良好,而且这个方法的立论、假设、推导、证明等步骤完整,逻辑严密,可解释性很强。

神经网络一般用于大规模语音、视频、图像等数据样本的模式识别,但神经网络每一层具体干了什么事,每一层提取的特征代表了什么含义都很难解释,在一些需要完整、清晰的理论支持的项目中,有时会利用SVM来替代神经网络。

二、从关键词入手:

1、SVM线性可分

即是此时SVM可当作一个线性分类器,类似LG算法。

分类器的约束条件是:

分类器主体为:

有约束条件,有分类主体,既可以得到一个含有约束条件的方程,对含有约束条件的方程求解,可用拉格朗日乘子法:

2、SVM的街宽

即是分类边界的样本离街的距离,在SVM中需要这个距离刚好为1,其实设为2,3,4,5也是一样,因为我们的逻辑是令正分类边界为wx+b=1,负分类边界是wx+b=-1,重要的是正负号,和具体数值没有关系,因为具体数值由w,b唯一确定。

这个+1,-1即是支撑度,也即是正负分类边界,落在边界上的向量即是支持向量,支撑度由分类器主体中的w和b可以唯一调整确定。

利用拉格朗日乘数法,已知样本的情况下,可以求出α和w,b。

求出W和b之后,既可以作为分解来判断待预测样本是正样本还是负样本(WX+b>=0是正样本,反之负样本)

3、线性可分的情况总结

实质上是在求待分类样本和所有训练样本的内积,通过待分类样本和所有样本内积的关系来判断待分类样本的所属类别。

但因为只有支持向量的拉格朗日乘子不等于0,所以只要计算待分类样本和支持向量的内积即可;

4、SVM线性不可分

核函数:针对线性不可分的样本,为了遵行SVM的原则:计算待分类样本和支持向量样本的内积,将低维度空间的样本映射为高维度,并计算出两个向量的内积值。

松弛变量:如果映射到高维空间仍线性不可分,就加入松弛变量。如果你有过神经网络的使用经验,会发现松弛变量有点像正则项

松弛变量的系数,有点像正则项系数,此处记作C,即是惩罚因子

三、实际使用(python)

filename_traindata:训练样本的路径
filename_testdata:测试样本的路径

-- loadDataSet函数:用来加载数据,设置feature值和label值

from numpy import *def loadDataSet(filename):  #读取数据dataMat=[]labelMat=[]fr=open(filename)for line in fr.readlines():lineArr=line.strip().split(',')dataMat.append([float(lineArr[8]),float(lineArr[9])])labelMat.append(float(lineArr[6]))return dataMat,labelMat #返回数据特征和数据类别def selectJrand(i,m): #在0-m中随机选择一个不是i的整数j=iwhile (j==i):j=int(random.uniform(0,m))return jdef clipAlpha(aj,H,L):  #保证a在L和H范围内(L <= a <= H)if aj>H:aj=Hif L>aj:aj=Lreturn ajdef kernelTrans(X, A, kTup): #核函数,输入参数,X:支持向量的特征树;A:某一行特征数据;kTup:('lin',k1)核函数的类型和参数m,n = shape(X)K = mat(zeros((m,1)))if kTup[0]=='lin': #线性函数K = X * A.Telif kTup[0]=='rbf': # 径向基函数(radial bias function)for j in range(m):deltaRow = X[j,:] - AK[j] = deltaRow*deltaRow.TK = exp(K/(-1*kTup[1]**2)) #返回生成的结果else:raise NameError('Houston We Have a Problem -- That Kernel is not recognized')return K#定义类,方便存储数据
class optStruct:def __init__(self,dataMatIn, classLabels, C, toler, kTup):  # 存储各类参数self.X = dataMatIn  #数据特征self.labelMat = classLabels #数据类别self.C = C #软间隔参数C,参数越大,非线性拟合能力越强self.tol = toler #停止阀值self.m = shape(dataMatIn)[0] #数据行数self.alphas = mat(zeros((self.m,1)))self.b = 0 #初始设为0self.eCache = mat(zeros((self.m,2))) #缓存self.K = mat(zeros((self.m,self.m))) #核函数的计算结果for i in range(self.m):self.K[:,i] = kernelTrans(self.X, self.X[i,:], kTup)def calcEk(oS, k): #计算Ek(参考《统计学习方法》p127公式7.105)fXk = float(multiply(oS.alphas,oS.labelMat).T*oS.K[:,k] + oS.b)Ek = fXk - float(oS.labelMat[k])return Ek#随机选取aj,并返回其E值
def selectJ(i, oS, Ei):maxK = -1maxDeltaE = 0Ej = 0oS.eCache[i] = [1,Ei]validEcacheList = nonzero(oS.eCache[:,0].A)[0]  #返回矩阵中的非零位置的行数if (len(validEcacheList)) > 1:for k in validEcacheList:if k == i:continueEk = calcEk(oS, k)deltaE = abs(Ei - Ek)if (deltaE > maxDeltaE): #返回步长最大的ajmaxK = kmaxDeltaE = deltaEEj = Ekreturn maxK, Ejelse:j = selectJrand(i, oS.m)Ej = calcEk(oS, j)return j, Ejdef updateEk(oS, k): #更新os数据Ek = calcEk(oS, k)oS.eCache[k] = [1,Ek]#首先检验ai是否满足KKT条件,如果不满足,随机选择aj进行优化,更新ai,aj,b值
def innerL(i, oS): #输入参数i和所有参数数据Ei = calcEk(oS, i) #计算E值if ((oS.labelMat[i]*Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or ((oS.labelMat[i]*Ei > oS.tol) and (oS.alphas[i] > 0)): #检验这行数据是否符合KKT条件 参考《统计学习方法》p128公式7.111-113j,Ej = selectJ(i, oS, Ei) #随机选取aj,并返回其E值alphaIold = oS.alphas[i].copy()alphaJold = oS.alphas[j].copy()if (oS.labelMat[i] != oS.labelMat[j]): #以下代码的公式参考《统计学习方法》p126L = max(0, oS.alphas[j] - oS.alphas[i])H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])else:L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)H = min(oS.C, oS.alphas[j] + oS.alphas[i])if L==H:print("L==H")return 0eta = 2.0 * oS.K[i,j] - oS.K[i,i] - oS.K[j,j] #参考《统计学习方法》p127公式7.107if eta >= 0:print("eta>=0")return 0oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta #参考《统计学习方法》p127公式7.106oS.alphas[j] = clipAlpha(oS.alphas[j],H,L) #参考《统计学习方法》p127公式7.108updateEk(oS, j)if (abs(oS.alphas[j] - alphaJold) < oS.tol): #alpha变化大小阀值(自己设定)print("j not moving enough")return 0oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])#参考《统计学习方法》p127公式7.109updateEk(oS, i) #更新数据#以下求解b的过程,参考《统计学习方法》p129公式7.114-7.116b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,i] - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[i,j]b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,j]- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[j,j]if (0 < oS.alphas[i]<oS.C):oS.b = b1elif (0 < oS.alphas[j]<oS.C):oS.b = b2else:oS.b = (b1 + b2)/2.0return 1else:return 0#SMO函数,用于快速求解出alpha
def smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin', 0)): #输入参数:数据特征,数据类别,参数C,阀值toler,最大迭代次数,核函数(默认线性核)oS = optStruct(mat(dataMatIn),mat(classLabels).transpose(),C,toler, kTup)iter = 0entireSet = TruealphaPairsChanged = 0while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)):alphaPairsChanged = 0if entireSet:for i in range(oS.m): #遍历所有数据alphaPairsChanged += innerL(i,oS)print("fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)) #显示第多少次迭代,那行特征数据使alpha发生了改变,这次改变了多少次alphaiter += 1else:nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0]for i in nonBoundIs: #遍历非边界的数据alphaPairsChanged += innerL(i,oS)print("non-bound, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))iter += 1if entireSet:entireSet = Falseelif (alphaPairsChanged == 0):entireSet = Trueprint("iteration number: %d" % iter)return oS.b,oS.alphasdef testRbf(data_train,data_test):dataArr,labelArr = loadDataSet(data_train) #读取训练数据b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 10000, ('rbf', 1.3)) #通过SMO算法得到b和alphadatMat=mat(dataArr)labelMat = mat(labelArr).transpose()svInd=nonzero(alphas)[0]  #选取不为0数据的行数(也就是支持向量)sVs=datMat[svInd] #支持向量的特征数据labelSV = labelMat[svInd] #支持向量的类别(1或-1)print("there are %d Support Vectors" % shape(sVs)[0]) #打印出共有多少的支持向量m,n = shape(datMat) #训练数据的行列数errorCount = 0for i in range(m):kernelEval = kernelTrans(sVs,datMat[i,:],('rbf', 1.3)) #将支持向量转化为核函数predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b  #这一行的预测结果(代码来源于《统计学习方法》p133里面最后用于预测的公式)注意最后确定的分离平面只有那些支持向量决定。if sign(predict)!=sign(labelArr[i]): #sign函数 -1 if x < 0, 0 if x==0, 1 if x > 0errorCount += 1print("the training error rate is: %f" % (float(errorCount)/m)) #打印出错误率dataArr_test,labelArr_test = loadDataSet(data_test) #读取测试数据errorCount_test = 0datMat_test=mat(dataArr_test)labelMat = mat(labelArr_test).transpose()m,n = shape(datMat_test)for i in range(m): #在测试数据上检验错误率kernelEval = kernelTrans(sVs,datMat_test[i,:],('rbf', 1.3))predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + bif sign(predict)!=sign(labelArr_test[i]):errorCount_test += 1print("the test error rate is: %f" % (float(errorCount_test)/m))#主程序
def main():filename_traindata='F:\\Asset_Data\\train1.txt'filename_testdata='F:\\Asset_Data\\test.txt'testRbf(filename_traindata,filename_testdata)if __name__=='__main__':main()

SVM算法逻辑推导与使用实例相关推荐

  1. Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等

    Interview:算法岗位面试-10.24下午-上海某软件公司(机器学习,上市)电话面试-考察SVM.逻辑回归.降低过拟合.卷积网络基础等 导读:当时电话来的非常快,我刚做完一家公司的笔试,接着来了 ...

  2. 支持向量机 SVM 算法推导优缺点 代码实现 in Python

    1.基本思想 前面讲到的Logistic Regression在拟合过程,实际上关注所有样本点的贡献,即寻找这么一个超平面,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练数据上达到这一目标 ...

  3. 百题突击12:1,SVM算法的优缺点 2,SVM的超参数C如何调节 3,SVM的核函数如何选择 4,简述SVM硬间隔推导过程 5,简述SVM软间隔推导过程

    1,SVM算法的优缺点 优点 可以解决高维问题,即大型特征空间: 解决小样本下机器学习问题: 能够处理非线性特征的相互作用: 无局部极小值问题:(相对于神经网络等算法) 无需依赖整个数据: 泛化能力比 ...

  4. 各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 链接:https://www.zhihu.com/question ...

  5. python SVM算法实例

    iris数据集是来自于Python自带的基础算法分析数据,主要作为算法分析和算法认识,是最为基础性的实例. 1.引入函数依赖 在这里使用了sklearn和numpy两个库作为基础依赖,算法选取了SVM ...

  6. MSA(Method of Successive Algorithm)算法逻辑及实例

    文章目录 前言 一.MSA算法是什么? 二.求解优化问题 1.典型优化问题 2.求解步骤 三.简单案例 总结 前言 在城市交通网络配流问题的求解中,MSA(Method of Successive A ...

  7. SVM算法(三层境界)

    支持向量机通俗导论(理解SVM的三层境界) 作者:July .致谢:pluskid.白石.JerryLead. 说明:本文最初写于2012年6月,而后不断反反复复修改&优化,修改次数达上百次, ...

  8. 机器学习-SVM算法

    机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录 支持向量机 1. 间隔与支持向量 1.1. 点 ...

  9. python机器学习 | SVM算法介绍及实现

    本篇博客具体学习参考: 1 [机器学习]支持向量机SVM及实例应用 2 [ML]支持向量机(SVM)从入门到放弃再到掌握 这两篇文章讲得特别清楚,数学推导(第一篇)也能看明白,强烈推荐学习~~ 本篇博 ...

最新文章

  1. (MyEclipse) MyEclipse完美破解方法(图)
  2. 有关算法方面的经典书籍推荐
  3. 施一公又火了!曾突然回国震惊所有美国人,如今所创公司IPO在即,还有基金大佬重仓加盟!...
  4. 技术篇-符号制作-标记符号制作
  5. js highcharts拆线图
  6. android定时截取屏幕内容,Android 截取手机屏幕两种实现方案解析
  7. 统计学考试带计算机,统计学试题
  8. js-showModalDialog和dialogArguments
  9. excel多元线性拟合_excel透视+多元线性回归
  10. 样本峰度(kurtosis)与随机变量的峰度及四阶统计量之间的关系和计算估计
  11. 计算机word快捷键大全列表,Microsoft Office 2019常用快捷键一览表大全
  12. 执行DBMS_SQLTUNE优化sql或dbms_stats收集统计信息报错:ORA-20003
  13. the system clock has been set more than 24 hours
  14. 【ERROR】ValueError: Of the four parameters: start, end, periods, and freq, exactly three must be spec
  15. c语言中怎么表示26个字母,菜鸟求助,写一个随机输出26个英文字母的程序
  16. 付费会员亿时代即将来临,如何才能打造“终身俱乐部”?
  17. 同花顺_代码解析_技术指标_S
  18. Ubuntu安装Eclipse,maven
  19. python 3.8安装pymssql
  20. 敏捷对商业意味着什么_敏捷神话6:“敏捷意味着没有前期设计”

热门文章

  1. HTTP:Web主机托管
  2. java 递归函数_java 递归函数
  3. WPS表格中使用SQL语句获取动态列
  4. MySQL入门系列:数据的插入、删除和更新
  5. 让多动症儿童乖乖穿戴上脑机接口设备,你需要一个时尚科技设计师
  6. 瑞星2011、2012神马的各种内核拒绝服务漏洞
  7. 卸载idea2020不干净_强制卸载软件程序、清理注册表的好工具
  8. 老外说中国姓氏^_^
  9. c语言 乘法计算速度,C++ 基本计算的速度
  10. php文库系统解决方案