您的位置:首页 > 其它

支持向量机——sklearn 实现支持向量机(SVM)

2018-04-01 16:58 281 查看
《Python machine learning》书籍学习~~~
支持向量机的数学模型稍后补上,先来讲一下sklearn中的实现。
Support Vector Machine(SVM) ,优化目标与感知机相反,感知机是实现错误的最小优化;SVM实现边缘最大优化。
边缘(margin):两个分离差超平面之间的距离
支持向量(support vector):距离分割超平面最近的训练样本点



SVM的数学模型稍后补上。

SVC:SVM的一种类型,用于分类;SVR用于回归。

【sklearn库实现SVM】

调用sklearn.svm库中的SVC类。其中C参数是惩罚松弛变量。
C值越大,表示对误分类的惩罚增大,趋向于对于训练集全部正确分类,泛化能力弱。
C值越小,表示可以容忍错误分类,泛化能力强。from sklearn.svm import SVC
svm = SVC(kernel = 'linear', C = 1.0, random_state = 1)
svm.fit(X_combined_std, y_combined)
plot_decision_regions(X = X_combined_std,
y = 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.tight_layout()
#plt.savefig('images/03_06.png', dpi=300)
plt.show()


【解决极大数据集的 SGDClassifier】

perceptron ,LogisticRegression来自于liblinear库,svc来自于libsvm库,这两个库对于大量的线性分类器允许进行极其快速的训练。 但是如果训练数据极其大,  sklearn库提供了SGDclassifier 类,即stochastic gradient descent classifier(随机梯度递减)。可以分别用perceptron,LR,SVM初始化SGDClassifier,loss参数表示损失函数选项,可选择不同分类器的损失函数。



例如:from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss = 'perceptron')
lr = SGDClassifier(loss = 'log')#LogisticRegression
svm = SGDClassifier(loss = 'hinge')

【kernel methods  for linearly inseparable data】

#利用异或构造线性不可分数据集
#inlinear dataset
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor = np.random.randn(200, 2)
#logical_xor(X1,X2)函数,返回   x1逻辑异或x2的结果
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.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()



#利用kernel methods 分类数据集kernel methods  即将二维非线性数据转换为三维可分数据集,利用下列φ函数


定义kernel function为:


其中比较常用的为radial basic function (RBF)也称为高斯kernel(Gaussian kenel)   


常写作

,其中

。svc = SVC(kernel ='rbf', C = 10.0, gamma =0.1, random_state = 1 )
svc.fit(X_xor, y_xor)
plot_decision_regions(X= X_xor, y = y_xor, classifier = svc)
plt.legend(loc = 'best')
plt.show()其中gamma参数越大,分离超平面越严格,但是泛化能力越弱。所以gamma函数的调整是调整泛华能力的关键。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: