SMV 算法【python,机器学习,算法】

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised

learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),

其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。

SVM 使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险

(structural risk), 是一个具有稀疏性和稳健性的分类器。SVM 可以通过核方法(kernel method)进行非线性分类,

是常见的核学习(kernel learning)方法之一。

支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,主要用于分类问题,也可以用于回归和异常检测。以下是SVM训练的一般步骤:

  1. 数据准备:
    • 收集数据集,并划分为训练集和测试集(或验证集)。
    • 对于分类问题,确保数据集包含每个类别的标签。
    • 对于回归问题,确保目标变量是连续的。
    • 如果需要,对数据进行预处理,如缩放、标准化或归一化,因为SVM对特征的尺度敏感。
  2. 选择核函数(对于非线性SVM):
    SVM的一个关键特性是它可以处理非线性问题,通过选择一个核函数(如线性核、多项式核、径向基函数(RBF)核或
    Sigmoid 核)来实现。 根据问题的性质和数据集的特性选择合适的核函数。
  3. 选择参数:
    对于 SVM,有两个主要的参数需要选择:C(正则化参数)和 γ(核函数的系数,对于 RBF 核)。
    C 控制对误分类的惩罚程度,C 越大,模型越复杂,但可能过拟合;C 越小,模型越简单,但可能欠拟合。
    γ 控制RBF 核的"宽度",γ越大,核函数越窄,模型越复杂;γ越小,核函数越宽,模型越简单。
    可以使用交叉验证和网格搜索等方法来找到最佳的 C 和 γ 值。
  4. 训练 SVM 模型:
    使用训练集和选定的核函数及参数来训练 SVM 模型。
    训练过程中,SVM 会找到一个决策边界(超平面),该边界将不同类别的数据点分隔开,并最大化两个类别之间的间隔。
  5. 评估模型:
    使用测试集来评估模型的性能。
    对于分类问题,可以使用准确率、召回率、F1 分数等指标来评估模型的性能。
    对于回归问题,可以使用均方误差(MSE)、均方根误差(RMSE)等指标来评估模型的性能。
  6. 优化模型(可选):
    如果模型的性能不佳,可以尝试调整参数、选择不同的核函数或进行特征选择等优化措施。
    也可以尝试使用集成方法(如 Bagging、Boosting)来改进 SVM 的性能。
  7. 使用模型进行预测:
    一旦模型训练完成并经过评估和优化,就可以使用它来对新数据进行预测了。
    对于分类问题,模型会输出数据点所属的类别;对于回归问题,模型会输出一个连续值作为预测结果。

需要注意的是,虽然 SVM 在许多问题上表现良好,但它并不总是最佳选择。

在选择使用 SVM 之前,最好先了解问题的性质和数据集的特性,并考虑其他可能的机器学习算法。

为了方便计算分析,下面以二维数据进行讨论。

三个超平面

  1. 决策超平面
    W 1 x 1 + W 2 x 2 + b = 0 W_1x_1+W_2x_2+b=0 W1x1+W2x2+b=0,位于正负超平面的中间位置。
  2. 正类超平面
    W 1 x 1 + W 2 x 2 + b = 1 W_1x_1+W_2x_2+b=1 W1x1+W2x2+b=1,所有的正类数据会分布到该平面内或者分割的平面以上。
  3. 负类超平面
    W 1 x 1 + W 2 x 2 + b = − 1 W_1x_1+W_2x_2+b=-1 W1x1+W2x2+b=−1,所有的负类数据会分布到该平面内或者分割的平面以下。

正负超平面之间的距离应最大化,这样才能更好的进行分类,正负超平面上会分布一些向量数据点,因此通过该方式进行分类的方法称作支持向量机。

其中 W 1 W_1 W1、 W 2 W_2 W2表示权重, x 1 x_1 x1、 x 2 x_2 x2表示特征值。

正负超平面之间的距离

