简化版_线性可分支持向量机的推导

线性可分支持向量机详解
本文深入探讨了线性可分支持向量机的学习原理,详细解析了其数学推导过程,包括最优化问题的构造及拉格朗日对偶性的应用。文章阐述了如何通过最大化几何间隔来寻找最优分类超平面,并介绍了KKT条件在确定支持向量中的作用。

线性可分支持向量机的推导

线性可分支持向量机

  支持向量机是一种二分类模型,它的基本想法就是:基于训练集和样本空间找到一个最好的划分超平面。在样本空间中,划分超平面可用 w T x + b = 0 {w^T}x + b = 0 wTx+b=0表示,记为(w,b)。样本点 ( x i , y i ) ({x_i},{y_i}) (xi,yi)到划分超平面的函数间隔: γ ^ = y i ( w ∗ x i + b ) \hat \gamma = {y_i}(w*{x_i} + b) γ^=yi(wxi+b),几何间隔为: γ = γ ^ ∥ w ∥ \gamma = \frac{{\hat \gamma }}{{\left\| w \right\|}} γ=wγ^
  支持向量机的基本思想是:求解能够正确划分训练数据集并且几何间隔最大的分离超平面,表达为数学公式即为:
max ⁡ w , b        γ ^ ∥ w ∥ \mathop {\max }\limits_{w,b} \;\;\;\frac{{\hat \gamma }}{{\left\| w \right\|}} w,bmaxwγ^
s.t. y i ( w ∗ x i + b ) ≥ γ ^ ,                i = 1 , . . . , N {y_i}(w*{x_i} + b) \ge \hat \gamma ,\;\;\;\;\;\;\;i = 1,...,N yi(wxi+b)γ^,i=1,...,N

由于 γ ^ {\hat \gamma } γ^的取值并不影响最优化问题的解,且最大化 1 ∥ w ∥ \frac{1}{{\left\| w \right\|}} w1等价于最小化 1 2 ∥ w ∥ {\frac{1}{2}\left\| w \right\|} 21w,便可得线性可分的支持向量机的最优化问题:
min ⁡ w , b    1 2 ∥ w ∥ 2 \mathop {\min }\limits_{w,b} \;\frac{1}{2}{\left\| w \right\|^2} w,bmin21w2
s.t.
y i ( w ∗ x i + b ) − 1 ≥ 0 ,          i = 1 , 2 , . . . , N {y_i}(w*{x_i} + b) - 1 \ge 0,\;\;\;\;i = 1,2,...,N yi(wxi+b)10,i=1,2,...,N
这是一个凸二次优化问题,可以直接求解。但是为了方便,应用拉格朗日对偶性,求解它的对偶问题。

学习的对偶算法

  首先建立拉格朗日函数,为每个不等式约束,引进拉格朗日乘子, α i ≥ 0 ,          i = 1 , . . . , N {\alpha _i} \ge 0,\;\;\;\;i = 1,...,N αi0,i=1,...,N,定义拉格朗日函数:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − 1 2 α i y i ( w ∗ x i + b ) + ∑ i = 1 N α i { L(w,b,\alpha ) = \frac{1}{2}{\left\| w \right\|^2} - \frac{1}{2}{\alpha _i}{y_i}(w*{x_i} + b) + \sum\limits_{i = 1}^N {{\alpha _i}} } L(w,b,α)=21w221αiyi(wxi+b)+i=1Nαi根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题,即: max ⁡ α    min ⁡ w , b L ( w , b , α ) \mathop {\max }\limits_\alpha \;\mathop {\min }\limits_{w,b} L(w,b,\alpha ) αmaxw,bminL(w,b,α)
  首先,我们来求最小,令 L ( w , b , α ) L(w,b,\alpha ) L(w,b,α)分别对w和b求导为零,可得:
在这里插入图片描述
将其代入拉格朗日函数,可得:
在这里插入图片描述
在这里插入图片描述
解出 alpha 之后,那么w,b也相应得到了,也就得到了分离超平面的方程:
f ( x ) = ∑ i = 1 m α i ∗ y i ( x x i ) + b ∗ f(x) = \sum\limits_{i = 1}^m {\alpha _i^ * {y_i}(x{x_i}) + {b^ * }} f(x)=i=1mαiyi(xxi)+b
  原始问题是凸二次规划问题,解满足下面的KKT条件:
在这里插入图片描述

发现:对于任意训练样本 ( x i , y i ) ({x_i},{y_i}) (xi,yi),总有 α i = 0 {\alpha _i} = 0 αi=0或者 y i f ( x i ) = 1 {y_i}f({x_i}) = 1 yif(xi)=1,也就是说最终与模型有关的的样本点都位于最大间隔的边界上,我们称之为支持向量。

