学习笔记: 机器学习经典算法-线性SVM(LinearSVM)

简介: 机器学习经典算法-个人笔记和学习心得分享

1、不适定问题

在解决分类问题时,通常根据算法模型在样本的特征空间内生成的决策边界来为样本分类提供依据。但对于许多现实的样本集来说,在其特征空间内可能会存许多满足分类要求的决策边界,也就是决策边界不唯一。


在逻辑回归中,求解样本特征空间的决策边界是通过定义一个概率函数$\sigma(t)$,根据概率函数建模形成了一个损失函数,再通过最小化损失函数来求解一条符合条件的决策边界,由于损失函数完全由采样数据所决定,所以求解的决策边界的不一定是面对实际情况的最优决策边界,也就是决策边界的泛化能力可能不足。

2、支撑向量机对不适定问题的解决方案

对于算法模型来说,最重要的问题是模型的泛化能力。对于分类模型来说也对应决策边界的泛化能力。一个好的决策边界,应该能够充分地分割样本的特征空间。所以就有对于这样一个 “好的决策边界” 定义为距样本空间内各类别簇的分布边缘都尽可能远,换而言之就是各类别簇距 decision_boundary 最近的一些点离 decision_boundary 最远。

不同于 逻辑回归 建模在于求一条符合条件的 decision_boundar ,支撑向量机(SVM,Support Vector Machine) 的主要思想是 寻找一个最优决策边界 ,该决策边界拥有充分的泛化能力,不仅能很好的划分训练数据,同时还能很好地应对实际要面对的数据。在SVM的数学理论里该最优决策边界定义为距离样本空间内各类别簇尽可能远的决策边界, 也就是 距离所有类别簇的最近样本最远的决策边界,这些距离决策边界最近的类别簇样本称为 支撑向量,它们最终决定了SVM算法 寻找的最优决策边界。

SVM 线性分类器类别

  • Hard Margin SVM ,基于 SVM思想 的最原始分类器。
  • Soft Margin SVM ,基于 Hard Margin SVM 的优化算法,添加了正则项。

3、Hard Margin SVM 的最优化问题

由于距离决策边界最近的类别簇样本,也就是 支撑向量 决定了最优决策边界。这个最优决策边界满足距离所有类别簇的最近样本最远。令支撑向量到决策边界的距离为 $d$,则有 SVM算法 在于最大化 $d$。首先根据解析几何,空间上任意点$x$ 到 决策边界所在超平面 $w^Tx + b = 0$ 的距离将描述为 $d = \frac {|w^Tx + b |}{\|w\|}$。

3.1 SVM 的约束条件

