浅谈支持向量机(Support Vector Machine)

Posted 追梦程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈支持向量机(Support Vector Machine)相关的知识,希望对你有一定的参考价值。

自从在学校安定下来后,小编的学习效率和时长提高了不少。在最近五天的时间里,看了大约20节视频并做了对应章节的编程练习。

上一篇文章介绍了的知识,这次给小伙伴们介绍下支持向量机的知识。

支持向量机和逻辑回归(Logistic Regression)很相像,从一方面看,支持向量机是逻辑回归的变化版。其重要的区别在于损失函数的不同。

(细线是逻辑回归的损失函数图像,粗线是支持向量机的损失函数图像)


如果数据是线性可分(能通过一条直线将不同类别区分开来),支持向量机看起来就是和逻辑回归使用了不同但很相似的损失函数,往往这两个分类器的效果也差不多。

如果数据不是线性可分的,支持向量机就要借助一个名叫“核函数”的东西来构造非线性边界。核函数是用来衡量两个向量的相似度,如果两个向量的相似度越高,核函数的返回值越大。

常见的核函数有如下几种:

    1.线性内核:表示支持向量机不借助核函数来分类。

    2.高斯内核:利用高斯公式 浅谈支持向量机(Support Vector Machine)计算两个向量的相似度。

    3.多项式内核:利用 浅谈支持向量机(Support Vector Machine)公式计算两个向量的相似度。

下面小编分别用线性内核和高斯内核来实际操作下。

使用线性内核的支持向量机

只有数据集是线性可分的时候,使用线性内核的支持向量机才能够取得较好的效果。数据集是由二维坐标组成的,数据分布图如下。

浅谈支持向量机(Support Vector Machine)

利用Python的sklearn包,使用线性内核的支持向量机训练数据集的代码如下。

linear_svm = svm.SVC(kernel='linear', C=100)   #C越大越容易过拟合
linear_svm.fit(X_train, Y_train)

绘制的线性决策边界如下图所示。

浅谈支持向量机(Support Vector Machine)

这里,我使用的参数C的值为100,较大,对训练集的拟合效果足够好了,可以看到已经把所有的数据正确的划分开,但不一定代表这个模型就好,很有可能出现过拟合问题。

使用高斯内核的支持向量机

当我们的数据集不再线性可分,我们就要借助"核函数"来构造一个非线性的决策边界。比如数据集分布如下。

浅谈支持向量机(Support Vector Machine)

利用高斯函数训练并绘制决策边界的Python代码如下。

#利用核函数为高斯函数的支持向量机训练并绘制决策边界
def plot_boundray():
    X = []
    X1 = 0
    x2 = 0
    for i in range(0,100,1):
        X1 = i/100
        for j in range(40,100,1):
            X2 = j/100
            X.append([X1, X2])
    linear_svm = svm.SVC(kernel='rbf', gamma=50, C=100)
    linear_svm.fit(X_train, Y_train)
    Y = linear_svm.predict(X)
    print(linear_svm.score(X_train, Y_train))
    X1_positive, X2_positive, X1_negative, X2_negative = divide_data_by_class(np.array(X), Y)
    plt.scatter(X1_negative, X2_negative, marker='*', color='green')
    X1_positive, X2_positive, X1_negative, X2_negative = divide_data_by_class(X_train, Y_train)
    plt.scatter(X1_positive, X2_positive, marker='+')
    plt.scatter(X1_negative, X2_negative, marker='.', color ='red')
    plt.show()

效果图如下所示。

可以看到决策边界基本将两类数据分别开来,但这只是在训练集上的拟合效果,同样的可能存在过拟合问题。对于拟合问题的解决,可以利用上篇文章中的一些方法进行探究。

好了,本次分享就到这里了,有什么错误之处,敬请指正。

以上是关于浅谈支持向量机(Support Vector Machine)的主要内容,如果未能解决你的问题,请参考以下文章

支持向量机(Support Vector Machine)

Spark MLlib模型 支持向量机Support Vector Machine

支持向量机(SVM:support vector machine)

支持向量机(support vector machines, SVM)

机器学习之支持向量机(Support Vector Machine)(更新中...)

分类问题第二弹来袭:支持向量机(Support Vector Machine)