线性可分支持向量机代码 举例说明 具体的变量数值变化

news/2025/7/9 4:18:18/
### 实现线性可分支持向量机
### 硬间隔最大化策略
class Hard_Margin_SVM:### 线性可分支持向量机拟合方法def fit(self, X, y):# 训练样本数和特征数m, n = X.shape# 初始化二次规划相关变量:P/q/G/hself.P = matrix(np.identity(n + 1, dtype=np.float))self.q = matrix(np.zeros((n + 1,), dtype=np.float))self.G = matrix(np.zeros((m, n + 1), dtype=np.float))self.h = -matrix(np.ones((m,), dtype=np.float))# 将数据转为变量self.P[0, 0] = 0for i in range(m):self.G[i, 0] = -y[i]self.G[i, 1:] = -X[i, :] * y[i]# 构建二次规划求解sol = solvers.qp(self.P, self.q, self.G, self.h)# 对权重和偏置寻优self.w = np.zeros(n,) self.b = sol['x'][0] for i in range(1, n + 1):self.w[i - 1] = sol['x'][i]return self.w, self.b### 定义模型预测函数def predict(self, X):return np.sign(np.dot(self.w, X.T) + self.b)

通过一个具体的示例来展示硬间隔支持向量机的代码是如何运行的,并为每个变量提供具体的数据样例。

示例数据和解释

假设我们有如下的二维数据集,其中每个样本有两个特征(即二维坐标),并且样本属于两个类别 y ∈ { − 1 , 1 } y \in \{-1, 1\} y{1,1}。我们将使用硬间隔支持向量机来找到一个最大化分类间隔的超平面。

示例数据

特征矩阵 X X X(每一行是一个样本的坐标):

X = np.array([[1, 2],[2, 3],[3, 3],[2, 1],[3, 2]
])

标签向量 y y y(每个样本的类别标签):

y = np.array([1, 1, 1, -1, -1])

这个数据集包含 5 个样本,分别对应两个类别(1 和 -1)。前 3 个样本属于类别 + 1 +1 +1,后两个样本属于类别 − 1 -1 1

代码中的每个变量解释

让我们一步步来分析代码中的每个变量。

(1) 训练样本数和特征数
m, n = X.shape

X.shape 返回 m m m n n n,分别表示样本数量和特征数量:

  • m = 5 m = 5 m=5 表示有 5 个样本。
  • n = 2 n = 2 n=2 表示每个样本有 2 个特征(二维数据)。
(2) 初始化二次规划相关矩阵
self.P = matrix(np.identity(n + 1, dtype=np.float))
self.q = matrix(np.zeros((n + 1,), dtype=np.float))
self.G = matrix(np.zeros((m, n + 1), dtype=np.float))
self.h = -matrix(np.ones((m,), dtype=np.float))

我们将定义二次规划问题的参数矩阵:

  • self.P:用于构建目标函数的二次项 1 2 w T P w \frac{1}{2} w^T P w 21wTPw,在支持向量机中,目标是最小化 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2,因此 P P P 是一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1) 的单位矩阵(表示 w 1 , w 2 w_1, w_2 w1,w2 b b b)。

    self.P = np.identity(3)  # 2 个特征 + 1 个偏置
    # 输出
    [[1. 0. 0.][0. 1. 0.][0. 0. 0.]]
    
  • self.q:表示线性项 q q q,其值为 0,因为硬间隔 SVM 中我们只需要最小化 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2,不需要其他线性项。

    self.q = np.zeros(3)
    # 输出
    [0. 0. 0.]
    
  • self.Gself.h:这些是约束条件,用于确保每个样本都正确分类并满足硬间隔条件 y i ( w T x i + b ) ≥ 1 y_i(w^T x_i + b) \geq 1 yi(wTxi+b)1

    self.G = np.zeros((5, 3))  # 5 个样本,每个样本对应 (w1, w2, b)
    self.h = -np.ones(5)       # 对应每个样本的约束
    # 输出 G 和 h
    G = [[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]]
    h = [-1. -1. -1. -1. -1.]
    
(3) 构建约束矩阵 G G G h h h

接下来,我们要根据数据构建约束条件:

self.P[0, 0] = 0  # 偏置 b 不需要惩罚
for i in range(m):self.G[i, 0] = -y[i]  # 对偏置项的影响self.G[i, 1:] = -X[i, :] * y[i]  # 对 w 的影响

每一行 G [ i ] G[i] G[i] 对应样本 X [ i ] X[i] X[i] 的约束 y i ( w T x i + b ) ≥ 1 y_i(w^T x_i + b) \geq 1 yi(wTxi+b)1

样本 X X X标签 y y y约束条件
(1, 2)1 w 1 ⋅ 1 + w 2 ⋅ 2 + b ≥ 1 w_1 \cdot 1 + w_2 \cdot 2 + b \geq 1 w11+w22+b1
(2, 3)1 w 1 ⋅ 2 + w 2 ⋅ 3 + b ≥ 1 w_1 \cdot 2 + w_2 \cdot 3 + b \geq 1 w12+w23+b1
(3, 3)1 w 1 ⋅ 3 + w 2 ⋅ 3 + b ≥ 1 w_1 \cdot 3 + w_2 \cdot 3 + b \geq 1 w13+w23+b1
(2, 1)-1 − w 1 ⋅ 2 − w 2 ⋅ 1 − b ≥ 1 -w_1 \cdot 2 - w_2 \cdot 1 - b \geq 1 w12w21b1
(3, 2)-1 − w 1 ⋅ 3 − w 2 ⋅ 2 − b ≥ 1 -w_1 \cdot 3 - w_2 \cdot 2 - b \geq 1 w13w22b1

