前言
SVM比较详细的介绍可以参考 支持向量机SVM
首先简要回顾一下SVM算法:如下图所示,寻找一个超平面划分数据,使得两类数据到超平面的距离均大余等于1/||w||。
其数学描述为:
其中距离等于1/||w||的样本点称为“支持向量”,并且最终模型(参数w)仅有支持向量决定。

正则化系数C
实际使用时,并不能保证所有数据被完美划分,例如在-例中混杂了一个+例,标准的SVM就无法求解,如下图所示。
另外,即使数据可以完美划分开,还需要考虑过拟合的问题,即如下图所示,如果完全拟合训练数据,非要将所有正例和反例分开,则分界线为橙色,当需要识别新样本时(紫色x),明显它更符合负例,但是会被划分为正例,即发生过拟合了。
有关机器学习中过拟合及解决方法的问题可以参考:机器学习中的偏差和方差
如果,引入正则化系数C,可以理解允许划分错误的权重(越大,越不允许出错),当C较小时,允许少量样例划分错误,此时分界线为黄色,更加合理。此时对应的SVM方程为:
当ξ=0时,限制条件与以前相同,即划分正确;当0<ξ<1时,样本距离超平面距离小于1/||w||,但此时会在代价函数中有惩罚;当ξ>1时,代表样本越过超平面,划分错误,惩罚会更大。此时模型(参数w)由边界上的样本点及ξ!=0的样本点共同决定。


代码
本实例绘制了在不同正则化系数C下,SVM选择最佳分界线。随机生成160个数据,80个正例,80个反例。选择两个C,为10和0.05,分别代表非正则化/正则化。实际上标准SVM对应C=无穷。划分结果如下,画圈的代表支持向量:
从划分结果可以看出,当C=0.05时,此时允许训练误差更大,支持向量更多,同时正负例的间隔也更大。

代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

# we create 160 separable points
np.random.seed(0)
X = np.r_[np.random.randn(80,2) - [2,2],np.random.randn(80,2) + [2,2]]
Y = [0] * 80 + [1] * 80

# figure number
fignum = 1

# fit the model
for name,penalty in (('unreg',10),('reg',0.05)):

    clf = svm.SVC(kernel='linear',C=penalty)  #线性核函数
    clf.fit(X,Y)

    # get the separating hyperplane
    w = clf.coef_[0]
    a = -w[0] / w[1]
    xx = np.linspace(-5,5)
    yy = a * xx - (clf.intercept_[0]) / w[1]   #超平面

    # plot the parallels to the separating hyperplane that pass through the
    # support vectors
    margin = 1 / np.sqrt(np.sum(clf.coef_ ** 2))
    yy_down = yy + a * margin   #下平面
    yy_up = yy - a * margin     #上平面

    # plot the line,the points,and the nearest vectors to the plane
    plt.figure(fignum,figsize=(4,3))
    plt.clf()
    plt.plot(xx,yy,'k-')        #实线
    plt.plot(xx,yy_down,'k--')  #虚线
    plt.plot(xx,yy_up,'k--')

    plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80,facecolors='none',zorder=10)   #标注支持向量
    plt.scatter(X[:,X[:,c=Y,zorder=10,cmap=plt.cm.Paired)  #绘点

    plt.axis('tight')
    x_min = -4.8
    x_max = 4.2
    y_min = -6
    y_max = 6

    XX,YY = np.mgrid[x_min:x_max:200j,y_min:y_max:200j]
    Z = clf.predict(np.c_[XX.ravel(),YY.ravel()])

    # Put the result into a color plot
    Z = Z.reshape(XX.shape)
    plt.figure(fignum,3))
    plt.pcolormesh(XX,YY,Z,cmap=plt.cm.Paired)

    plt.xlim(x_min,x_max)
    plt.ylim(y_min,y_max)

    title = 'C = ' + str(penalty)
    plt.title(title)
    plt.xticks(())
    plt.yticks(())
    fignum = fignum + 1

plt.show()


如果这篇文章对你有帮助,可以点个赞或者关注我,我会更有动力分享学习过程,谢啦~

Scikit-learn实例之理解SVM正则化系数C的更多相关文章

  1. iOS 9 LaunchServices:错误:没有注册处理程序的URL scheme itms-services

    我们有一些内部应用程序,在iOS9之前,应用程序将在版本比较后打开“itms-services://”链接,新版本的应用程序将被下载并安装.但是在iOS9测试之后,我们发现这些应用无法打开“itms-services://”链接,出现错误,如“LaunchServices:ERROR:没有注册处理程序的URLschemeitms-services”我们用来更新应用程式的代码:我们测试了将“itms

  2. android – setOutputFormat在无效状态下调用:4(where和why)

    所以看起来调用setoutputFormat一定工作正常,但是setProfile本身必须再次调用setoutputFormat然后失败…

  3. 正则化DropPath/drop_path用法示例(Python实现)

    DropPath 类似于Dropout,不同的是 Drop将深度学习模型中的多分支结构随机"失效",而Dropout是对神经元随机"失效"这篇文章主要给大家介绍了关于正则化DropPath/drop_path用法的相关资料,需要的朋友可以参考下

  4. vBulletin Forum 2.3.xx SQL Injection

    theoneyouwant.

  5. 分类报告中少数类别的准确度、召回率和F1分数均为零

    我在使用SkLearn包中的SVM和MLP分类器时出错。使用zero_division参数控制此行为_warn_prf用于拆分数据集的代码SVM分类器代码MLP分类器代码两个分类器的错误相同

  6. 用sklearn拟合多维数据的线性回归

    我正在尝试使用时间序列数据上的sklearn拟合线性回归。唯一的问题是,据我所知,数据不符合通常的时间序列格式。下面是一个示例:我很抱歉,如果这有点难读,但我的想法是,每个列表都代表了当时的一些上下文,其中的每个列表。这是可以的,除非我有多个上下文,但我希望它们都在同一个模型上训练。顺便说一句,当运行上面的代码时,我会得到逻辑上的错误:因为,sklearn需要以下格式的数据:

  7. 计算集合模型估计误差的标准偏差

    最后,我想确定每天超出置信区间的极端结果。但我很难计算装袋回归器中每个模型的残差的逐点标准差。我的示例代码如下:;我在网上找到了这个方法但我不确定x.predict部分使用什么,因为我有4个以上的功能。

  8. basic_string::resize在GCP上部署自定义Sklearn模型时出错

    我想使用预先构建的scikit学习容器在GCP上部署一个成功的定制培训工作。

  9. sklearn的准确度分数未返回值

    我有一个数据集,并使用pd.get_dummies对目标列进行了热编码。然后我使用sklearn的train_test_split函数来创建训练、测试和验证集。然后使用standardScalar()规范化训练集(特性)。我已经将特征和目标的训练集拟合到逻辑回归模型中。我现在正在尝试计算训练、验证和测试集的准确度分数,但我没有运气。

  10. 使用NetworkManager和没有GUI工具的CentOS 6 WiFi

    我正在使用CentOS6,拼命想通过ifcfg-wlan0文件获取Wifi并使用/etc/wpa_supplicant/wpa_supplicant.conf进行捏造.我没有X服务器,所以我不想使用GUI工具.如何配置NetworkManager在wlan0上使用ESSID为inet_bridge的WPA2-PSKWiFi.以太网工作正常,所以我知道我的设置并没有完全搞砸.必须在命令行或使用vim

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部