通过向量法则以及三个超平面的式子可以推导出正负超平面距离公式 L = 2 ∣ W ⃗ ∣ L=\frac{2}{|\vec{W}|} L=∣W ∣2,其中 W ⃗ = w 1 2 + w 2 2 \vec{W}=\sqrt{w_1^2+w_2^2} W =w12+w22

那么问题将转换为求取 W ⃗ \vec{W} W 最小值的问题。

求取 ∣ W ⃗ ∣ |\vec{W}| ∣W ∣的最小值

分类值 y i = { 1 , − 1 } y_i=\{1,-1\} yi={1,−1},那么 y i . ( w ⃗ . x i ⃗ + b ) ⩾ 1 y_i . (\vec{w}.\vec{x_i}+b)\geqslant 1 yi.(w .xi +b)⩾1, i ∈ 1 , 2 , 3 , . . . , n i \in 1,2,3,...,n i∈1,2,3,...,n表示所有的样本。

将问题转换为:求取 f ( w ) = ∣ w ⃗ ∣ 2 2 f(w)=\frac{|\vec{w}|^2}{2} f(w)=2∣w ∣2最小值问题,限制条件为 y i . ( w ⃗ . x i ⃗ + b ) − 1 ⩾ 0 y_i . (\vec{w}.\vec{x_i}+b)-1\geqslant 0 yi.(w .xi +b)−1⩾0

为了使用拉格朗日乘子,将限制条件转换为等式 g i ( w , b ) = y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 = p i 2 g_i(w,b)=y_i * (\vec{w} . \vec{x_i}+b)-1=p_i^2 gi(w,b)=yi∗(w .xi +b)−1=pi2。

因此,拉格朗日方程式子为: L ( w , b , λ i , p i ) = ∣ w ⃗ 2 ∣ 2 − ∑ i = 1 s λ i ∗ ( y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 − p i 2 ) L(w,b,\lambda_i,p_i)=\frac{|\vec{w}^2|}{2}-\sum\limits_{i=1}^{s} \lambda_i * (y_i * (\vec{w} . \vec{x_i}+b)-1-p_i^2) L(w,b,λi,pi)=2∣w 2∣−i=1∑sλi∗(yi∗(w .xi +b)−1−pi2)

对各个分量求偏导,并令其为0,可以得到 4 个式子:

  1. L ′ ( w ) = w ⃗ − ∑ i = 1 s λ i y i x i ⃗ = 0 L^\prime(w)=\vec{w}-\sum\limits_{i=1}^{s}\lambda_i y_i \vec{x_i}=0 L′(w)=w −i=1∑sλiyixi =0。
  2. L ′ ( b ) = − ∑ i = 1 s λ i y i = 0 L^\prime(b)=-\sum\limits_{i=1}{s}\lambda_i y_i=0 L′(b)=−i=1∑sλiyi=0。
  3. L ′ ( λ i ) = y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 − p i 2 = 0 L^\prime(\lambda_i)=y_i * (\vec{w} . \vec{x_i}+b)-1-p_i^2=0 L′(λi)=yi∗(w .xi +b)−1−pi2=0。
  4. L ′ ( p i ) = 2 λ i p i = 0 L^\prime(p_i)=2\lambda_i p_i=0 L′(pi)=2λipi=0。

由 3 和 4 式子可以得到 λ i ∗ ( y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 ) = 0 \lambda_i * (y_i * (\vec{w} . \vec{x_i}+b)-1) = 0 λi∗(yi∗(w .xi +b)−1)=0,

因为 λ i ⩾ 0 \lambda_i \geqslant 0 λi⩾0,所以 y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 ⩾ 0 y_i * (\vec{w} . \vec{x_i}+b)-1 \geqslant 0 yi∗(w .xi +b)−1⩾0。

上面 4 个式子加上 ′ l a m b d a i ⩾ 0 'lambda_i \geqslant 0 ′lambdai⩾0就是 KKT 条件。

