svm系列之核函数+软边界

软边界svm一般形式

前面Hard-Margin svm 的一个缺点就是 会产生过拟合现象。特别是当使用核函数或者对偶的svm的时候,如果要求必须把数据点都区分的话,就会很任意发生过拟合现象。
由于有的数据是有噪声的,可能还是离群点,如果一定要求所有的点都必须分对的话,即这里写图片描述 ,那么就有可能把误差带进去。所以我们想的是,把条件放宽一些,对于个别点,错就错了,没必要太追究。
我们原来的Hard-Margin svm表达形式为
这里写图片描述
我们借鉴pocket的表达式,就是错一点没什么,但是不要太多。则我们可以转化为
这里写图片描述
其中C是用来权衡 是要边界大,还是要误差容忍度大。
可将上式化简为
这里写图片描述
可是,对于这里写图片描述这样形式的式子,他不是二次规划的形式。同时,我们不能区分最小误差和最大误差。也就是,有的数据点错的很远,非常远离分割线,可是我们给的误差处罚值为1,有的数据点错的很小,就在分割线旁边,可是我们给的误差处罚值依然为1。这就不好了。基于以上两个问题,我们决定将表达式进行修正。
这里写图片描述
这样就很好的处理了问题,原因是
这里写图片描述
其中 εn 紫色线部分violation
这里写图片描述
其中C是用来权衡 是要边界大,还是要误差容忍度大。
C越大,误差容忍度就越小,要求的边界越大,就可能会过拟合。
C越小,误差容忍度就越大,要求的边界越小,就可能会欠拟合。

软边界svm的对偶式

我们得到软边界svm的基本形式,现在用之前的步骤将其转化对偶形式。
具体步骤
这里写图片描述
这里写图片描述
这里写图片描述
最终结果为
这里写图片描述

软边界svm的kernel函数

这里写图片描述
与之前的类似,就是b的求解可能有点问题。
Hard margin svm 的b的求解为
这里写图片描述
而现在的b的求解为
这里写图片描述
即不仅仅要求 αn<0 ,还要求 αn>=0
即最终有
这里写图片描述
其实即使这样,依然会导致一定程度的过拟合,所以要小心的调节参数。
αn 的物理意义
其实 αn 的取值范围,可以反应出其对应点所处的位置。
这里写图片描述

最后,
我们通过交叉验证的方法选择参数,要记住
这里写图片描述
不过他仅仅是上限,不是很精确,只是在运算量很大时,近似估计一下。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用sklearn包来实现SVM核函数。sklearn提供了多种核函数的选择,包括线性核函数、多项式核函数和高斯核函数等。 要使用核函数,可以使用svm.SVC()函数,并在参数中指定kernel的类型。例如,使用多项式核函数可以将参数kernel设置为'poly',使用高斯核函数可以将参数kernel设置为'rbf'。 以下是一个示例代码,演示了如何使用多项式核函数和高斯核函数: ```python from sklearn import svm import numpy as np import matplotlib.pyplot as plt # 准备训练样本 x = [[1, 8], [3, 20], [1, 15], [3, 35], [5, 35], [4, 40], [7, 80], [6, 49]] y = [1, 1, -1, -1, 1, -1, -1, 1] # 开始训练 clf_poly = svm.SVC(kernel='poly') # 多项式核函数 clf_rbf = svm.SVC(kernel='rbf') # 高斯核函数 clf_poly.fit(x, y) clf_rbf.fit(x, y) # 绘制样本点和决策边界 h = 0.02 # 设置网格步长 x_min, x_max = min(np.array(x)[:, 0]) - 1, max(np.array(x)[:, 0]) + 1 y_min, y_max = min(np.array(x)[:, 1]) - 1, max(np.array(x)[:, 1]) + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z_poly = clf_poly.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) Z_rbf = clf_rbf.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) plt.figure(figsize=(10, 4)) plt.subplot(121) plt.contourf(xx, yy, Z_poly, cmap=plt.cm.coolwarm, alpha=0.8) plt.scatter(np.array(x)[:, 0], np.array(x)[:, 1], c=y, cmap=plt.cm.coolwarm) plt.title('Polynomial Kernel') plt.subplot(122) plt.contourf(xx, yy, Z_rbf, cmap=plt.cm.coolwarm, alpha=0.8) plt.scatter(np.array(x)[:, 0], np.array(x)[:, 1], c=y, cmap=plt.cm.coolwarm) plt.title('Gaussian Kernel') plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值