<think>嗯,用户想用numpy实现线性可分支持向量机SVM的代码示例。首先,我得回忆一下SVM的基本原理,尤其是线性可分的情况。线性可分意味着存在一个超平面能够完全分开两类数据,这时候SVM的目标是找到最大间隔的超平面。 用户可能已经知道SVM的理论,但需要具体的代码实现。所以重点应该放在如何用numpy来编写这个过程。我需要考虑线性SVM的数学模型,比如优化目标函数,约束条件,以及如何将其转化为对偶问题,或者使用梯度下降等方法求解。 根据之前的引用,用户可能看过一些使用OpenCV或现成库的示例,但这里需要的是手动实现。所以,我应该避免调用现成的SVM库,转而用numpy进行数值计算。 首先,确定线性SVM的目标函数。对于线性可分的情况,通常使用硬间隔最大化,即所有样本都正确分类,并且间隔最大。对应的优化问题是一个二次规划问题。不过,手动实现二次规划可能比较复杂,特别是对于刚入门的用户来说。或者,可以考虑使用梯度下降法来求解,这可能更易于用numpy实现。 不过,梯度下降法通常用于软间隔(允许一些错误)的情况,比如使用hinge loss。这时候可以将问题转化为无约束优化,用梯度下降来最小化损失函数加上正则化项。这可能更适合用numpy来实现,因为二次规划需要更复杂的优化步骤,而梯度下降相对容易编码。 所以,可能用户需要的是一个基于梯度下降的线性SVM实现。这样代码结构会比较清晰,也容易用numpy处理矩阵运算。 接下来,步骤大概是这样的: 1. 数据预处理,包括添加偏置项(bias term),将权重和偏置合并为一个向量。 2. 定义损失函数,比如hinge loss加上L2正则化。 3. 计算梯度,进行梯度下降更新参数。 4. 迭代训练直到收敛。 在代码示例中,需要生成线性可分的数据,比如使用numpy生成两类数据点,确保它们是线性可分的。例如,生成正类样本和负类样本,分布在超平面的两侧。 然后,定义模型参数,比如权重向量w,包括偏置项。初始化参数,可能用零初始化或者随机小值。 损失函数部分,hinge loss的计算是max(0, 1 - y_i*(w^T x_i)),然后求和,加上正则化项lambda/(2)*||w||^2。梯度的话,对于每个样本,如果y_i*(w^T x_i) < 1,则梯度为-y_i * x_i,否则为0。然后平均所有样本的梯度,加上正则化项的梯度lambda*w。 然后,使用梯度下降法,更新权重w,直到损失函数收敛或者达到最大迭代次数。 在预测时,计算w^T x,如果结果大于等于0,则为正类,否则为负类。 需要注意的是,线性可分的情况下,正确分类的样本的间隔应该足够大,因此在训练时可能不需要太多迭代就能收敛到最优解。 然后,代码示例的结构大致是: - 生成数据 - 初始化参数 - 定义损失函数和梯度计算 - 梯度下降循环 - 预测函数 - 评估准确率 可能还需要可视化结果,比如画出数据点和决策边界,但用户可能更关注代码的实现,所以可以简化可视化部分,或者用注释说明。 另外,用户可能对数学推导感兴趣,所以需要简要解释SVM的目标和优化过程,以及为什么用梯度下降。 还需要注意,numpy的矩阵运算要高效,避免使用循环,尽量向量化操作。 比如,在计算梯度时,可以使用向量化的方式处理所有样本,而不是逐个样本计算,这样速度更快。 最后,生成相关问题,比如SVM的数学推导、如何处理非线性可分、参数调优等。</think>### 使用 numpy 实现线性可分支持向量机的分步说明 #### 1. SVM 核心数学原理 对于线性可分数据,SVM 的优化目标是最小化权重向量范数: $$ \min_{w,b} \frac{1}{2}||w||^2 \quad \text{s.t.} \quad y_i(w^T x_i + b) \geq 1 $$ 通过拉格朗日乘子法转换为对偶问题求解[^2]。 #### 2. 代码实现步骤 ```python import numpy as np import matplotlib.pyplot as plt # 生成线性可分数据 np.random.seed(42) X_pos = np.random.randn(50, 2) + [3, 3] # 正类样本 X_neg = np.random.randn(50, 2) + [0, 0] # 负类样本 X = np.vstack([X_pos, X_neg]) y = np.hstack([np.ones(50), -np.ones(50)]) # 添加偏置项 X = np.hstack([X, np.ones((100, 1))]) # 初始化参数 w = np.zeros(X.shape[1]) lr = 0.01 # 学习率 epochs = 1000 # 梯度下降训练 for _ in range(epochs): scores = X.dot(w) margins = y * scores # 计算 hinge loss 的梯度 grad = np.zeros_like(w) for i in range(len(y)): if margins[i] < 1: # 违反间隔约束的样本 grad += -y[i] * X[i] grad /= len(y) grad += 0.01 * w # L2 正则化项 w -= lr * grad # 可视化结果 plt.scatter(X_pos[:,0], X_pos[:,1], color='red') plt.scatter(X_neg[:,0], X_neg[:,1], color='blue') # 绘制决策边界 x_vals = np.array([min(X[:,0]), max(X[:,0])]) y_vals = -(w[0]*x_vals + w[2])/w[1] plt.plot(x_vals, y_vals, '--') plt.show() ``` #### 3. 关键实现细节 - 数据预处理:添加偏置项将 $b$ 合并到权重向量 - 梯度计算:仅违反间隔约束的样本参与梯度更新 - 正则化处理:L2 正则化防止过拟合 - 决策边界:由 $w^T x + b = 0$ 推导得出
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值