完美排版基于Python实现的支持向量机课程设计文档格式.docx

上传人:b****4 文档编号:14048926 上传时间:2022-10-17 格式:DOCX 页数:10 大小:152.69KB
下载 相关 举报
完美排版基于Python实现的支持向量机课程设计文档格式.docx_第1页
第1页 / 共10页
完美排版基于Python实现的支持向量机课程设计文档格式.docx_第2页
第2页 / 共10页
完美排版基于Python实现的支持向量机课程设计文档格式.docx_第3页
第3页 / 共10页
完美排版基于Python实现的支持向量机课程设计文档格式.docx_第4页
第4页 / 共10页
完美排版基于Python实现的支持向量机课程设计文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

完美排版基于Python实现的支持向量机课程设计文档格式.docx

《完美排版基于Python实现的支持向量机课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《完美排版基于Python实现的支持向量机课程设计文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

完美排版基于Python实现的支持向量机课程设计文档格式.docx

我们看一个简单的二维空间的例子,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

aj-alpha_j值

H-alpha上限

L-alpha下限

aj-alpah值

defclipAlpha(aj,H,L):

ifaj>

H:

aj=H

ifL>

aj:

aj=L

returnaj

5)简化版SMO算法实现

需要用到的公式:

a.计算误差函数:

b.计算eta:

c.计算阀值b:

代码实现:

简化版SMO算法

dataMatIn-数据矩阵

classLabels-数据标签

C-松弛变量

toler-容错率

maxIter-最大迭代次数

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<

maxIter):

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]<

C))or((labelMat[i]*Ei>

toler)and(alphas[i]>

0)):

#随机选择另一个与alpha_i成对优化的alpha_j

j=selectJrand(i,m)

计算误差Ej

fXj=float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:

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:

eta>

=0"

#步骤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):

alpha_j变化太小"

#步骤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,:

].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:

b2=b-Ej-labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:

].T-labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:

#步骤8:

根据b_1和b_2更新b

if(0<

alphas[i])and(C>

alphas[i]):

b=b1

elif(0<

alphas[j])and(C>

alphas[j]):

b=b2

b=(b1+b2)/2.0

#统计优化次数

alphaPairsChanged+=1

#打印统计信息

print("

第%d次迭代样本:

%d,alpha优化次数:

%d"

%(iter_num,i,alphaPairsChanged))

#更新迭代次数

if(alphaPairsChanged==0):

iter_num+=1

iter_num=0

迭代次数:

%d"

%iter_num)

returnb,alphas

6)分类结果可视化函数实现

分类结果可视化

dataMat-数据矩阵

w-直线法向量

b-直线解决

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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1