美文网首页
机器学习之SVM支持向量机(二)

机器学习之SVM支持向量机(二)

作者: 谓之小一 | 来源:发表于2018-04-07 11:51 被阅读34次

由于较多公式,所以我将部分内容转为图片进行上传,请见谅。清晰版请访问https://weizhixiaoyi.com查看,你也可以关注我公众号‘谓之小一’,后台直接向我要pdf版本,如有相关问题直接后台询问,随时回答。

1.知识回顾

机器学习之SVM支持向量机(一)中我们介绍了SVM损失函数最大间隔分类为什么SVM能形成最大间隔分类器核函数SVM中Gaussian Kernel的使用知识点。上文我们从Logistic Regression损失函数中推出SVM损失函数,本篇文章我们将更加直观的分析得到SVM损失函数、如何求解SVM对偶问题、如何解决outliers点,并且最终利用sklearn实现SVM。

2.函数间隔和几何间隔

机器学习之SVM支持向量机(二)公式01.png 机器学习之SVM支持向量机(二)图像01.png 机器学习之SVM支持向量机(二)公式02.png 机器学习之SVM支持向量机(二)图像02.png 机器学习之SVM支持向量机(二)公式03.png

3.原始问题到对偶问题的求解

机器学习之SVM支持向量机(二)公式04.png 机器学习之SVM支持向量机(二)公式05.png 机器学习之SVM支持向量机(二)公式06.png 机器学习之SVM支持向量机(二)公式07.png 机器学习之SVM支持向量机(二)公式08.png

4.松弛变量处理outliers方法

实际项目中会有数据点含有噪音,即偏离正常位置很远的数据点,我们称之为outlier。

机器学习之SVM支持向量机(二)图像03.png

为了处理这种情况,SVM允许在一定程度上偏离一下超平面。为此我们稍加改变以前的约束条件,即

机器学习之SVM支持向量机(二)公式09.png

分析方法和前面相同,此处不再赘述。结合机器学习之SVM支持向量机(一)中的描述我们便能更好的理解C的作用和为什么C通常设置的都较大。

5.Sklearn实现SVM支持向量机

我们常用到的核函数包括线性核、多项式核、高斯核、sigmoid核。在机器学习之SVM支持向量机(一)中我们已经利用高斯核详细介绍了核函数的意义,所以不再利用其他核函数举例,有兴趣的同学可以去(一)中看详细内容。此处我们给出线性核和多项式核函数的代码,并使用了少量数据绘制出图形。因SVM选取核函数会涉及到较多内容,介于篇幅有限,不再这篇文章中解释,后续会详细写篇SVM核函数的应用

5.1线性

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
x=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]#正态分布产生数字20行2列
y=[0]*20+[1]*20#20个class0,20个class1
clf=svm.SVC(kernel='linear')#使用线性核
clf.fit(x,y)
w=clf.coef_[0]#获取w
a=-w[0]/w[1]#斜率

#画图
xx=np.linspace(-5,5)
yy=a*xx-(clf.intercept_[0])/w[1]
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])
plt.figure(figsize=(8,4))
plt.plot(xx,yy)
plt.plot(xx,yy_down)
plt.plot(xx,yy_up)
plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80)
plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.Paired)
plt.axis('tight')
plt.show()
机器学习之SVM支持向量机(二)图像05.png

5.2非线性

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import  Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
X, y = make_moons( n_samples=100, noise=0.15, random_state=42 )

def plot_dataset(X, y, axes):
    plt.plot( X[:,0][y==0], X[:,1][y==0], "bs" )
    plt.plot( X[:,0][y==1], X[:,1][y==1], "g^" )
    plt.axis( axes )
    plt.grid( True, which="both" )
    plt.xlabel(r"$x_l$")
    plt.ylabel(r"$x_2$")

# contour函数是画出轮廓,需要给出X和Y的网格,以及对应的Z,它会画出Z的边界(相当于边缘检测及可视化)
def plot_predict(clf, axes):
    x0s = np.linspace(axes[0], axes[1], 100)
    x1s = np.linspace(axes[2], axes[3], 100)
    x0, x1 = np.meshgrid( x0s, x1s )
    X = np.c_[x0.ravel(), x1.ravel()]
    y_pred = clf.predict( X ).reshape( x0.shape )
    y_decision = clf.decision_function( X ).reshape( x0.shape )
    plt.contour( x0, x1, y_pred, cmap=plt.cm.winter, alpha=0.5 )
    plt.contour( x0, x1, y_decision, cmap=plt.cm.winter, alpha=0.2 )

polynomial_svm_clf = Pipeline([ ("poly_featutres", PolynomialFeatures(degree=3)),
                                ("scaler", StandardScaler()),
                                ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42)  )
                            ])#多项式核函数
polynomial_svm_clf.fit( X, y )
plot_dataset( X, y, [-1.5, 2.5, -1, 1.5] )
plot_predict( polynomial_svm_clf, [-1.5, 2.5, -1, 1.5] )
plt.show()
机器学习之SVM支持向量机(二)图像06.png

6.推广

更多内容请关注公众号’谓之小一’,若有疑问可在公众号后台提问,随时回答,欢迎关注,内容转载请注明出处。

机器学习之SVM支持向量机(二)图片推广.png

相关文章

网友评论

      本文标题:机器学习之SVM支持向量机(二)

      本文链接:https://www.haomeiwen.com/subject/cxxyhftx.html