SVM 定义了支撑向量到决策边界的距离为 $d$,那么样本空间内任意样本点到决策边界的距离都将大于 $d$。同时决策边界应该从各样本簇中心划分样本空间,所以对于二分类 $ y^{(i)} \in \{-1,1\}$,就有两个类别的样本到decision_boundary 的有向距离应满足:

  • 对于边界上方的类别点,$\frac {w^Tx + b}{\|w\|} > d,\forall y^{(i)} = +1$
  • 对于边界下方的类别点,$\frac {w^Tx + b}{\|w\|} < -d,\forall y^{(i)} = -1$

    联合变形为
    $$\left\{ \begin{array}{**lr**} \frac {w^Tx + b}{\|w\|d} >\ \ \ 1,\forall y^{(i)} = \ \ 1 \\ \frac {w^Tx + b}{\|w\|d} > -1,\forall y^{(i)} = -1 \end{array} \right.$$
    $\small {\bf 令\ \ \ } w_d = \frac {w}{\|w\|d},b_d = \frac {b}{\|w\|d}$ : $\small {\bf 得到 \ \ \ } \left\{ \begin{array}{**lr**} w_d^Tx + b_d >\ \ 1,\forall y^{(i)} = \ \ 1 \\ w_d^Tx + b_d < -1,\forall y^{(i)} = -1 \end{array} \right.$,

关于这变形后的直线 $w_d^T + b_d = \pm 1$ 的一些理解:

对于点法式描述的超平面解析方程式 $w^Tx + b = 0$ 中,常量 $b$ 与超平面距原点的实际偏移量$d$具如下关系 : $d = \frac {w^Tx_0}{\|w\|} = \frac {-b}{\|w\|}$,所以对空间内的超平面参考原点平移$+d$个单位后,解析方程式将描述为 $w^Tx + b - d\|w \| = 0 \rightarrow w^Tx + b = d\|w \|$。所以方程式 $w_d^T + b_d = \pm 1$ 本质描述了决策边界平移$\pm d$个单位后位于支撑向量上的两条平行直线。同时,对于原始的决策边界描述方程 $w^Tx + b = 0$,新方程 $w_d^Tx + b_d = 0$ 本质是原方程的线性缩放,描述的是同一个方程。所以对于最终的结果使用$w_d,b_d$来描述决策边界与使用$w ,b $等价。为了表述方便,再令$w = w_d, b = b_d$。

由于类别的识别标记被$\{-1,1\}$ 区分,结合$w = w_d, b = b_d$的换元,联合两描述式:
$$\left\{ \begin{array}{**lr**} w_d^Tx + b_d >\ \ 1,\forall y^{(i)} = \ \ 1 \\ w_d^Tx + b_d < -1,\forall y^{(i)} = -1 \end{array} \right. \rightarrow \left\{ \begin{array}{**lr**} w^Tx + b >\ \ 1,\forall y^{(i)} = \ \ 1 \\ w^Tx + b < -1,\forall y^{(i)} = -1 \end{array} \right. \rightarrow y^{(i)}(w^Tx + b) > 1$$
$\therefore $ SVM算法 搜索的最优决策边界到任意样本点的距离大于等于 $d$ 的关系就被描述为了 $y^{(i)}(w^Tx + b) > 1$;

3.2 SVM 的优化目标

SVM算法优化目标 即对于任意支撑向量,都有它到决策边界的距离$d$ 达到最大化,也即 $\max \frac {|w^Tx + b |}{\|w\|}$。 由于求得支撑向量上存在决策边界的偏移直线 $w^Tx + b = \pm 1$,所以将任意分类下的支撑向量代入直线再取绝对值的结果都是 $|w^Tx + b| = 1$,因此优化目标函数描述为
$$\max \frac {|w^Tx + b |}{\|w\|} \rightarrow \max \frac {1}{\|w\|} \rightarrow \min (\|w\|)$$
为了便于获取导数,对于取模最小值的函数进一步转换为 $ \min (\|w\|) \rightarrow \min (\frac {1}{2}\|w\|^2)$

综上, Hard Margin SVM 搜索线性决策边界的最优化目标为:
基于约束 $\mathrm{s.t.} \ \ y^{(i)}(w^Tx + b) > 1$ 下的 $\min (\frac {1}{2}\|w\|^2)$ 求极值问题。

4、Soft Margin SVM 与 SVM 正则化

Hard Margin SVM 算法搜索的决策边界由于极度依赖两个类别内的支撑向量,所以就会很容易受到错误样本(极端样本,这类样本并不能代表一般情况)的影响。导致生成不理想的线性决策边界,也就是出现过拟合问题。所以通常只适用于具有强线性可分且采样良好数据集(意味着没有outlier出现)。

考虑现实生产情况下采集到样本往往都会出现 outlier 问题,因此Hard Margin SVM算法的易受极端样本影响的拟合 缺点 需要被进一步改进,来提高的泛化能力。
Hard Margin SVM 算法中,优化目标被条件 $\mathrm{s.t.} \ \ y^{(i)}(w^Tx + b) > 1$ 所约束,该约束本质是要求决策边界所在 $\pm d$ 范围的 Margin 区域内不能存在任何样本点。所以如果对这个条件进行宽松,缩小Margin Area 的范围,就可以适当地提高 SVM 模型的容错能力。因此,分别对数据集的每个样本点都添加上容错空间 $\zeta_i,\zeta_i \ge 0$,就有得到了基于 Hard Margin SVM 方法改进的 Soft Margin SVM

Soft Margin SVM 的约束条件为: $\mathrm{s.t.} \ \ y^{(i)}(w^Tx + b) > 1 - \zeta_i$ .

需要注意如果当 $\zeta$取无穷大,这个约束条件无论$w,b$取任意值都会永远成立。所以为了使添加到约束条件内的 宽松量 $\zeta$ 不会使约束条件失效,$\zeta$本身也需要被约束。它被添加到 Hard Margin SVM 的优化函数里进行最小化约束。

Soft Margin SVM 的优化目标 :$\min (\frac {1}{2}\|w\|^2 + \sum_{i=1}^{m}{\zeta_i})$

Soft Margin SVM 的正则化

  • L1正则化 : $\min (\frac {1}{2}\|w\|^2 + C\sum_{i=1}^{m}{\zeta_i})$ ,常量$C(C \ge0)$ 衡量了搜索决策边界时考虑容错的权值(也叫惩罚因子)。如果 $C \to +\infty$,最小化损失函数时$\zeta_i$只能趋于0,意味着要求模型的容错率最低,这也说明了 Hard Margin SVM 是非常严格的分类器,几乎没有容错空间。
  • L2正则化 : $\min (\frac {1}{2}\|w\|^2 + C\sum_{i=1}^{m}{\zeta_i^2} )$

    容错率权值$C$ 越大(左图),生成的决策平面容错率越低;容错率权值$C$ 越小(右图),生成的决策平面容错率越高,模型泛化能力提高;

=

5、scikit-learn 框架下的线性SVM

5.1 SVM 的特征归一化

SVM 算法的决策边界依赖于最大化 支撑向量到它的距离 $d$ ,如果特征量纲不一样,在具有大方差的特征方向上计算的距离 $d$ 将掩盖其它特征方向上距离,从而主导决策边界的生成。所以在实际应用时需要首先进行 数据的特征归一化

5.2 sklearn 下的调用线性SVM

### Prepare data
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(iris.data[iris.target < 2,:2],iris.target[iris.target < 2],test_size= 0.2,random_state=666)
### Scale data
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(Train_X)
Train_X_std = standardScaler.transform(Train_X)
Test_X_std  = standardScaler.transform( Test_X)
### SVM classifier
from sklearn.svm import LinearSVC  ### SVC-support_vector_cassifier, SVM分类器
svc = LinearSVC(C = 1e9) ### 减小模型的容错空间,使得正则化的权值C 尽可能大,该模型结果接近 Hard Margin SVM 
svc.fit(Train_X_std,Train_Y)

#### 获取决策边界所在方程 w^Tx+b =0
svc.coef_       ### w
svc.intercept_  ### b

6、应用线性SVM求解非线性分类

非线性决策面的拟合本质是数据集添加多项式后在升维的特征空间内变得线性可分的结果。

### Prepare data
import numpy as np
from sklearn import datasets
X,y = datasets.make_moons(noise= 0.15,random_state=666)   ### 使用 datasets 生成含噪音的指定形状的测试数据

### show sample distribution
import matplotlib.pyplot as plt
plt.scatter(X[y == 0,0],X[y == 0,1])
plt.scatter(X[y == 1,0],X[y == 1,1])



### Polynomial Features
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
def PolynomialSVC(degree,C = 1.0):
    return Pipeline([
        ("Poly",PolynomialFeatures(degree = degree)),
        ("std_scaler",StandardScaler()),
        ("LinearSVC",LinearSVC(C = C))
    ])

poly_SVC = PolynomialSVC(degree = 1)
poly_SVC.fit(X,y)


### draw decision boundary
def plot_decision_boundary(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)

    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)


plot_decision_boundary(poly_SVC, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

7、应用线性SVM求解回归问题

回归问题的本质在于找到一条直线或曲线能够最优地拟合 数据点,不同的回归算法差异主要是拟合策略的不同,如线性回归算法的拟合策略是使得找到的拟合直线与所有数据点的误差最小化($\min MSE$)。

SVM回归 的拟合策略与寻找最优决策边界的过程类似,它的回归策略提出对于一条回归直线,在这条直线上下偏移一个人为指定 $\epsilon$ 大小范围的 Margin Area 里期望包含尽可能多的数据点,这样的一条直线就是一条较好的拟合直线。
详细的SVM推导过程可参考博客 回归SVM的优化目标

7.2 sklearn 下的SVM Regressor(SVR)

### Prepare data
import numpy as np
from sklearn import datasets
boston = datasets.load_boston()
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(boston.data,boston.target,test_size= 0.2,random_state=666)

### Polynomial Features
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVR
from sklearn.pipeline import Pipeline
def standardLinearSVR(epsilon = 0.1):
    return Pipeline([
        ("std_scaler",StandardScaler()),
        ("LinearSVR",LinearSVR(epsilon = epsilon))
    ])

SVR = standardLinearSVR(epsilon = .5)
SVR.fit(Train_X,Train_Y)
SVR.score(Test_X,Test_Y)
目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
3月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
233 2
|
4月前
|
传感器 算法 Python
【电机矢量控制算法】基于线性死区补偿的永磁同步电机矢量控制算法仿真
【电机矢量控制算法】基于线性死区补偿的永磁同步电机矢量控制算法仿真
126 3
|
4月前
|
机器学习/深度学习 人工智能 算法
【多智能体编队】基于自适应控制算法非线性输入的多智能体系统编队控制研究(Matlab代码复现)
【多智能体编队】基于自适应控制算法非线性输入的多智能体系统编队控制研究(Matlab代码复现)
137 0
|
4月前
|
机器学习/深度学习 算法 数据格式
MARS算法理论和Python代码实现:用分段回归解决非线性时间序列预测问题
本文将深入探讨MARS算法的核心原理,并详细阐述其在时间序列预测任务中的应用策略与技术实现。
260 0
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1208 6
|
7月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
11月前
|
机器学习/深度学习 算法 数据可视化
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
1002 70
|
8月前
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
326 6