线性【SVM】数学原理和算法实现

news2024/12/24 9:33:51

一. 数学原理

        SVM是一类有监督的分类算法,它的大致思想是:假设样本空间上有两类点,如下图所示,我们希望找到一个划分超平面,将这两类样本分开,我们希望这个间隔能够最大化来使得模型泛化能力最强。

           如上图所示,正超平面,负超平面和决策超平面的表达式如图所示,假设现在在正负超平面上有Xm和Xn两个支持向量,表达式分别是①,②,①减②得到③,③可以写成④的形式(其中,w向量 = (w1,w2),Xm向量 = (X1m,X2m),Xn向量 = (X1n,X2n))。

         选择假设决策超平面上有Xp = (X1p,X2p)和Xo(X1o,X2o)两个向量,那么可以得到⑤和⑥,⑤-⑥ = ⑦,⑦可以写成⑧的形式。因此w向量是一个垂直于决策超平面的向量,即决策超平面的法向量。

        现在我们再回到④式,可以知道正负超平面之间的距离d可以表示为:d = 2/w的范数。

       现在我们再来看约束条件,所有正超平面上方的点yi = 1,所有负超平面下方的点yi = -1,因此约束表达式可以写成:

所以这个优化问题就转变为一个典型的凸优化问题:

         首先我们使用拉格朗日乘数来将损失函数改写成考虑了约束条件的形式:

        上述式子被称为拉格朗日函数,其中αi就叫做拉格朗日乘数。此时此刻,我们要求解的就不只有参数向量和截距,我们也要求解拉格朗日乘数 ,而我们的Xi和Yi都是我们已知的特征矩阵和标签。对上面的式子分别对w和b求偏导,可以得到下述的结论:

在这里我们引入拉格朗日对偶函数。对于任何一个拉格朗日函数 L(x,α),都存在一个与它对应的对偶函数g(α) ,只带有拉格朗日乘数作为唯一的参数。如果L(x,α)的最优解存在并可以表示为 min L(x,α),并且对偶函数的最优解也存在 并可以表示为max g(α)  ,则我们可以定义对偶差异,即拉格朗日函数的最优解与其对偶函数的最优解之间的差值:

如果 △ = 0,则称L(x,α)与其对偶函数之间存在强对偶关系,此时我们就可以通过求解其对偶函数的最优解来替代求解原始函数的最优解。在这里我们可以通过求对偶函数的最大值得到原函数的最小值。强对偶关系要想存在,必须满足KKT条件:

一旦KKT条件被满足,我们就可以通过求对偶函数的最大值来求出α的值。求出α后我们就可以通过结合上述的表达式求解出w和b,进而得到了决策边界的表达式。得到了决策边界的表达式就可以利用决策边界和其有关的超平面来分类了。

二. 算法实现

我们先来导入相应的模块:

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

使用make_blot函数绘制出散点图的坐标,并用plt.scatter绘制:

X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")#rainbow彩虹色
plt.xticks([])
plt.yticks([])
plt.show()

创建一个子图对象,以便后续操作:

ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图

为了绘制决策超平面,我们通过下面的代码块绘制网格点:

#获取平面上两条坐标轴的最大值和最小值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
 
#在最大值和最小值之间形成30个规律的数据
axisx = np.linspace(xlim[0],xlim[1],30)
axisy = np.linspace(ylim[0],ylim[1],30)
 
axisy,axisx = np.meshgrid(axisy,axisx)
#我们将使用这里形成的二维数组作为我们contour函数中的X和Y
#使用meshgrid函数将两个一维向量转换为特征矩阵
#核心是将两个特征向量广播,以便获取y.shape * x.shape这么多个坐标点的横坐标和纵坐标
 
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
#其中ravel()是降维函数,vstack能够将多个结构一致的一维数组按行堆叠起来
#xy就是已经形成的网格,它是遍布在整个画布上的密集的点
 
plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")
 
#理解函数meshgrid和vstack的作用
a = np.array([1,2,3])
b = np.array([7,8])
#两两组合,会得到多少个坐标?
#答案是6个,分别是 (1,7),(2,7),(3,7),(1,8),(2,8),(3,8)
 
v1,v2 = np.meshgrid(a,b)
 
v1
 
v2
 
v = np.vstack([v1.ravel(), v2.ravel()]).T

