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 i1,2,3,...,n表示所有的样本。

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

为了使用拉格朗日乘子,将限制条件转换为等式 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)=2w 2i=1sλi(yi(w .xi +b)1pi2)

对各个分量求偏导,并令其为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=1sλ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=1sλ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)1pi2=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 λi0,所以 y i ∗ ( w ⃗ . x i ⃗ + b ) − 1 ⩾ 0 y_i * (\vec{w} . \vec{x_i}+b)-1 \geqslant 0 yi(w .xi +b)10

上面 4 个式子加上 ′ l a m b d a i ⩾ 0 'lambda_i \geqslant 0 lambdai0就是 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)=2wi 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)10
  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(2wi 2yi(w xi +b)1)),其中 λ i ⩾ 0 \lambda_i \geqslant 0 λi0
  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=1sλi21i=1sj=1sλ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=1sλ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,1p)。其中 p = y i ∗ ( w ⃗ ⋅ x i ⃗ + b ) p=y_i *(\vec{w}\cdot \vec{x_i}+b) p=yi(w xi +b)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改

新增操作 正常我们都是从新增功能书写 查看源码 显示的是这个 在vue里面开下来 这样就能显示 点击确定 就能把数据发送到后台进行保存 //弹出添加窗口handleCreate() {this.dialogFormVisible true;},//重置表单resetForm() {},//添加handleAdd() {//绑定的是确定按钮 发起请…

浅谈Qt:跨平台开发的现在与未来

在软件开发领域,跨平台框架一直是热门话题。Qt作为一个成熟且功能丰富的跨平台C开发库,自从1991年由挪威Trolltech公司开发以来,已经走过了30多年的历程。Qt主要用于开发图形用户界面(GUI)程序,同时也支持开…

Educational Codeforces Round 166 (Rated for Div. 2) (A~C)

A. Verify Password 思路:按照ASCLL值进行比较就行(因为字母的ASCLL本来就在数字后面),所以,只要找到前面比后面的数大就输出NO,反之YES 代码实现: #include<bits/stdc.h> using namespace std; #define N 100005 typedef long long ll; ll n, m, num, sum, t; ll a[N]…

[力扣题解] 257. 二叉树的所有路径

题目&#xff1a;257. 二叉树的所有路径 思路 前序遍历 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x)…

电脑死机问题排查

情况描述&#xff1a;2024年6月2日下午16&#xff1a;04分电脑突然花屏死机&#xff0c;此情况之前遇到过三次&#xff0c;认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息&#xff1a;应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…

整理好了!2024年最常见 20 道 Kafka面试题(二)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Kafka面试题&#xff08;一&#xff09;-CSDN博客 三、请解释Kafka中的生产者&#xff08;Producer&#xff09;和消费者&#xff08;Consumer&#xff09;。 在Kafka中&#xff0c;生产者&#xff08;Produce…

微信小程序的优劣势

微信小程序的优劣势可以归纳如下&#xff1a; 优势&#xff1a; 快速部署与低成本&#xff1a; 微信小程序允许商家快速搭建线上店铺&#xff0c;大大缩短了上线时间和开发周期&#xff0c;降低了初期投入成本。商家可以根据自身需求选择合适的模板&#xff0c;并进行个性化设…

C++设计模式|结构型 代理模式

1.什么是代理模式&#xff1f; 代理模式Proxy Pattern是一种结构型设计模式&#xff0c;用于控制对其他对象的访问。 在代理模式中&#xff0c;允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对这个对象的…

牛客周赛 Round 45VP

这场应该是十分仁慈的一场了 1.签到&#xff1a;https://ac.nowcoder.com/acm/contest/84244/A AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a,b,c,d,e; int main() {cin>>a>>b>>c>>d>>e;int sabcde;if(s>1…

【Hive SQL 每日一题】统计每月用户购买商品的种类分布

文章目录 测试数据需求说明需求实现 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,user_id INT,product_id INT,order_date STRING );-- 插入 orders 数据 INSERT INTO orders VALUES (101, 1, 1001, 2023-01-01), (102, 1, 1…

张大哥笔记:下一个风口是什么?

我们经常会问&#xff0c;下一个风口是什么&#xff1f;我们可以大胆预测一下&#xff0c;2024年的风口是什么呢&#xff1f; 40年前&#xff0c;如果你会开车&#xff0c;那就是响当当的铁饭碗&#xff1b; 30年前&#xff0c;如果你会英语和电脑&#xff0c;那也绝对是个人才…

装饰器,状态管理和if判断(HarmonyOS学习第六课)

Builder装饰器-自定义构建函数 前面介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使方法进行数据传递。ArkUI还提供了一种更轻量的UI 元素复用机制Builder&#xff0c;Builder 所装饰的函数遵循build( )函数语法规则&#xff0c;开发者可以将重…

网络遗忘权的实现方法

网络遗忘权的实现方法 目录 从禁书说起 从销毁硬件信息的方法得到的启示 现在网络遗忘权的实现方法 从禁书说起 古代有禁书的需求,直接的方法就是贴出告示,强行收缴,然后付之一炬. 这个方法的问题在于只要有一个人敢冒死藏书,再次手抄或者是印刷,就 会让之前的禁书努力,付…

nrf52832 esb 2.4G通信 一对多 改频道

若想支持更多客户端&#xff0c;可通过修改通道号及频率的方式&#xff0c; 同频道下&#xff0c;最多支持8个通道&#xff0c;若想支持更多的设备&#xff0c;接收端需要修改频道&#xff0c;与发送端保持一致&#xff1b; 常用函数&#xff1a; bool nrf_esb_set_enabled_p…

制作ChatPDF之后端Node搭建(三)

后端Node搭建 接上篇:制作ChatPDF之前端Vue搭建&#xff08;二&#xff09; 项目结构 下面是项目的结构图&#xff0c;包括前端 (Vue.js) 和后端 (Node.js) 的项目结构。 pdf-query-app/ ├── frontend/ │ ├── public/ │ │ ├── index.html │ ├── sr…

[Qt学习笔记]Qtxlsx在Qt下的配置和调用

背景分析 Qt操作Excel文件一般有QAxObject和QtXlsx两种方法&#xff0c;前者需要调用wps或office组件进行读写操作&#xff0c;具有一定的局限性&#xff0c;下面列出两种方法的优缺点对比 QAxObject&#xff1a; 优点&#xff1a;支持xls和xlsx等版本。office组件读写速度快&…

Java Map遍历方法(Map的Iterator原理)

Map中存放数据的Key-Value实质上就是Node节点&#xff0c;而 底层是hash数组和链表(或树)&#xff0c;不容易遍历。 一、containsKey() 和 get()查找元素 这两个方法可以获得信息&#xff0c;但是依旧不能轻松遍历。 containsKey()方法判断对应的key是否存在&#xff1b; get()…

unsigned char*和const char*的一些问题

1.可以返回字符串常量&#xff0c;但是不能返回char buf[BUF_SIZE] char* get_str(){char* str "hello world";return str; }char* get_str(){char str[32] {0};strcpy(str, "hello world");return str; }//err 2.联合体不能用指针&#xff0c;也…

franka panda 使用moveit 进行规划时经常出现规划路径错误的问题

在Python程序中使用MoveIt进行机器人运动规划时&#xff0c;可以通过moveit_commander和moveit_msgs等库来修改规划参数。以下是一些可以设置的关键参数&#xff1a; Planning Time (allowed_planning_time): 指定规划算法可以运行的最大时间。 Goal Constraints (goal_constr…