完美排版基于Python实现的支持向量机课程设计.docx
- 文档编号:1129439
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:10
- 大小:152.69KB
完美排版基于Python实现的支持向量机课程设计.docx
《完美排版基于Python实现的支持向量机课程设计.docx》由会员分享,可在线阅读,更多相关《完美排版基于Python实现的支持向量机课程设计.docx(10页珍藏版)》请在冰豆网上搜索。
完美排版基于Python实现的支持向量机课程设计
支持向量机(SVM)课程设计
(基于Python实现)
说明:
本文档适用于一般本科和高年级专科
本文档仅供学习者学习SVM参考,不建议直接用来交作业,否则失去了知识传播的意义。
使用python实现支持向量机(svm)实验手册
1.实验任务
1)理解支持向量机(svm)原理
2)使用python自定义实现支持向量机(svm)
2.背景知识
1)支持向量机(svm)原理
支持向量机(supportvectormachines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。
由简至繁的模型包括:
当训练样本线性可分时,通过硬间隔最大化,学习一个线性可分支持向量机;
当训练样本近似线性可分时,通过软间隔最大化,学习一个线性支持向量机;
当训练样本线性不可分时,通过核技巧和软间隔最大化,学习一个非线性支持向量机;
2)间隔最大化
如果一个线性函数能够将样本分开,称这些数据样本是线性可分的。
那么什么是线性函数呢?
其实很简单,在二维空间中就是一条直线,在三维空间中就是一个平面,以此类推,如果不考虑空间维数,这样的线性函数统称为超平面。
我们看一个简单的二维空间的例子,O代表正类,X代表负类,样本是线性可分的,但是很显然不只有这一条直线可以将样本分开,而是有无数条,我们所说的线性可分支持向量机就对应着能将数据正确划分并且间隔最大的直线。
图1支持向量机原理图
3)SMO算法
通过将原问题分解为一系列小规模凸二次规划问题而获得原问题解的方法,每次迭代只优化由2个点组成的工作集,SMO算法每次启发式地选择两个拉格朗日乘子同时固定其它拉格朗日乘子来找到这两个拉格朗日乘子的最优值,直到达到停止条件。
其已成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。
4)SMO算法实现流程图:
图2SMO算法实现流程图
3.编程要求
输入一个数据集,其中有10个特征列,一个标签列。
本次是二分类,因此标签只有1和-1两个标签值。
输出为每一次迭代后的相关信息,最终得到最终分类结果图。
4.解题思路
1)导入实现算法的包
importmatplotlib.pyplotasplt#数据可视化时使用
importnumpyasnp#数学处理时使用
importrandom#产生随机数
2)读取文件数据函数实现
defloadDataSet(fileName):
dataMat=[];labelMat=[]
fr=open(fileName)
#逐行读取,滤除空格等
forlineinfr.readlines():
lineArr=line.strip().split('\t')
#添加数据
dataMat.append([float(lineArr[0]),float(lineArr[1])])
#添加标签
labelMat.append(float(lineArr[2]))
returndataMat,labelMat
3)随机选择变量alpha函数实现
"""
函数说明:
随机选择alpha
Parameters:
i-alpha_i的索引值
m-alpha参数个数
Returns:
j-alpha_j的索引值
"""
defselectJrand(i,m):
j=i#选择一个不等于i的j
while(j==i):
j=int(random.uniform(0,m))#uniform()方法将随机生成下一个实数,它在[x,y)范围内。
returnj
selectJrand(0,10)
4)处理边界L,H的值的函数实现
"""
函数说明:
修剪alpha
Parameters:
aj-alpha_j值
H-alpha上限
L-alpha下限
Returns:
aj-alpah值
"""
defclipAlpha(aj,H,L):
ifaj>H:
aj=H
ifL>aj:
aj=L
returnaj
5)简化版SMO算法实现
需要用到的公式:
a.计算误差函数:
b.计算eta:
c.计算阀值b:
代码实现:
"""
函数说明:
简化版SMO算法
Parameters:
dataMatIn-数据矩阵
classLabels-数据标签
C-松弛变量
toler-容错率
maxIter-最大迭代次数
Returns:
无
"""
defsmoSimple(dataMatIn,classLabels,C,toler,maxIter):
#转换为numpy的mat存储
dataMatrix=np.mat(dataMatIn);
#transpose():
转置
labelMat=np.mat(classLabels).transpose()
#初始化b参数
b=0;
#统计dataMatrix的维度
m,n=np.shape(dataMatrix)
#初始化alpha参数,设为0,alphas为m行1列值为0的矩阵
alphas=np.mat(np.zeros((m,1)))
#初始化迭代次数
iter_num=0
#最多迭代matIter次
while(iter_num alphaPairsChanged=0 foriinrange(m): #步骤1: 计算误差Ei fXi=float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,: ].T))+b Ei=fXi-float(labelMat[i]) #优化alpha,设定一定的容错率。 if((labelMat[i]*Ei<-toler)and(alphas[i] #随机选择另一个与alpha_i成对优化的alpha_j j=selectJrand(i,m) #步骤1: 计算误差Ej fXj=float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,: ].T))+b Ej=fXj-float(labelMat[j]) #保存更新前的aplpha值,使用深拷贝 alphaIold=alphas[i].copy();alphaJold=alphas[j].copy(); #步骤2: 计算上下界L和H 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]) ifL==H: print("L==H");continue #步骤3: 计算eta eta=2.0*dataMatrix[i,: ]*dataMatrix[j,: ].T-dataMatrix[i,: ]*dataMatrix[i,: ].T-dataMatrix[j,: ]*dataMatrix[j,: ].T ifeta>=0: print("eta>=0");continue #步骤4: 更新alpha_j alphas[j]-=labelMat[j]*(Ei-Ej)/eta #步骤5: 修剪alpha_j alphas[j]=clipAlpha(alphas[j],H,L) if(abs(alphas[j]-alphaJold)<0.00001): print("alpha_j变化太小");continue #步骤6: 更新alpha_i alphas[i]+=labelMat[j]*labelMat[i]*(alphaJold-alphas[j]) #步骤7: 更新b_1和b_2 b1=b-Ei-labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,: ]*dataMatrix[i,: ].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,: ]*dataMatrix[j,: ].T b2=b-Ej-labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,: ]*dataMatrix[j,: ].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,: ]*dataMatrix[j,: ].T #步骤8: 根据b_1和b_2更新b if(0 b=b1 elif(0 b=b2 else: b=(b1+b2)/2.0 #统计优化次数 alphaPairsChanged+=1 #打印统计信息 print("第%d次迭代样本: %d,alpha优化次数: %d"%(iter_num,i,alphaPairsChanged)) #更新迭代次数 if(alphaPairsChanged==0): iter_num+=1 else: iter_num=0 print("迭代次数: %d"%iter_num) returnb,alphas 6)分类结果可视化函数实现 """ 函数说明: 分类结果可视化 Parameters: dataMat-数据矩阵 w-直线法向量 b-直线解决 Returns: 无 """ defshowClassifer(dataMat,w,b): #绘制样本点 data_plus=[]#正样本 data_minus=[]#负样本 foriinrange(len(dataMat)): iflabelMat[i]>0: data_plus.append(dataMat[i]) else: data_minus.append(dataMat[i]) data_plus_np=np.array(data_plus)#转换为numpy矩阵 data_minus_np=np.array(data_minus)#转换为numpy矩阵 plt.scatter(np.transpose(data_plus_np)[0],np.transpose(data_plus_np)[1],s=30,alpha=0.7)#正样本散点图 plt.scatter(np.transpose(data_minus_np)[0],np.transpose(data_minus_np)[1],s=30,alpha=0.7)#负样本散点图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完美 排版 基于 Python 实现 支持 向量 课程设计