没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
11页
svm支持向量机python代码 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf 支持向量机SVM通俗理解(python代码实现).pdf
资源推荐
资源详情
资源评论
这是第三次来“复习”SVM了,第一次是使用SVM包,调用包并尝试调节参数。听闻了“流弊”SVM的算法。第二次学习理
论,看了李航的《统计学习方法》以及网上的博客。看完后感觉,满满的公式。。。记不住啊。第三次,也就是这次通
过python代码手动来实现SVM,才让我突然对SVM不有畏惧感。希望这里我能通过简单粗暴的文字,能让读者理解到底
什么是SVM,这货的算法思想是怎么样的。看之前千万不要畏惧,说到底就是个算法,每天啃一点,总能啃完它,慢慢
来还可以加深印象。
SVM是用来解决分类问题的,如果解决两个变量的分类问题,可以理解成用一条直线把点给分开,完成分类。如下:
上面这些点很明显不一样,我们从中间画一条直线就可以用来分割这些点,但是什么样的直线才是最好的呢?通俗的
说,就是一条直线“最能”分割这些点,也就是上图中的直线。他是最好的一条直线,使所有的点都“尽量”远离中间那条直
线。总得的来说,SVM就是为了找出一条分割的效果最好的直线。怎么样找出这条直线,就变成了一个数学问题,通过
数学一步一步的推导,最后转化成程序。这里举例是二个特征的分类问题,如果有三个特征,分类线就变成了分类平
面,多个特征的话就变成了超平面。从这个角度出发去看待SVM,会比较轻松。
数学解决方法大致如下:
目的是求最大分隔平面,也就是选取靠近平面最近的点,使这些点到分隔平面的距离W最大,是一个典型的凸二次规划
问题。
但是上面需要求解两个参数w和b;于是为求解这个问题,把二次规划问题转换为对偶问题
这样就只需求一个参数a了,通过SMO算法求出a后,再计算出b
最后通过f(x)用做预测。
详细的数学推导,请看下面两个博客以及《统计学习方法》,这两位博主其实已经讲解的非常详细了。
http://blog.csdn.net/zouxy09/article/details/17291543
http://blog.csdn.net/v_july_v/article/details/7624837
《统计学习方法》这本书里面全是数学公式,非常“课本”,建议先看博客,有个大概印象再去看“课本”,跟着“课本”一步
一步的推导。最后用python代码实现一遍,应该就可以拿下SVM了。
python代码实现可以加深对那些数学推导公式的印象,看公式的时候,可能会想,这些推导好复杂,都有些什么用啊,
结果写代码的时候会发现,原来最后都用在代码里。所以写代码可以加深对SVM的理解。
下面是SVM的python代码实现,我做了详细的注释,刚开始看代码也会觉得好长好复杂,慢慢看后发现,代码就是照着
SVM的数学推导,把最后的公式推导转化为代码和程序的逻辑,代码本身并不复杂。
from numpy import *
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]))
labelMat.append(float(lineArr[2]))
return dataMat,labelMat #返回数据特征和数据类别
def selectJrand(i,m): #在0-m中随机选择一个不是i的整数
j=i
while (j==i):
j=int(random.uniform(0,m))
return j
def clipAlpha(aj,H,L): #保证a在L和H范围内(L <= a <= H)
if aj>H:
aj=H
if L>aj:
aj=L
return aj
def 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.T
elif kTup[0]=='rbf': # 径向基函数(radial bias function)
for j in range(m):
deltaRow = X[j,:] - A
K[j] = deltaRow*deltaRow.T
K = 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 #初始设为0
self.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值
剩余10页未读,继续阅读
资源评论
- Asama浅间2023-07-24作者对SVM算法的解释很中肯,避免了过于专业化的术语,使得读者更容易理解。
- yiyi分析亲密关系2023-07-24作者在该文件中通过简单易懂的Python代码实现了SVM算法,帮助读者更好地理解其原理。
- 王者丶君临天下2023-07-24这本文件的实用性很强,为读者提供了一种简单有效的方法来解决分类问题。
- 高工-老罗2023-07-24这本文件对SVM算法的介绍非常详细,对于想深入学习和应用SVM的人来说是一本很有价值的资料。
- 首席程序IT2023-07-24这本文件对支持向量机进行了通俗易懂的解释,非常适合初学者入门。
快乐无限出发
- 粉丝: 1127
- 资源: 7260
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功