Python快速实战机器学习(5) 支持向量机

小编 2026-06-23 阅读:1952 评论:0
引言机器学习是如今人工智能时代背景下一个重要的领域。这个“Python快速实战机器学习”系列,用Python代码实践机器学习里面的算法,旨在理论和实践同时进行,快速掌握知识。前面课程:Python快速实战机器学习(1) 教材准备 Pytho...

引言

机器学习是如今人工智能时代背景下一个重要的领域。这个“Python快速实战机器学习”系列,用Python代码实践机器学习里面的算法,旨在理论和实践同时进行,快速掌握知识。

前面课程:

Python快速实战机器学习(1) 教材准备 Python快速实战机器学习(2) 数据预处理

Python快速实战机器学习(3) 线性分类器

Python快速实战机器学习(4) 逻辑回归

概要

1、初步认识支持向量机;

2、了解松弛变量及其用处;

3、学会使用sklearn调用线性SVM。

支持向量机介绍

1

初步认识

支持向量机的英文是Support Vector Machine,缩写为SVM,在接下来的介绍中我们都用SVM来表示支持向量机。

SVM主要用于解决模二分类问题:如下图中的左图,有红色圆圈以及绿色十字标注的两组数据,我们希望将它们分开。然而将两类数据点分开的直线显然不止一条,图中画出来三条线,看上去都是可以工作的,那么到底哪一条才是最好的分类呢?SVM给了一个要求:我们的优化目标是最大化间隔(margin)。

如上图中右图所示,间隔定义为两个分隔超平面(决策界,图中的两条细线)的距离,那些最靠近超平面的训练样本也被称为支持向量(suppor vectors)。从表面上看,我们优化的对象似乎是这个决策面的方向和位置。但实际上最优决策面的方向和位置完全取决于选择哪些样本作为支持向量,也就是图上面的穿过决策面(Decision boundary)的红色和绿色样本。

2

最大化间隔

最大化决策界的间隔,这么做的原因是间隔大的决策界趋向于含有更小的泛化误差,而间隔小的决策界更容易过拟合。为了更好地理解间隔最大化,我们先认识一下那些和决策界平行的正超平面和负超平面,他们可以表示为

这里为什么取正负1,个人理解是找到一个单位1用来作为一个标准,其实取其他一个数字也是可以的,可能是为了方便就取1了。

用(1)减去(2)可以得到:

对两边同时除以||W||,实现归一化,

这里引入||W||是因为,让等式左边表示成一个距离,大家可以取验证任意一点x到分界线(图中粗虚线)的距离的形式就是带有||W||作为分母的形式,其中,

我们有了间隔的计算公式,好像已经可以开始优化了,但是别忘了分类对于这个问题的限制:

也就是说被分类的两类数据都要在决策面的两边。

到现在为止,我们获得了SVM的一个完整描述,最大化间隔的同时,受到数据要在分界面两边的约束。关于带约束的优化问题,数学界早就开发了一套成熟方法处理,大家可以参考这篇文章:

https://zhuanlan.zhihu.com/p/24638007

松弛变量

虽然我们不想深挖SVM背后的数学概念,但还是有必要简短介绍一下松弛变量(slack variable)。它是由Vladimir Vapnik在1995年引入的,借此提出了软间隔分类(soft-margin)。引入松弛变量的动机是原来的线性限制条件在面对非线性可分数据时需要松弛,这样才能保证算法收敛。

松弛变量值为正,添加到线性限制条件即可:

现在的目标函数变成,

注意1/2||W||是因为最大化2/||W||,等价于最小化1/2||W||,所以我们的目标函数是需要最小化的。使用变量C,我们可以控制错分类的惩罚量。这个概念和正则化相关,如果增大C的值会增加bias而减小模型的方差。我们用一张图来给出C值不同带来的结果:

sklearn训练SVM

我们已经学会了线性SVM的基本概念,下面使用sklearn训练一个模型:

from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import warnings


def versiontuple(v):
    return tuple(map(int, (v.split("."))))


def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):

    # setup marker generator and color map
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    # plot the decision surface
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], 
                    y=X[y == cl, 1],
                    alpha=0.6, 
                    c=cmap(idx),
                    edgecolor='black',
                    marker=markers[idx], 
                    label=cl)

    # highlight test samples
    if test_idx:
        # plot all samples
        if not versiontuple(np.__version__) >= versiontuple('1.9.0'):
            X_test, y_test = X[list(test_idx), :], y[list(test_idx)]
            warnings.warn('Please update to NumPy 1.9.0 or newer')
        else:
            X_test, y_test = X[test_idx, :], y[test_idx]

        plt.scatter(X_test[:, 0],
                    X_test[:, 1],
                    c='',
                    alpha=1.0,
                    edgecolor='black',
                    linewidths=1,
                    marker='o',
                    s=55, label='test set')
from sklearn import datasets
import numpy as np

iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target


from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))

from sklearn.svm import SVC

svm = SVC(kernel='linear', C=1.0, random_state=0)
svm.fit(X_train_std, y_train)


plot_decision_regions(X_combined_std, y_combined,
                      classifier=svm, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
# plt.savefig('./figures/logistic_regression.png', dpi=300)
plt.show()

运行结果:

在解决现实的分类问题时,线性逻辑回归和线性SVM通常效果近似。逻辑回归目标是最大化训练集的条件似然,使得它更易受奇异值影响。SVM只关心那些离决策界最近的点(即,支持向量)。另一方面,逻辑回归的优点是易于实现,特别是并行化实现。此外,面对流式数据,逻辑回归的易于更新的特点也很明显。

SVM之所以受欢迎度这么高,另一个重要的原因是它很容易核化(kernelized),能够解决非线性分类问题。我们把这部分内容留到下一课。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表