【参考资料】
【1】《统计学习方法》

基本概念

  1. 当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器,即线性可分支持向量机,又称硬间隔支持向量机;
  2. 当训练数据近似线性可分时,通过软间隔(增加一个松弛因子)后学习一个线性的分类器,即软间隔支持向量机;
  3. 当训练数据不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机

SVM的定义:

输入: 给定一个特征空间上的训练数据T={(x1,y1),(x2,y2)...(xn,yn)}T=\{(x_1, y_1),(x_2, y_2)...(x_n, y_n)\},其中yi{1,1}y_i \in \{-1,1\}分别表示二分类中的正例和负例。

方式: 通过间隔最大化得到一个超平面y(x)=wTϕ(x)+by(x) = w^T\phi(x)+b,这里ϕ(x)\phi(x)表示特征空间的转换,基本就是ϕ(x)=x\phi(x)=x

输出: 得到一个线性分类器f(x)=sign(wTϕ(x)+b)f(x)=sign(w^T\phi(x)+b)

【机器学习笔记17】支持向量机

如上例所表示,存在两个正例点(3、3)和(4、3),一个负例点(1、1),由最优的超平面12x1+12x22=0\dfrac{1}{2}x_1 + \dfrac{1}{2}x_2 - 2=0分割。

函数间隔

定义超平面(w、b)和样本点(xi,yi)(x_i,y_i)的函数间隔为γ^i=yi(wxi+b)\hat{\gamma}_i=y_i(w \cdot x_i + b)

几何间隔
定义超平面(w、b)和样本点(xi,yi)(x_i,y_i)的几何间隔为γ^i=yi(wwxi+bw)\hat{\gamma}_i=y_i(\dfrac{w }{\lVert w \rVert}\cdot x_i + \dfrac{b}{\lVert w \rVert})

定义γ=minγ^\gamma = min \hat{\gamma}

SVM(硬间隔)

(重要)注意上面的最大间隔取的是其中一个样本点和超平面的距离,要就是说SVM的分割本质在于,一是对全部的样本进行正确分割,二是对最难分割的那个点仍然具有最好的分割效果(距离最大)

minw,b,ξ12w2 \min\limits_{w,b,\xi} \quad \dfrac{1}{2}{\lVert w \rVert}^2

s.t.yi(wxi+b)1s.t. \quad y_i(w \cdot x_i + b) \ge 1

【机器学习笔记17】支持向量机

SVM的对偶解法(以硬分割为例)

【机器学习笔记17】支持向量机

【机器学习笔记17】支持向量机
对于本文一开始的实例,采用对偶方式求取最优值如下:
【机器学习笔记17】支持向量机

SVM(软间隔)

在硬间隔SVM的基础上增加一个松弛变量,使得优化问题转换为:

minw,b,ξ12w2+Ci=1Nξi \min\limits_{w,b,\xi} \quad \dfrac{1}{2}{\lVert w \rVert}^2+C\sum\limits_{i=1}^{N}\xi_i

s.t.yi(wxi+b)1ξis.t. \quad y_i(w \cdot x_i + b) \ge 1 - \xi_i

其中ξi\xi_i称为松弛变量,而C称为惩罚因子,也就是控制允许松弛的成都

SVM(核优化)

核技巧相当于把原始的输入空间映射到一个新的特征空间,之后再进行分类。例如高斯核函数:
K(x,z)=exp(xz22σ2)K(x,z)=exp(-\dfrac{{\lVert x -z \rVert}^2}{2\sigma^2})

则分类决策函数转变为:

f(x)=sign(i=1Naiyiexp(xz22σ2)+b)f(x)=sign(\sum\limits_{i=1}^{N}a_iy_iexp(-\dfrac{{\lVert x -z \rVert}^2}{2\sigma^2}) + b)

SVM程序实现(基于sklearn)

# -*- coding: utf-8 -*-
import numpy  as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import svm

def iris_type(s):

    it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
    return it[s]

def _test_svm():

    """
    采用鸢尾花卉数据集
    """

    #converters 用以将第5列数据用iris_type进行映射
    data = np.loadtxt("./data/iris.data", dtype=float, delimiter=',', converters={4: iris_type})
    x, y = np.split(data, (4,), axis=1)

    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)


    """
    C: 惩罚系数。C越大,即对分错样本的惩罚程度越大,在训练样本中准确率越高,泛化能力降低,默认0.1
    kernel: 核函数
        linear: 线性核
        poly: 多项式核
        rbf: 高斯核
        sigmoid: sigmoid核心函数
    gamma: 核函数的系数
    decision_function_shape: 支持多分类时使用,ovr和ovo代表不同的svm组成方式
    """
    clf = svm.SVC(C=0.5, kernel='linear', decision_function_shape='ovr')
    #clf = svm.SVC(C=0.9, kernel='rbf', gamma=10, decision_function_shape='ovr')
    model = clf.fit(x_train, y_train.ravel()) 

    y_test_pre = model.predict(x_test)  

    # 训练集上的预测结果
    y_test = y_test.reshape(-1)
    result = (y_test_pre == y_test)

    acc = np.mean(result)

    print('准确度: %.2f%%' % (100 * acc)) #准确度: 100.00%  :)

    pass

"""
说明:

svm分类代码实现,对应的笔记《13.2 支持向量机》

作者:fredric

日期:2018-9-24

"""
if __name__ == "__main__":

    _test_svm()

相关文章: