浅谈支持向量机(Support Vector Machine)
Posted 追梦程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈支持向量机(Support Vector Machine)相关的知识,希望对你有一定的参考价值。
自从在学校安定下来后,小编的学习效率和时长提高了不少。在最近五天的时间里,看了大约20节视频并做了对应章节的编程练习。
上一篇文章介绍了的知识,这次给小伙伴们介绍下支持向量机的知识。
支持向量机和逻辑回归(Logistic Regression)很相像,从一方面看,支持向量机是逻辑回归的变化版。其重要的区别在于损失函数的不同。
(细线是逻辑回归的损失函数图像,粗线是支持向量机的损失函数图像)
如果数据是线性可分(能通过一条直线将不同类别区分开来),支持向量机看起来就是和逻辑回归使用了不同但很相似的损失函数,往往这两个分类器的效果也差不多。
如果数据不是线性可分的,支持向量机就要借助一个名叫“核函数”的东西来构造非线性边界。核函数是用来衡量两个向量的相似度,如果两个向量的相似度越高,核函数的返回值越大。
常见的核函数有如下几种:
1.线性内核:表示支持向量机不借助核函数来分类。
2.高斯内核:利用高斯公式 计算两个向量的相似度。
3.多项式内核:利用 公式计算两个向量的相似度。
下面小编分别用线性内核和高斯内核来实际操作下。
使用线性内核的支持向量机
只有数据集是线性可分的时候,使用线性内核的支持向量机才能够取得较好的效果。数据集是由二维坐标组成的,数据分布图如下。
利用Python的sklearn包,使用线性内核的支持向量机训练数据集的代码如下。
linear_svm = svm.SVC(kernel='linear', C=100) #C越大越容易过拟合 linear_svm.fit(X_train, Y_train)
绘制的线性决策边界如下图所示。
这里,我使用的参数C的值为100,较大,对训练集的拟合效果足够好了,可以看到已经把所有的数据正确的划分开,但不一定代表这个模型就好,很有可能出现过拟合问题。
使用高斯内核的支持向量机
当我们的数据集不再线性可分,我们就要借助"核函数"来构造一个非线性的决策边界。比如数据集分布如下。
利用高斯函数训练并绘制决策边界的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)的主要内容,如果未能解决你的问题,请参考以下文章
Spark MLlib模型 支持向量机Support Vector Machine
支持向量机(SVM:support vector machine)
支持向量机(support vector machines, SVM)