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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。