支持向量机学习

SVM分类器是二元或判别模型,最基础任务是判断新观测数据属于两个类别中哪一个
这类分类器将训练数据映射到决策空间的多维空间,创建决策边界的分离面你,最简单线性可分的情况下,决策边界可以用平面3D或直线2D表示,
更复杂的分离面为曲面
SVM算法既可用于回归问题如SVR支持向量回归,也可用于分类SVC支持向量分类

支持向量分类SVC

'''
先做一个简单的二维空间线性分类问题,训练集包含11个数据点,取值范围为0-4,存储在x中
分为两个类别,0或1表示,存储在y中
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
x=np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],
           [2,1],[3,1],[3,2],[3.5,1],[3.5,3]])
y=[0]*6+[1]*5
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

'''
使用SVC算法进行训练,先用SVC()构造函数定义模型,在这里使用线性内核
然后调用fit()函数,传入训练集作为参数
训练完成后用decision_function()函数绘制决策边界
'''
svc=svm.SVC(kernel='linear').fit(x,y)
X,Y=np.mgrid[0:4:200j,0:4:200j] #mgrid的第三个参数Xj数值越大,表明区间分的越细
Z=svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z>0,alpha=0.4)
plt.contour(X,Y,Z,colors=['k'],linestyles=['-'],levels=[0])
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

#predict()函数将会以数值形式返回数据点所属类别
svc.predict([[1.5,2.5]])
array([0])
svc.predict([[2.5,1]])
array([1])
#正则化用参数c来设置,c值较小,说明泛化能力强,c越大,说明泛化能力弱,默认c为1
#可以通过support_vectors数组获取到参与计算间隔的数据点,为其添加高亮
svc=svm.SVC(kernel='linear',C=1).fit(x,y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z=svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z>0,alpha=0.4)
plt.contour(X,Y,Z,colors=['k','k','k'],linestyles=['--','-','--'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120,facecolors='k')
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

参与计算间隔的数据点数量取决于参数C

#为了理解c对决策边界的影响,我们测试c=0.1时的情况
svc=svm.SVC(kernel='linear',C=0.1).fit(x,y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z=svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z>0,alpha=0.4)
plt.contour(X,Y,Z,colors=['k','k','k'],linestyles=['--','-','--'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120,facecolors='k')
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

非线性SVC

'''
这里选取多项式曲线将决策空间分成两块
其中多项式的次数用degree选项指定
'''
svc=svm.SVC(kernel='poly',C=1,degree=3).fit(x,y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z=svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z>0,alpha=0.4)
plt.contour(X,Y,Z,colors=['k','k','k'],linestyles=['--','-','--'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120,facecolors='k')
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

'''
另一种非线性内核为竞相基函数(Radial Basis Function,RBF)
这种内核生成的分割面尝试把数据集的各个数据点分到沿径向方向分布的不同区域
'''
svc=svm.SVC(kernel='rbf',C=1,gamma=3).fit(x,y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z=svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z>0,alpha=0.4)
plt.contour(X,Y,Z,colors=['k','k','k'],linestyles=['--','-','--'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120)
plt.scatter(x[:,0],x[:,1],c=y,s=50,alpha=0.9)

这里写图片描述

利用SVM分类器对Iris数据集进行分类

'''
已知IRIS数据集有三种分类,决策边界会互相交叉
'''
#首先观察线性决策边界(相交的超平面)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm,datasets
iris=datasets.load_iris()
x=iris.data[:,:2]
y=iris.target

svc=svm.SVC(kernel='linear',C=1.0).fit(x,y)
x_min,x_max=x[:,0].min()-.5,x[:,0].max()+.5
y_min,y_max=x[:,1].min()-.5,x[:,1].max()+.5
h=.02
X,Y=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))

Z=svc.predict(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z,alpha=0.4)
plt.contour(X,Y,Z,colors='k')
plt.scatter(x[:,0],x[:,1],c=y)

这里写图片描述

#使用非线性内核,多项式内核

svc=svm.SVC(kernel='poly',C=1.0,degree=3).fit(x,y)
x_min,x_max=x[:,0].min()-.5,x[:,0].max()+.5
y_min,y_max=x[:,1].min()-.5,x[:,1].max()+.5
h=.02
X,Y=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))
Z=svc.predict(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z,alpha=0.4)
plt.contour(X,Y,Z,colors='k')
plt.scatter(x[:,0],x[:,1],c=y)

这里写图片描述

#使用RBF内核
svc=svm.SVC(kernel='rbf',gamma=3,C=1.0).fit(x,y)
x_min,x_max=x[:,0].min()-.5,x[:,0].max()+.5
y_min,y_max=x[:,1].min()-.5,x[:,1].max()+.5
h=.02
X,Y=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))
Z=svc.predict(np.c_[X.ravel(),Y.ravel()])
Z=Z.reshape(X.shape)
plt.contourf(X,Y,Z,alpha=0.4)
plt.contour(X,Y,Z,colors='k')
plt.scatter(x[:,0],x[:,1],c=y)

这里写图片描述

支持向量回归SVR

SVC的生成模型实际上并没有使用全部训练集数据,而是使用决策边界最近的数据点
类似的,SVR也只依赖于部分训练数据

'''
在这里使用Diabetes数据集
只考虑第三个生理数据(体质指数)
使用三种不同回归算法:线性和两个非线性(多项式)
分别采用线性内核和多项式内核
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import datasets
diabetes=datasets.load_diabetes()
x_train=diabetes.data[:-20]
y_train=diabetes.target[:-20]
x_test=diabetes.data[-20:]
y_test=diabetes.target[-20:]
x0_test=x_test[:,2]
x0_train=x_train[:,2]
x0_test=x0_test[:,np.newaxis]
x0_train=x0_train[:,np.newaxis]
x0_test.sort(axis=0)
x0_test=x0_test*100
x0_train=x0_train*100
svr=svm.SVR(kernel='linear',C=1000)
svr2=svm.SVR(kernel='poly',C=1000,degree=2)
svr3=svm.SVR(kernel='poly',C=1000,degree=3)
svr.fit(x0_train,y_train)
SVR(C=1000, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
  kernel='linear', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
svr2.fit(x0_train,y_train)
SVR(C=1000, cache_size=200, coef0=0.0, degree=2, epsilon=0.1, gamma='auto',
  kernel='poly', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
svr3.fit(x0_train,y_train)
SVR(C=1000, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
  kernel='poly', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
y=svr.predict(x0_test)
y2=svr2.predict(x0_test)
y3=svr3.predict(x0_test)
plt.scatter(x0_test,y_test,color='k')
plt.plot(x0_test,y,color='b')
plt.plot(x0_test,y2,color='r')
plt.plot(x0_test,y3,c='g')

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值