美文网首页
机器学习之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