支持向量机

支持向量机(SVM)就是在一堆数据里,找一条“最宽的分界线”,把不同类别尽量分得又准又稳。

分类标准 核心思想 最优化目标 泛化能力
线性模型 决策边界 民主投票 点到直线距离和 一般
SVM 超平面 民主集中 margin 提升

什么是间隔

在 SVM 中,我们要找一个超平面

w^Tx+b=0

让它 把两类样本分开,并且离两类最近的点尽可能远。这个“最近距离”就是 间隔(margin)

SVM硬间隔(Hard Margin)

    特点

    • 假设数据是完全线性可分的
    • 不允许任何样本被分错
    • 所有点都必须在“安全边界”之外

    最优化目标

    • 最大化间隔margin
    • 最大化距离d(线性模型中相当于斜边,而SVM中相当于直角边)
    • 点到直线的垂直距离

    \min_{w,b} \ \frac{1}{2}\|w\|^2

    s.t. y_i(w^T x_i + b) \ge 1,\quad i=1,\dots,n

    SVM软间隔(Soft Margin)

    要解决的问题

    • 异常值outlier
    • 支持向量的选择
    • 民主集中思想的弱化

    允许少量犯错,加入容错值,引入松弛变量 ξ

    优化目标

    \min_{w,b,\xi} \ \frac{1}{2}\|w\|^2 + C\sum_{i=1}^n \xi_i

    s.t.y_i(w^T x_i + b) \ge 1 - \xi_i,\quad \xi_i \ge 0

    参数 C 

    • C 大:强烈惩罚错误、更接近硬间隔、容易过拟合

    • C 小:允许更多错误、间隔更大、泛化能力更强

    非线性SVM:核技巧

    线性核函数

            线性核函数是最简单的核函数,它直接在输入特征空间中进行内积计算,不进行任何映射。

    K(x_i, x_j) = x_i^T x_j

    • 其中,x_i和 ​x_j 是样本点

    • 线性核函数相当于没有映射,直接在原始特征空间中操作

    多项式核函数

            多项式核函数通过对输入样本进行多项式映射,将数据从原始空间映射到更高维度空间,在高维空间中可能能找到一个线性决策边界。(通过调整多项式的度数,可以控制映射的复杂度)

    K(x_i, x_j) = (x_i^T x_j + c)^d

    • 其中,ccc 是常数,ddd 是多项式的次数。

    • 这种核函数允许在输入空间中进行多项式映射,产生更复杂的决策边界

    高斯核函数(RBF函数、径向基函数)

            高斯核函数是最常用的核函数之一,它能够将数据映射到无限维度的空间,从而可以非常灵活地处理复杂的非线性关系。高斯核的特点是其通过样本之间的“距离”来定义相似度,距离越近,相似度越高。

    K(x_i, x_j) = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right)

    其中, \left \| x_i-x_j \right \|表示样本点x_ix_j之间的欧几里得距离,σ是高斯核的宽度参数。

    如何选择核函数

    • 当特征多且接近样本数量,可直接选择线性核SVM
    • 当特征数少,样本数正常,推荐选用高斯核函数
    • 当特征数少,样本数很大,建议选择多项式核函数(不要让阶数过高,否则可能过拟合)

    SVM解决分类任务

    SVM解决回归任务

    数据准备

    import numpy as np
    import matplotlib.pyplot as plt
    np.random.seed(666)
    x = np.random.uniform(-3,3,size=100)
    y = 0.5 * x**2 +x+2 +np.random.normal(0,1,size=100)
    X = x.reshape(-1,1)

    代码实现

    from sklearn.svm import LinearSVR
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    # 线性回归
    # epsilon:超参数,容忍误差
    def StandarLinearSVR(epsilon=0.1):
        return Pipeline([
            ("std_scaler",StandardScaler()),
            ("linearSVR",LinearSVR(epsilon=epsilon))
        ])
    
    svr = StandarLinearSVR()
    svr.fit(X,y)
    y_predict = svr.predict(X)
    plt.scatter(x,y)
    plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
    plt.show()

    # 非线性回归任务
    # epsilon:超参数,容忍误差
    def StandarSVR(epsilon=0.1):
        return Pipeline([
            ("std_scaler",StandardScaler()),
            ("SVR",SVR(kernel='rbf',epsilon=epsilon))
        ])
    
    svr = StandarSVR()
    svr.fit(X,y)
    y_predict = svr.predict(X)
    plt.scatter(x,y)
    plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
    plt.show()

    SVM优缺点和适用条件

    优点

    • 高效处理非线性数据
    • 良好的泛化能力(L2正则化特性)
    • 解决分类(SVC)和回归(SVR)问题
    • 稳定性(数据微小变化不会对超平面产生很大影响)

    缺点

    • 选择合适的核函数比较困难
    • 大量内存需求(生成很多支持向量)
    • 大数据集上训练时间长
    • 难以解释

    适用条件

    • 小样本数据
    • 非线性数据

    Logo

    DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

    更多推荐