接下来通过下面的代码块绘制出决策边界:

#建模,通过fit计算出对应的决策边界
clf = SVC(kernel = "linear").fit(X,y)#计算出对应的决策边界
Z = clf.decision_function(xy).reshape(axisx.shape)
#重要接口decision_function,返回每个输入的样本所对应的到决策边界的距离
#然后再将这个距离转换为axisx的结构,这是由于画图的函数contour要求Z的结构必须与X和Y保持一致

#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图
#画决策边界和平行于决策边界的超平面
ax.contour(axisx,axisy,Z
           ,colors="k"
           ,levels=[-1,0,1] #画三条等高线,分别是Z为-1,Z为0和Z为1的三条线
           ,alpha=0.5#透明度
           ,linestyles=["--","-","--"])
 
ax.set_xlim(xlim)#设置x轴取值
ax.set_ylim(ylim)

可以看到决策边界和正负超平面已经被绘制出来了。

我们可以将上述过程打包成函数:

#将上述过程包装成函数:
def plot_svc_decision_function(model,ax=None):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    x = np.linspace(xlim[0],xlim[1],30)
    y = np.linspace(ylim[0],ylim[1],30)
    Y,X = np.meshgrid(y,x) 
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)
    
    ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"]) 
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
 
#则整个绘图过程可以写作:
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow") # 画散点图
clf = SVC(kernel = "linear").fit(X,y) # 计算决策边界
plot_svc_decision_function(clf) # 画出决策边界

下面是clf的一些属性:

clf.predict(X)
#根据决策边界,对X中的样本进行分类,返回的结构为n_samples
 
clf.score(X,y)
#返回给定测试数据和标签的平均准确度
 
clf.support_vectors_
#返回支持向量坐标
 
clf.n_support_#array([2, 1])
#返回每个类中支持向量的个数

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

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

相关文章

Vulnhub-DC-3 靶机复现完整过程

啰嗦两句: 提权之前完成是一个月前做的,当时在提权处出了点问题就搁置了,今天才完成,所以IP地址可能会会有变化 注意:后续出现的IP地址为192.168.200.55同样是靶机IP地址,若本文能有帮助到你的地方&#xf…

Flutter 07 框架和三棵树(Widgets、Elements和RenderObjects)

一、Flutter框架的整体结构: Flutter是Google推出并开源的跨平台开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语 言开发Flutter应用,一套代码同时运行在ios和Android平台。不仅如此,Flutter还支持Web、桌面、嵌 入应…

论文阅读——What Can Human Sketches Do for Object Detection?(cvpr2023)

论文:https://openaccess.thecvf.com/content/CVPR2023/papers/Chowdhury_What_Can_Human_Sketches_Do_for_Object_Detection_CVPR_2023_paper.pdf 代码:What Can Human Sketches Do for Object Detection? (pinakinathc.me) 一、 Baseline SBIR Fram…

按键开发环境搭建

雷电模拟器 创建虚拟机 2.设置root权限 打开按键精灵连接虚拟机 开启悬浮 mumu模拟器操作 查找端口方法 adb connect 127.0.0.1:16416 设置-应用-所有应用-按键精灵-开启悬浮 步骤二:开启root 处理未root:中途如果有如下未root的情况&#x…

基于单片机的超声波测距仪

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、本课题研究的主要内容二、超声波测距仪的整体方案2.2 超声波测距仪设计原理 三、超声波测距仪系统硬件电路的设计3.1 超声波测距仪的基本结构 四、 超声波测距仪系统的软件设计4.1 主程序软件设计仿真 五、结…

从信号中去除 60 Hz 杂声

美国和其他几个国家/地区的交流电以 60 Hz 的频率振荡。这些振荡通常会破坏测量结果,必须将其减去。 在存在 60 Hz 电力线噪声的情况下,研究模拟仪器的输入的开环电压。电压采样频率为 1 kHz。 load openloop60hertz, openLoop openLoopVoltage;Fs 10…

一文详解:传统企业如何把进销存管理流程搬到线上?

进销存管理是企业管理的核心流程之一,它有助于提高效率、降低成本、增加盈利,同时确保客户满意度,这对于企业的长期成功和竞争力至关重要。但在信息化转型的浪潮下,很多企业的传统进销存流程却遇到不少问题。 如果你也在考虑把进…

