Python 支持向量机分类器的实现
支持向量机(SupportVectorMachine,SVM)是一类按监督学习(supervisedlearning)方式对数据进行二元分类的广义线性分类器(generalizedlinearclassifier),其决策边界是对学习样本求解的最大边距超平面(maximum-marginhyperplane)
SVM使用铰链损失函数(hingeloss)计算经验风险(empiricalrisk)并在求解系统中加入了正则化项以优化结构风险(structuralrisk),是一个具有稀疏性和稳健性的分类器。SVM可以通过核方法(kernelmethod)进行非线性分类,是常见的核学习(kernellearning)方法之一。
SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(patternrecognition)问题中有得到应用。
importnumpyasnp
fromscipyimportioasspio
frommatplotlibimportpyplotasplt
fromsklearnimportsvm
defSVM():
'''data1——线性分类'''
data1=spio.loadmat('data1.mat')
X=data1['X']
y=data1['y']
y=np.ravel(y)
plot_data(X,y)
model=svm.SVC(C=1.0,kernel='linear').fit(X,y)#指定核函数为线性核函数
plot_decisionBoundary(X,y,model)#画决策边界
'''data2——非线性分类'''
data2=spio.loadmat('data2.mat')
X=data2['X']
y=data2['y']
y=np.ravel(y)
plt=plot_data(X,y)
plt.show()
model=svm.SVC(gamma=100).fit(X,y)#gamma为核函数的系数,值越大拟合的越好
plot_decisionBoundary(X,y,model,class_='notLinear')#画决策边界
#作图
defplot_data(X,y):
plt.figure(figsize=(10,8))
pos=np.where(y==1)#找到y=1的位置
neg=np.where(y==0)#找到y=0的位置
p1,=plt.plot(np.ravel(X[pos,0]),np.ravel(X[pos,1]),'ro',markersize=8)
p2,=plt.plot(np.ravel(X[neg,0]),np.ravel(X[neg,1]),'g^',markersize=8)
plt.xlabel("X1")
plt.ylabel("X2")
plt.legend([p1,p2],["y==1","y==0"])
returnplt
#画决策边界
defplot_decisionBoundary(X,y,model,class_='linear'):
plt=plot_data(X,y)
#线性边界
ifclass_=='linear':
w=model.coef_
b=model.intercept_
xp=np.linspace(np.min(X[:,0]),np.max(X[:,0]),100)
yp=-(w[0,0]*xp+b)/w[0,1]
plt.plot(xp,yp,'b-',linewidth=2.0)
plt.show()
else:#非线性边界
x_1=np.transpose(np.linspace(np.min(X[:,0]),np.max(X[:,0]),100).reshape(1,-1))
x_2=np.transpose(np.linspace(np.min(X[:,1]),np.max(X[:,1]),100).reshape(1,-1))
X1,X2=np.meshgrid(x_1,x_2)
vals=np.zeros(X1.shape)
foriinrange(X1.shape[1]):
this_X=np.hstack((X1[:,i].reshape(-1,1),X2[:,i].reshape(-1,1)))
vals[:,i]=model.predict(this_X)
plt.contour(X1,X2,vals,[0,1],color='blue')
plt.show()
if__name__=="__main__":
SVM()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。