完美排版基于Python实现的支持向量机课程设计文档格式.docx
《完美排版基于Python实现的支持向量机课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《完美排版基于Python实现的支持向量机课程设计文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
我们看一个简单的二维空间的例子,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)#负样本散点图