【机器学习】支持向量机(个人笔记)

文章目录

  • SVM 分类器的误差函数
    • 分类误差函数
    • 距离误差函数
    • C 参数
  • 非线性边界的 SVM 分类器(内核方法)
    • 多项式内核
    • 径向基函数(RBF)内核

源代码文件请点击此处!

SVM 分类器的误差函数

SVM 使用两条平行线,使用中心线作为参考系 L :   w 1 x 1 + w 2 x 2 + b = 0 L: \ w_1x_1 + w_2x_2 + b = 0 L: w1x1+w2x2+b=0。我们构造两条线,一条在上面,一条在下面,分别为:

L + :   w 1 x 1 + w 2 x 2 + b = 1 L − :   w 1 x 1 + w 2 x 2 + b = − 1 L+: \ w_1x_1 + w_2x_2 + b = 1 \\ L-: \ w_1x_1 + w_2x_2 + b = -1 L+: w1x1+w2x2+b=1L: w1x1+w2x2+b=1

分类器由 L + L+ L+ L − L- L 组成。为训练 SVM,我们需要为由两条线组成的分类器构建一个误差函数,期望达成的目标有两个:

  • 两条线中的每一条都应尽可能对点进行分类。
  • 两条线应尽可能彼此远离。

误差函数表示如下:

误差 = 分类误差 + 距离误差 误差 = 分类误差 + 距离误差 误差=分类误差+距离误差

分类误差函数

( x 1 , x 2 ) (x_1, x_2) (x1,x2) 的预测函数为

y ^ = s t e p ( w 1 x 1 + w 2 x 2 + b ) \hat{y} = step(w_1x_1 + w_2x_2 + b) y^=step(w1x1+w2x2+b)

显然这是一个离散感知器,其中:

y = s t e p ( x ) = { 0 , x ≤ 0 1 , x > 0 y = step(x) = \begin{cases} 0, x \leq 0 \\ 1, x > 0 \end{cases} y=step(x)={0,x01,x>0

定义分类误差函数如下:

{ 0 , 错误分类 ∣ w 1 x 1 + w 2 x 2 + b ∣ , 正确分类 \begin{cases} 0, 错误分类 \\ |w_1x_1 + w_2x_2 + b|, 正确分类 \end{cases} {0,错误分类w1x1+w2x2+b,正确分类

例如,考虑标签为 0 0 0 的点 ( 4 , 3 ) (4,3) (4,3),两个感知器给出的预测为:

L + : y ^ = s t e p ( 2 x 1 + 3 x 2 − 7 ) = 1 L − : y ^ = s t e p ( 2 x 1 + 3 x 2 − 5 ) = 1 L+: \hat{y} = step(2x_1 + 3x_2 - 7) = 1 \\ L-: \hat{y} = step(2x_1 + 3x_2 - 5) = 1 L+:y^=step(2x1+3x27)=1L:y^=step(2x1+3x25)=1

可以看到两个感知器均预测错误,此时分类误差为:

∣ 2 x 1 + 3 x 2 − 7 ∣ + ∣ 2 x 1 + 3 x 2 − 5 ∣ = 22 |2x_1 + 3x_2 - 7| + |2x_1 + 3x_2 - 5| = 22 ∣2x1+3x27∣+∣2x1+3x25∣=22

距离误差函数

若两个线性方程如下:

L + :   w 1 x 1 + w 2 x 2 + b = 1 L − :   w 1 x 1 + w 2 x 2 + b = − 1 L+: \ w_1x_1 + w_2x_2 + b = 1 \\ L-: \ w_1x_1 + w_2x_2 + b = -1 L+: w1x1+w2x2+b=1L: w1x1+w2x2+b=1

根据两条平行直线间的距离公式:

d = ∣ C 1 − C 2 ∣ A 2 + B 2 d = \frac{|C_1 - C_2|}{\sqrt{A^2 + B^2}} d=A2+B2 C1C2

则这两条平行线的垂直距离为:

d = 2 w 1 2 + w 2 2 d = \frac{2}{\sqrt{w_1^2 + w_2^2}} d=w12+w22 2

此为距离误差。注意到,当 w 1 2 + w 2 2 w_1^2 + w_2^2 w12+w22 很大时, d d d 很小;当 w 1 2 + w 2 2 w_1^2 + w_2^2 w12+w22 很小时, d d d 很大。因此 w 1 2 + w 2 2 w_1^2 + w_2^2 w12+w22 是一个很好的误差函数。

C 参数

很多时候我们希望 SVM 分类器能侧重于分类误差或距离误差其中一个方面,那么我们可以使用 C 参数:

误差 = C ⋅ 分类误差 + 距离误差 误差 = C \cdot 分类误差 + 距离误差 误差=C分类误差+距离误差

C 参数如何控制两者的呢?

  • C 很大:误差公式以分类误差为主,SVM 分类器更侧重于对点进行正确分类;
  • C 很小:误差公式以距离误差为主,SVM 分类器更侧重于保持线之间的距离。

下面是一个例子:

svm_c_001 = SVC(kernel='linear', C=0.01)
svm_c_001.fit(features, labels)
 
svm_c_100 = SVC(kernel='linear', C=100)
svm_c_100.fit(features, labels)

上图为 C=0.01 的情况,下图为 C=100 的情况:

在这里插入图片描述

在这里插入图片描述

非线性边界的 SVM 分类器(内核方法)

多项式内核

  • 在变量 x 1 , x 2 x_1, x_2 x1,x2 使用 2 阶多项式内核,就需要计算这些单项式: x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 x_1, x_2, x_1^2, x_1x_2, x_2^2 x1,x2,x12,x1x2,x22,然后尝试把它们线性组合起来,比如通过检查发现这是一个有效的分类器公式: x 1 2 + x 2 2 = 1 x_1^2 + x_2^2 = 1 x12+x22=1
  • 这相当于将二维平面映射到一个五维平面,即点 ( x 1 , x 2 ) (x_1, x_2) (x1,x2) 到点 ( x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 ) (x_1, x_2, x_1^2, x_1x_2, x_2^2) (x1,x2,x12,x1x2,x22) 的映射
  • 类似地,在变量 x 1 , x 2 x_1, x_2 x1,x2 使用 3 阶多项式内核,就需要计算这些单项式: x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 , x 1 3 , x 1 2 x 2 , x 1 x 2 2 , x 2 3 x_1, x_2, x_1^2, x_1x_2, x_2^2, x_1^3, x_1^2x_2, x_1x_2^2, x_2^3 x1,x2,x12,x1x2,x22,x13,x12x2,x1x22,x23,然后尝试把它们线性组合起来,通过检查发现一个有效的分类器公式

代码如下:

svm_degree_2 = SVC(kernel='poly', degree=2)
svm_degree_2.fit(features, labels)
print("[Degree=2] Accuracy=", svm_degree_2.score(features, labels))

svm_degree_4 = SVC(kernel='poly', degree=4)
svm_degree_4.fit(features, labels)
print("[Degree=4] Accuracy=", svm_degree_4.score(features, labels))

当分类器为 2 阶多项式的运行结果:

在这里插入图片描述

当分类器为 4 阶多项式的运行结果:

在这里插入图片描述

径向基函数(RBF)内核

径向基函数:

  • 当变量只有一个时,最简单的径向基函数为 y = e − x 2 y = e^{-x^2} y=ex2,此函数看起来像标准正态分布,函数凸起处为 x = 0 x=0 x=0
  • 当变量有 2 个时,最简单的径向基函数为 z = e − ( x 2 + y 2 ) z = e^{-(x^2 + y^2)} z=e(x2+y2),此函数看起来像标准正态分布,函数凸起处为 ( 0 , 0 ) (0,0) (0,0)
  • 当变量有 n n n 个时,基本径向基函数为 y = e − ( x 1 2 + . . . + x n 2 ) y = e^{-(x_1^2 + ... + x_n^2)} y=e(x12+...+xn2) n n n 维凸点以 0 为中心
  • 若希望以点 ( p 1 , . . . , p n ) (p_1, ..., p_n) (p1,...,pn) 为中心凸起,则基本径向基函数为 y = e − [ ( x 1 − p 1 ) 2 + . . . + ( x n − p n ) 2 ] y = e^{-[(x_1-p_1)^2 + ... + (x_n-p_n)^2]} y=e[(x1p1)2+...+(xnpn)2]
  • 添加 γ \gamma γ 参数: y = e − γ [ ( x 1 − p 1 ) 2 + . . . + ( x n − p n ) 2 ] y = e^{-\gamma[(x_1-p_1)^2 + ... + (x_n-p_n)^2]} y=eγ[(x1p1)2+...+(xnpn)2],用于控制拟合程度(形象理解,即调整凸起程度
    • γ \gamma γ 值非常小时,模型会欠拟合
    • γ \gamma γ 值非常大时,模型会严重过拟合,合适的 γ \gamma γ 值非常重要

相似度公式:

  • 对于点 p p p 和点 q q q 相似度 ( p , q ) = e − 距离 ( p , q ) 2 相似度(p,q) = e^{-距离(p,q)^2} 相似度(p,q)=e距离(p,q)2
  • 一维数据集中,点 x 1 x_1 x1 和点 x 2 x_2 x2 的相似度为 e − ( x 1 − x 2 ) 2 e^{-(x_1-x_2)^2} e(x1x2)2
  • 二维数据集中,点 A ( x 1 , y 1 ) A(x_1, y_1) A(x1,y1) 和点 B ( x 2 , y 2 ) B(x_2, y_2) B(x2,y2) 的相似度为 e − [ ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 ] e^{-[(x_1-x_2)^2 + (y_1-y_2)^2]} e[(x1x2)2+(y1y2)2]
  • 若该数据集有 n n n 个数据点,则应计算 n 2 n^2 n2 个相似度;每个点到自身的相似度一定为 1;距离越近,相似度越高

有了相似度公式,就可以定义分类器了。假设数据集有 n n n 个数据点 X i X_i Xi,每个点对应标签 L i L_i Li(取值为 0 或 1),则对于点 X X X 的分类预测如下:

y ^ = s t e p [ ∑ i = 1 n ( − 1 ) L i − 1 ⋅ e − 距离 ( X , X i ) 2 ] \hat{y} = step[\sum^n_{i=1} (-1)^{L_i - 1} \cdot e^{-距离(X, X_i)^2}] y^=step[i=1n(1)Li1e距离(X,Xi)2]

形象理解:这相当于在一个二维平面上,为标记为 0 的点添加了一个“山谷”,为标记为 1 的点添加了一个“山峰”。对每个点都如此操作,最后使用阈值 0 画出一个“海岸线”,这就是最后的分类边界(boundary)。

代码如下:

svm_gamma_01 = SVC(kernel='rbf', gamma=0.1)
svm_gamma_01.fit(features, labels)
print("[Gamma=0.1] Accuracy=", svm_gamma_01.score(features, labels))

svm_gamma_1 = SVC(kernel='rbf', gamma=1)
svm_gamma_1.fit(features, labels)
print("[Gamma=1] Accuracy=", svm_gamma_1.score(features, labels))


svm_gamma_10 = SVC(kernel='rbf', gamma=10)
svm_gamma_10.fit(features, labels)
print("[Gamma=10] Accuracy=", svm_gamma_10.score(features, labels))


svm_gamma_100 = SVC(kernel='rbf', gamma=100)
svm_gamma_100.fit(features, labels)
print("[Gamma=100] Accuracy=", svm_gamma_100.score(features, labels))

γ = 0.1 \gamma=0.1 γ=0.1 时的运行结果:
在这里插入图片描述

γ = 1 \gamma=1 γ=1 时的运行结果:

在这里插入图片描述

γ = 10 \gamma=10 γ=10 时的运行结果:

在这里插入图片描述

γ = 100 \gamma=100 γ=100 时的运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Edge

目录 1.概述 1.1.什么是浏览器 1.2.浏览器的作用 2.Edge 2.1.什么是Edge 2.2.诞生背景 2.3.历史版本 2.4.作用 2.5.优缺点 2.5.1.优点 2.5.2.缺点 3.对比 3.1.和360浏览器的对比 3.2.和谷歌浏览器(Chrome)的对比 4.未来展望 5.总结 1.概…

构建稳定高效的消息传递中间件:消息队列系统的设计与实现

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 一、引言 二、设计目标 2.1、高可用性 1. 集群搭建 1.1 …

【ai】blender4.1 安装插件

开源软件,所以资料充足插件及配置 下载插件插件是python开发的 编辑中的偏好设置 点击选中 点击一键切换中文英文 切换主题 插件源码

R语言统计分析——图形文本、自定义坐标轴和图例

参考资料&#xff1a;R语言实战【第2版】 我们可以在图形上添加标题&#xff08;main&#xff09;、副标题&#xff08;sub&#xff09;、坐标轴标签&#xff08;xlab、ylab&#xff09;并指定标轴范围&#xff08;xlim、ylim&#xff09;。 # 录入数据 dose<-c(20,30,40,4…

Go API

Go语言提供了大量的标准库&#xff0c;因此 google 公司也为这些标准库提供了相应的API文档&#xff0c;用于告诉开发者如何使用这些标准库&#xff0c;以及标准库包含的方法。官方位置&#xff1a;https://golang.org Golang中文网在线标准库文档: https://studygolang.com/p…

函数递归(C语言)(详细过程!)

函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么 递归是学习C语言很重要的一个知识&#xff0c;递归就是函数自己调用自己&#xff0c;是一种解决问题…

与浪涌保护器相关的8/20μs和10/350μs波形

8/20μs和10/350μ是到底是什么&#xff1f; 浪涌保护器中有个极为重要的参数&#xff0c;8/20μs或10/350μs。浪涌保护器的作用主要是保护电子设备免受电源浪涌或瞬态电压影响的重要装置。主要应对雷击&#xff0c;包括直击雷和感应雷。由于直击雷和感应雷的能量不一样&…

RabbitMQ实践——在Ubuntu上安装并启用管理后台

大纲 环境安装启动管理后台 RabbitMQ是一款功能强大、灵活可靠的消息代理软件&#xff0c;为分布式系统中的通信问题提供了优秀的解决方案。无论是在大规模数据处理、实时分析还是微服务架构中&#xff0c;RabbitMQ都能发挥出色的性能&#xff0c;帮助开发者构建高效、稳定的系…

《Windows API每日一练》3.3 更好效果的滚动条

本节讲述滚动条的复杂使用方法&#xff0c;以便达到更好的效果。Windows操作系统提供了两套机制&#xff0c;一套机制是使用默认的对象属性进行简单的操作&#xff0c;并提供简单便捷的API接口函数。另一套机制是用户可以自定义对象属性&#xff0c;实现自己想要的效果。本节我…

【ARM Cache 及 MMU 系列文章 6.1 -- Cache maintenance 指令及相关寄存器有哪些?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Cache Maintenance registers and instructionsDCZID_EL0DCZID_EL0寄存器字段解释 DCZ 使用场景Cache maintenance 范围选择 Cache maintenance 指令集 Cache Maintenance registers a…

公司活动想找媒体报道宣传怎样邀请媒体?

在当今信息爆炸的时代,对于正处于成长阶段的中小企业而言,有效且成本控制得当的宣传策略是推动品牌发展、扩大市场影响力的关键。尤其是在预算有限的情况下,如何让“好钢用在刀刃上”,实现宣传效果的最大化,成为众多企业共同面临的挑战。在此背景下,智慧软文发布系统网站作为一…

IDEA 高效插件工具

文章目录 LombokMaven Helper 依赖冲突any-rule(正则表达式插件)快速生成javadocGsonFormat (Aits) 将json解析成类Diagrams使用 类图SequenceDiagram时序图GenerateAllSetter&#xff08;AltEnter&#xff09;大小写转写String ManipulationGitToolBox 代码提交人activate-pow…

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …

springboot的WebFlux 和Servlet

Spring Boot 中的 Servlet 定义&#xff1a; 在 Spring Boot 中&#xff0c;Servlet 应用程序通常基于 Spring MVC&#xff0c;它是一个基于 Servlet API 的 Web 框架。Spring MVC 提供了模型-视图-控制器&#xff08;MVC&#xff09;架构&#xff0c;用于构建 Web 应用程序。…

颠覆与创新:探寻Facebook未来的发展路径

Facebook&#xff0c;这个曾经引领社交网络革命的巨头&#xff0c;在如今竞争激烈的科技市场中&#xff0c;正面临着前所未有的挑战和机遇。如何在不断变化的数字世界中保持竞争力&#xff0c;成为业界领先者&#xff0c;这是摆在Facebook面前的重要课题。本文将探寻Facebook未…

STM32项目分享:车牌号识别系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.…

【Mac】增加 safari 体验的插件笔记

Safari 本身的功能不全面&#xff0c;探索积累了一点插件笔记&#xff0c;提升使用体验&#xff1b;但后面因为插件或会影响运行速度&#xff0c;就全部都禁止了。做个笔记记录一下。 Cascadea 相当于 stylus&#xff0c;可以自定义页面。测试过几个&#xff0c;只有几个可行。…

Linux so文件无法找到及某条命令找不到的解决办法

前言 在一些定制软件中可能会自带so文件。或者自带一些二进制命令。 这时会如果运行某个程序会发生 **.so 文件无法找到的错误。 以及 * 某条命令无法找到的错误。 比如像是下面这样 解决办法&#xff1a; so文件无法找到 通过往 LD_LIBRARY_PATH 变量中追加路径来告诉程序…

数组还可以这样用!常用但不为人知的应用场景

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Linux:多线程的操作

多线程操作 进程与线程线程的创建 create_pthread创建线程池给线程传入对象的指针 线程等待 pthread_join退出线程 pthread_exit线程等待参数 retval 与 线程退出参数 retval 线程中断 pthread_cancel获取线程编号 pthread_self线程分离 pthread_detach 进程与线程 进程是资源…