将原问题转换为对偶问题求解

  1. 原问题
    m i n i m i z e f ( w ) = ∣ w i ⃗ ∣ 2 2 minimize\ \ f(w)=\frac{|\vec{w_i}|^2}{2} minimize f(w)=2∣wi ∣2
    限制条件 g i ( w , b ) = y i ∗ ( w ⃗ ⋅ x i ⃗ + b ) − 1 ⩾ 0 g_i(w,b)=y_i * (\vec{w} \cdot \vec{x_i}+b)-1 \geqslant 0 gi(w,b)=yi∗(w ⋅xi +b)−1⩾0
  2. 对偶问题
    m a x i m i z e q ( λ ) = m a x i m i z e ( m i n i m i z e ( ∣ w i ⃗ ∣ 2 2 − y i ∗ ( w ⃗ ⋅ x i ⃗ + b ) − 1 ) ) maximize\ \ q(\lambda)=maximize(minimize(\frac{|\vec{w_i}|^2}{2} - y_i * (\vec{w} \cdot \vec{x_i}+b)-1)) maximize q(λ)=maximize(minimize(2∣wi ∣2−yi∗(w ⋅xi +b)−1)),其中 λ i ⩾ 0 \lambda_i \geqslant 0 λi⩾0
  3. 根据 KKT 条件,精简对偶问题
    m a x i m i z e q ( λ i ) = m a x i m i z e ( ∑ i = 1 s λ i − 1 2 ∑ i = 1 s ∑ j = 1 s λ i λ j y i y j x i ⃗ ⋅ x j ⃗ ) maximize\ \ q(\lambda_i) = maximize(\sum\limits_{i=1}^{s}\lambda_i-\frac{1}{2}\sum\limits_{i=1}^{s}\sum\limits_{j=1}^{s}\lambda_i\lambda_j y_i y_j \vec{x_i} \cdot \vec{x_j}) maximize q(λi)=maximize(i=1∑sλi−21i=1∑sj=1∑sλiλjyiyjxi ⋅xj )
  4. 由对偶问题,求解得到 λ i \lambda_i λi,然后根据 w ⃗ = ∑ i = 1 s λ i y i x i ⃗ \vec{w}=\sum\limits_{i=1}{s}\lambda_i y_i \vec{x_i} w =i=1∑sλiyixi 求解得到 w ⃗ \vec{w} w ,再根据 y i ∗ ( w ⃗ ⋅ x i ⃗ + b ) − 1 = 0 y_i *(\vec{w}\cdot\vec{x_i}+b)-1=0 yi∗(w ⋅xi +b)−1=0求得 b b b。

核技巧

  1. 方法一:通过维度转换函数将向量进行升维度,然后计算 x i ⃗ ⋅ x j ⃗ \vec{x_i} \cdot \vec{x_j} xi ⋅xj 的结果。这种方法有限制性,当维度很高时,无法计算结果。
  2. 方法二: 定义多项式核函数 K ( x i ⃗ , x j ⃗ ) = ( c + x i ⃗ , x j ⃗ ) d K(\vec{x_i},\vec{x_j})=(c+\vec{x_i},\vec{x_j})^d K(xi ,xj )=(c+xi ,xj )d,参数 c c c控制了式子中既有低次项也有高次项。
  3. 在 SVM 问题中,使用高斯核函数 K ( x i ⃗ , x j ⃗ ) = e − γ ∣ x i ⃗ − y j ⃗ ∣ 2 K(\vec{x_i},\vec{x_j})=e^{-\gamma|\vec{x_i}-\vec{y_j}|^2} K(xi ,xj )=e−γ∣xi −yj ∣2,即 Radial Basis Kernel 函数。 γ \gamma γ相当于相似容忍度。

损失函数

使用铰链损失函数 m a x ( 0 , 1 − p ) max(0,1-p) max(0,1−p)。其中 p = y i ∗ ( w ⃗ ⋅ x i ⃗ + b ) p=y_i *(\vec{w}\cdot \vec{x_i}+b) p=yi∗(w ⋅xi +b)。

相关推荐
_.Switch23 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
Power20246662 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
数据猎手小k2 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸3 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农3 小时前
Python 继承、多态、封装、抽象
开发语言·python
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表