支持向量机是一种强大且广泛应用的机器学习算法,可以将其看作感知器的延申。感知器算法的目标是把分类误差减少到最小。而支持向量机算法优化的目标是寻找最大化的边界。边界定义为分离超平面(决策边界)与其最近的训练样本之间的距离,即所谓支持向量。接下来用sklearn训练一个支持向量机模型来对鸢尾花数据集中的不同种花进行分类
from sklearn.svm import SVC
svm=SVC(kernel='linear',C=1.0,random_state=1)
svm.fit(X_train_std,y_train)
plot_decision_regions(X_combined_std,
y_combined,
classifier=svm,
test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()
在实际的分类任务中,线性逻辑回归与线性支持向量机通常会产生非常相似的结果。逻辑回归试图最大化训练数据的条件似然性,使其比svm更容易离群,支持向量机主要关心的是最接近决策边界的点。逻辑回归更容易实现,更容易更新,这在处理流式数据中很有吸引力。
其他的sklearn实现
当数据太多时
from sklearn.linear_model import SGDClassifier
ppn= SGDClassifier(loss='percetron')
lr= SGDClassifier(loss='log')
svm= SGDClassifier(loss='hinge')
用核支持向量机解决非线性问题
支持向量机在机器学习享有高知名度的一个原因是容易通过核化来解决非线性分类问题
执行以下代码会产生具有随机噪声的XOR数据集:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor=np.random.randn(200,2)#200行2列的数据
y_xor=np.logical_xor(X_xor[:,0]>0,
X_xor[:,1]>0)
y_xor=np.where(y_xor,1,-1)
plt.scatter(X_xor[y_xor==1,0],
X_xor[y_xor==1,1],
c='b',marker='x',
label='1')
plt.scatter(X_xor[y_xor==-1,0],
X_xor[y_xor==-1,1],
c='r',
marker='s',
label='-1')
plt.ylim([-3,3])
plt.xlim([-3,3])
plt.legend(loc='best')
plt.show()
显然不能用线性模型来分隔样品的正类和负类。
核方法的逻辑是针对线性不可分数据,建立非线性组合,通过一个映射函数把原始特征投影到一个高维空间,特征在该空间变得线性可分
接下来训练核支持向量机来划出非线性决策边界。
from sklearn.svm import SVC
svm=SVC(kernel='rbf',random_state=1,gamma=0.10,C=10.0)
svm.fit(X_xor,y_xor)
plot_decision_regions(X_xor,y_xor,classifier=svm)
plt.legend(loc='upper left')
plt.show()
参数gamma可以理解为高斯球的截止参数。增大gamma值,将增大训练样本的影响范围,导致决策边界紧缩和波动。选择较小的gamma值,得到的决策边界相对偏松(γ=0.01的情况)
采用较大的gamma值,决策边界会更加紧密。这种分类器在未见过的数据上可能有很高的泛性误差。说明gamma在控制过拟合问题上也有很重要的作用。