首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅谈支持向量机

自从在学校安定下来后,小编的学习效率和时长提高了不少。在最近五天的时间里,看了大约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()

效果图如下所示。

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180709G1FJBB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券