JavaEE平台技术——Spring和Spring Boot

JavaEE平台技术——Spring和Spring Boot 1. 控制反转1.1. IoC是什么1.2. IoC能做什么1.3. IoC和DI 2. SpringBean对象定义3. Spring容器4. SpringBoot 在观看这个之前,大家请查阅前序内容。 😀JavaEE的渊源 😀😀JavaEE平台技术——…

【Unity基础】7.动画状态参数

【Unity基础】7.动画状态参数 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)创建动画状态 (1) 创建动画状态 不好意思各位~最近工作比较忙,稍微耽误了这两周的博客。话…

【Mybatis小白从0到90%精讲】09:Mybatis动态SQL:if、where、set标签

文章目录 前言一、if 标签二、where 标签三、set 标签前言 动态SQL 是 Mybatis的亮点功能之一,如果你经历过 拼接SQL 的繁琐痛苦,那么你就能切身感受到动态SQL到底有多爽!真香哈~ 另外,Mybatis将动态SQL设计的如此自然,让人看看就能理解和接受,我想这也是Mybaits如此深…

智慧城市排水系统,管网水位监测仪怎么监测

地下排水管网应用于城市的多个环境之中,比如排放雨水,污水或者是地表水等,总之是在维护城市的安全运行,并且保护城市地下生命线处于正常状态。但是一旦排水系统面对各种极端天气,便有可能会突发安全事故,导…

仿写知乎日报第三周

新学到的 本周新学习了FMDB数据库,并对Masonry的使用有了更近一步的了解,还了解了cell的自适应高度 FMDB数据库的介绍和使用:iOS——FMDB的介绍与使用 cell自适应高度和Mansonry自动布局 本周写了评论区,在写评论区的时候&…

WebSocket Day02 : 握手连接

前言 握手连接是WebSocket建立通信的第一步,通过客户端和服务器之间的一系列握手操作,确保了双方都支持WebSocket协议,并达成一致的通信参数。握手连接的过程包括客户端发起握手请求、服务器响应握手请求以及双方完成握手连接。完成握手连接后…

非线性【SVM】的创建和使用

先来绘制散点图: from sklearn.datasets import make_circles X,y make_circles(100, factor0.1, noise.1) # 100个样本,factor:内圈和外圈的距离之比,noise:噪声 X.shape y.shape plt.scatter(X[:,0],X[:,1],cy,s50,cmap"rainbow&qu…

Python基础入门例程44-NP44 判断列表是否为空(条件语句)

最近的博文: Python基础入门例程43-NP43 判断布尔值(条件语句)-CSDN博客 Python基础入门例程42-NP42 公式计算器(运算符)-CSDN博客 Python基础入门例程41-NP41 二进制位运算(运算符)-CSDN博客…

【斗罗二】木槿被打脸,二级魂导师反击木槿,霍雨浩遭遇挖墙角

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料,《斗罗大陆2绝世唐门》21集最新内容,新生考核结束后,戴华斌的内心对霍雨浩的怨念并没有随着时间的流逝而消散,反而像燎原之火一样越演越烈。他始终耿耿…

UE5——源码阅读——1

UE启动 hInInstance :项目实例 hPrevInstance:项目上一个实例 pCmdLine:参数 nCmdShow:窗口显示 TRACE_BOOKMARK(TEXT(“WinMain.Enter”));:UE用来追踪记录的函数,用于标记应用程序在执行过程中一些特定的…

初识rust

调试下rust 的执行流程 参考: 认识 Cargo - Rust语言圣经(Rust Course) 新建一个hello world 程序: fn main() {println!("Hello, world!"); }用IDA 打开exe,并加载符号: 根据字符串找到主程序入口: 双击…

设计模式_策略模式

策略模式 介绍 设计模式定义案例问题堆积在哪里解决办法策略模式对算法进现封装,抽象 如:IF elseIF 一大堆 可以配合工厂模式使用炼丹炉里做饭 要求 菜谱 和 食材可配置问题在可配置 菜谱封装菜谱 然后抽象菜谱,为了统一使用方法 类图 Cai…

初阶JavaEE(14)表白墙程序

接上次博客:初阶JavaEE(13)(安装、配置:Smart Tomcat;访问出错怎么办?Servlet初识、调试、运行;HttpServlet:HttpServlet;HttpServletResponse)-C…