本文是基于python第三方库sklearn官方文档
官方文档
首先关于SVM的概念以及大体了解可以参考此篇博文,这里推荐给大家,作者写的很详细,很透彻 。支持向量机通俗导论
1.SVM
SVM英文全称Support Vector Mechine,叫做支持向量机,是一种有监督学习方法,可用于分类,回归,及outlier的检测
SVM的核心即是核函数,核函数是计算两个向量在隐式映射后的空间中的内积函数将核函数形式化定义,如果原始特征内积是,映射后为
,定义核函数为
常见的核函数有
线性核函数:
高斯核函数:
多项式核函数:
2.程序实现
前面讲了一些函数,那么这些核函数在用于分类时效果会是如何呢?接下来就是这多个核函数的分类效果比较及程序实现。
2.1数据的选择
这里我选择的数据是iris(鸢尾花数据集),是sklearn库中自带数据集,网上也可下载。其是150*4,样本数是150,每个样本有4个特征,有3种类别。本例中将选取全部150个样本,特征选择为前两个
2.2数据的读取
以下是对sklearn中的iris数据集进行读取的代码实现
import numpy as np
from sklearn import datasets
iris=datasets.load_iris()
X=iris.data[:,:2] #train set
y=iris.target #target set
注:对于数据集的读入可自行网上搜索相关知识,这里为方便用已存在函数进行了数据读取。
2.3数据集的可视化
得到了数据集,将每个点在图中显式的表达出来,观察分布状况
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
#plt.scatter(X[:,0],X[:,1],c=y)#画出每个样本点,不同颜色表示不同类别
#plt.show()
2.4核函数的应用
接下来分别将采用线性核,高斯核,多项式核进行数据集的分类
将用到svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto’, …..)
C:误差项惩罚系数,默认为1
kernel:核函数类型,默认为‘rbf’
高斯核:’rbf’ ,参数gamma会对其产生影响
多项式核:‘poly’ ,参数gamma和degree会对其产生影响
线性核: ‘linear’
其余参数可参见官方文档
from sklearn import svm
#classifier configuration
clf_lin=svm.SVC(C=1.0,kernel='linear').fit(X,y)
clf_rbf=svm.SVC(C=1.0,kernel='rbf',gamma=0.7).fit(X,y)
clf_ply=svm.SVC(C=1.0,kernel='poly',degree=3).fit(X,y)
clfs=[clf_lin,clf_rbf,clf_ply]
#build up mehsgrid
h=0.02
X_min,X_max=X[:,0].min()-1,X[:,0].max()+1
Y_min,Y_max=X[:,1].min()-1,X[:,1].max()+1
XX,YY=np.meshgrid(np.arange(X_min,X_max,h),
np.arange(Y_min,Y_max,h))
titles=['linear kernel','rbf kernel','poly kernel']
for i,clf in enumerate(clfs):
#prdecit the contour position
z=clf.predict(np.c_[XX.ravel(),YY.ravel()])
z=z.reshape(XX.shape)
#plot the points and contour
subplot(2,2,i+1)
plt.scatter(X[:,0],X[:,1],c=y)
plt.contour(XX,YY,z,cmap=plt.cm.Paired)
#decorate the figure
plt.xlabel('X_axis')
plt.ylabel('Y_axis')
plt.xtick(())
plt.xtick(())
plt.title(titles[i])
plt.show()
运行结果如下
贴上完整代码
import numpy as np
from sklearn import datasets
from sklearn import svm
import matplotlib.pyplot as plt
#load iris datasets
iris=datasets.load_iris()
X=iris.data[:,:2] #train set
y=iris.target #target set
plt.figure(figsize=(8,8))
#classifier configuration
clf_lin=svm.SVC(C=1.0,kernel='linear').fit(X,y) #linear kernel
clf_rbf=svm.SVC(C=1.0,kernel='rbf',gamma=0.7).fit(X,y) #rbf kernel
clf_ply=svm.SVC(C=1.0,kernel='poly',degree=3).fit(X,y) #poly kernel
clfs=[clf_lin,clf_rbf,clf_ply]
#build up mehsgrid
h=0.02
X_min,X_max=X[:,0].min()-1,X[:,0].max()+1
Y_min,Y_max=X[:,1].min()-1,X[:,1].max()+1
XX,YY=np.meshgrid(np.arange(X_min,X_max,h),np.arange(Y_min,Y_max,h))
title=['linear kernel','rbf kernel','poly kernel']
#plot the hyperplane
for i,clf in enumerate(clfs):
z=clf.predict(np.c_[XX.ravel(),YY.ravel()])
z=z.reshape(XX.shape)
plt.subplots_adjust(wspace=0.4, hspace=0.4)
plt.subplot(2,2,i+1)
plt.scatter(X[:,0],X[:,1],c=y)
plt.contour(XX,YY,z,cmap=plt.cm.Paired)
#decorate the figure
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title(title[i])
plt.xticks(())
plt.yticks(())
plt.show()
以上就是对svm作为分类器时在不同核函数下的结果,欢迎大家一起交流学习