更新后的 G G G 矩阵和 h h h 向量为:

self.G = [[-1. -1. -2.]  # 对应第一个样本的约束[-1. -2. -3.]  # 对应第二个样本的约束[-1. -3. -3.]  # 对应第三个样本的约束[ 1.  2.  1.]  # 对应第四个样本的约束[ 1.  3.  2.]] # 对应第五个样本的约束
self.h = [-1. -1. -1. -1. -1.]
(4) 使用二次规划求解

使用 cvxopt.solvers.qp 进行求解:

sol = solvers.qp(self.P, self.q, self.G, self.h)

这个函数会求解二次规划问题,返回包含最优解的字典 sol

(5) 提取权重和偏置

从求解结果中提取权重 w w w 和偏置 b b b

self.w = np.zeros(n,)
self.b = sol['x'][0]  # 偏置 b
for i in range(1, n + 1):self.w[i - 1] = sol['x'][i]  # 提取权重 w

假设 sol['x'] 返回如下最优解:

sol['x'] = [1.5, 0.5, -0.5]

则:

  • self.b = 1.5 是偏置项。
  • self.w = [0.5, -0.5] 是权重向量 w 1 = 0.5 w_1 = 0.5 w1=0.5 w 2 = − 0.5 w_2 = -0.5 w2=0.5

6. 使用模型进行预测

def predict(self, X):return np.sign(np.dot(self.w, X.T) + self.b)

假设我们用训练好的模型对样本进行预测,预测公式为:
y 预测 = sign ( w T x + b ) y_{\text{预测}} = \text{sign}(w^T x + b) y预测=sign(wTx+b)

例如,输入样本 X = [ 1 , 2 ] X = [1, 2] X=[1,2],计算 y 预测 y_{\text{预测}} y预测
y 预测 = sign ( 0.5 ⋅ 1 + ( − 0.5 ) ⋅ 2 + 1.5 ) = sign ( 0.5 + ( − 1 ) + 1.5 ) = sign ( 1.0 ) = 1 y_{\text{预测}} = \text{sign}(0.5 \cdot 1 + (-0.5) \cdot 2 + 1.5) = \text{sign}(0.5 + (-1) + 1.5) = \text{sign}(1.0) = 1 y预测=sign(0.51+(0.5)2+1.5)=sign(0.5+(1)+1.5)=sign(1.0)=1

模型预测结果为正类 + 1 +1 +1

总结

  • 数据:输入的训练数据 X X X 和标签 y y y
  • 目标:通过二次规划找到最优的超平面参数 w w w b b b
  • 预测:使用得到的模型参数 w w w b b b 对新数据进行预测。

另一篇文章是对这段代码的整体说明:线性可分支持向量机代码实现


http://www.ppmy.cn/news/1543402.html

相关文章

程序员工作七年,我踩过的那七个坑

作者:东东拿铁 引言 今天想聊聊,自己在7年工作中踩过坑的7件事情。 一、不会问问题 一杯茶一包烟,一个bug改一天。 程序员面对技术难题是非常正常的事情,谁还没有碰见问题束手无策的时候呢。 记得刚工作的时候,我…

机器人技术基础(4章逆运动解算和雅克比矩阵)

逆运动解算: 雅克比矩阵: 将动力学分析转向运动的物体 下图中的 n o y 反映了机器人的姿态矩阵, 最后一列 p 反应了机器人在空间中的位置:

YOLOv4和Darknet实现坑洼检测

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【MobileViT实现垃圾分类】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现mni…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案: 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…

Spring Cache-基于注解的缓存

Spring Cache 是 Spring 提供的缓存抽象框架,能够将数据缓存到内存或外部缓存中,减少数据库或远程服务的访问频率,从而显著提升应用性能。Spring Cache 通过注解的方式实现缓存逻辑,使用方便,支持多种缓存实现&#xf…

Python中除了matplotlib外还有哪些数据可视化的库?

matplotlib算是python比较底层的可视化库,可定制性强、图表资源丰富、简单易用、达到出版质量级别。 其它的可视化库诸如:seaborn、pyecharts、ggplot、plotnine、holoviews、basemap、altair、pyqtgraph、pygal、vispy、networkx、plotly、bokeh、geop…

【牛客算法】某司面试算法题:循环右移二叉树

一、算法题描述 1.1 算法描述 现有一棵n个节点构成的二叉树,请你将每一层的节点向右循环位移k位。某层向右位移一位(即k1)的含义为: 若当前节点为左孩子节点,会变成当前节点的双亲节点的右孩子节点。 若当前节点为右儿子,会变成…

2024年三个月自学网络安全(黑客技术)学习指南。

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、…