目录
1、支持向量机介绍
2、问题描述
3、SVM操作
3.1 sklearn.svm.SVC 参数说明
3.2 代码实现
支持向量机(Support Vector Machine,SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,是一个最大间隔分类器(Max Margin Classifier), 是最有效的监督学习方法之一, 经常被作为文本处理方法的一个强基准模型(strong baseline)。其基本模型是定义在特征空间上的间隔最大的线性分类器。SVM算法还包括核函数,核函数可以使它成为非线性分类器。
由于SVM是一类对数据进行二元分类,即将平面分划为两部分,并用正类和负类进行分类标记。若用直线把平面分成两部分,就要找一条直线;若用曲线进行分类,则需找到一条曲线。
我们知道,在线性可分的情况下,有无穷多个满足条件的超平面,但哪个最好呢?SVM用线性分类器的间隔(Margin)进行评定,间隔越大,说明分类效果越好。在分类界面两侧分别放置平行于分类超平面的一个超平面,平行移动超平面,当他们各自第一次碰到数据点时,他们之间的距离就被称为线性分类器的间隔。
由于 SVM 数学原理较复杂,且SVM算法本身的实现也非常复杂,因此在实际问题中,SVM的实现是直接用sklearn库。
语法结构:sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
主要调节的参数有:C、kernel、degree、gamma、coef0
C:C-SVC的惩罚参数C,默认值是1.0。C越大,对误分类的惩罚越大,训练集测试的准确率就越高,但泛化能力弱。C值越小,对误分类的惩罚减小,允许容错,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
linear:线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。
poly:多项式核函数,多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。
rbf:高斯核函数(默认),高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。
sigmoid:sigmoid 核函数,sigmoid 经常用在神经网络的映射中。因此当选用 sigmoid 核函数时,SVM 实现的是多层神经网络。
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0:核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
# 创建 40 个点,要求线性可分
np.random.seed(0) # 保证生成的随机数不变
# np._r表示将矩阵在行方向上进行相连、random.randn(a,b)表示生成a行b列的矩阵,且随机数服从标准正态分布
# array(20,2)-[2,2]相当于给每一行的两个数都减去 2
X= np.r_[np.random.randn(20,2)-[2,2], np.random.randn(20,2)+[2,2]] #array(20,2)-[2,2]相当于给坐标值都减去2,加减2的原因是将数据分开,更好分别
Y=[0]*20+[1]*20 #用0和1用于后续对两类数据进行标签
#调用svm计算w和b
clf=svm.SVC(kernel='linear')
clf.fit(X,Y)
# y=-(w0/w1)x-(b/w1)
w=clf.coef_[0] # w是一个二维数据,coef就是w=[w0,w1]
a=-w[0]/w[1] # 斜率
xx=np.linspace(-5,5) #从-5到5随机的产生一些连续的值
yy=a*xx-(clf.intercept_[0])/w[1] # .intercept[0]获取b的值,b/w[1]是截距用来获得截距(这里共有两个值,分别为到x轴和到y轴的截距)
# 画出和划分超平面平行且经过支持向量的两条线(斜率相同,截距不同)
b=clf.support_vectors_[0] # 取出第一个支持向量点
yy_down=a*xx+(b[1]-a*b[0])
b=clf.support_vectors_[-1] # 取出最后一个支持向量点
yy_up=a*xx+(b[1]-a*b[0])
# 查看相关的参数值
print("w: ",w)
print("a: ",a)
print("support_vectors_: ", clf.support_vectors_)
print("clf.coef_: ", clf.coef_)
# 在 scikit-learin 中,coef_ 保存了线性模型中划分超平面的参数向量。形式为(n_classes, n_features)。若 n_classes > 1,则为多分类问题,(1,n_features) 为二分类问题。
# 绘制划分超平面,边际平面和样本点
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')
# 圈出支持向量
pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=80, facecolors='none')
pl.scatter(X[:,0], X[:,1],c=Y)
pl.axis('tight')
pl.show()
运行结果
sklearn学习网站:sklearn中文文档
本文仅供学习交流