关于支持向量机的一份介绍

news2024/9/20 0:45:35

在这篇文章中,我将介绍与支持向量机有关的东西,我们知道支持向量机主要分两类,就是线性支持向量机核支持向量机这两种(当然还有其他的,如多类支持向量机、 Nu-Support Vector Regression等),因此我将介绍它俩的联系与区别,但首先将会详细介绍它俩有关的知识及python实现。

一、 线性支持向量机

1.1 概念

线性支持向量机(Linear Support Vector Machine, Linear SVM)是一种用于分类和回归分析的监督学习模型,特别适用于数据在特征空间中是线性可分的情况。

线性SVM原本可用于进行二分类任务,但如果进行“一对多”等处理后,也可进行多分类任务。

下图就是iris数据集进行SVM后的图像:

1.2 数学模型

关于线性SVM的数学模型可以分为三来来看,分别是决策函数、原问题以及对偶问题。

(1)决策函数

线性SVM的决策函数是用来预测新输入样本所属类别的函数。在求解线性SVM的对偶问题之后,我们得到一系列拉格朗日乘子 αi,这些乘子用于构建最终的决策函数。其中拉格朗日乘子是对偶问题里的,暂且不谈。

我们知道SVM是用于划分类别的,所以我们可以用一个线性组合来描述:

我们将其记为:(W,b)。这样就会诞生一个空间中任意点到超平面的距离r。

然后我们假设这个超平面能正确分类样本,即方才的线性组合>0时,有yi = +1;反之小于0时,有yi = -1。

那么我将这个线性组合重写下就是:

如果用sign函数来表示,可以是这样:

(2)原问题

首先我们知道SVM问题就是一个优化问题,旨在数据线性可分的情况下去寻找一个最优的超平面将之划分,并使间隔最大化。

其中,距离超平面最近的几个训练样本使得其决策函数成立,它们就被称为是“支持向量”。而两个异类支持向量到超平面的和就是“间隔”。

为了间隔最大化,就有了原问题,所以可以写出以下式子:

(3)对偶问题

关于刚才的问题,我们要知道如果直接就用那些式子去找最优超平面会很复杂,所以我们我们需要对偶问题来帮助我们。而在对偶问题中就需要拉格朗日乘子,关于这个乘子,我们则需要了解下拉格朗日函数。

假如我们有目标函数f(x,y),我们要找到它的极值,但同时又存在一个g(x,y)=c(c为常数)来对其进行约束的话,我们就可以构造一个新函数来解决,这个新函数就是拉格朗日函数,表达式如下:

其中的λ(lambda)就是拉格朗日乘子。

而要解决这个式子就需要让其梯度为0,如下:

然后有:

最后就可分别求得x、y、λ的值了。

那么我们就来求取在对偶条件下的线性SVM的模型:

我们已知拉格朗日函数的形式,那么我们将相应的函数带入即可。首先是目标函数,因为我们要求取一个最优超平面,所以将刚才的原问题中的模型带入到f(x,y)的位置;然后是约束函数,因为要让间隔最大化,所以需要约束条件如此确保间隔的最大化;接下来是常数C,一般在没有先验条件的前提下,我们都会使用1作为默认值。(当C越大,模型越倾向于减少分类错误,C越小,模型的泛化能力越强)

那么就有了最后的模型:

1.3 python实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载Iris数据集
iris = load_iris()
X = iris.data[:, :2]  # 只取前两个特征:花萼长度和花萼宽度
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建SVM模型
svm = SVC(kernel='linear', C=1)
# 训练模型
svm.fit(X_train, y_train)
y_pre = svm.predict(X_test)
accuracy = accuracy_score(y_test, y_pre)
print("Accuracy is: {}".format(accuracy))

# 绘制决策边界
def plot_decision_boundary(model, X, y):
    # 创建网格
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                         np.arange(y_min, y_max, 0.01))

    # 预测网格中的类别
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # 绘制背景色
    plt.contourf(xx, yy, Z, alpha=0.8)
    # 绘制训练数据点
    markers = ['o', 's', '^']
    for i, label in enumerate(np.unique(y)):
        plt.scatter(X[y == label, 0], X[y == label, 1], marker=markers[i], label=iris.target_names[label])

    # 绘制决策边界
    plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], linestyles=['--', '-', '--'])
    # 图像设置
    plt.title('Iris Dataset with SVM Decision Boundary')
    plt.xlabel('Sepal Length (cm)')
    plt.ylabel('Sepal Width (cm)')
    plt.legend()
    plt.show()

# 绘制决策边界
plot_decision_boundary(svm, X, y)

二、 核支持向量机

1.1 概念

核SVM利用核函数(Kernel Function)将输入数据映射到一个更高维的空间,在这个高维空间中,原本非线性可分的数据变得线性可分。

同样的,我给出一个用iris进行SVM分类后的图像,如下图:(其代码随后给出)

1.2 数学模型

我们来看核SVM的数学模型,其基本形式与线性的十分相似,我们令Φ(x)来表示将x映射后的特征向量,于是之前的模型就发生了改变,便成为:f(x) = w^T\phi (x)+b的形式。然后其对偶问题也就变为:

最后经过一些重写、化简等就变为:

f(x)=w^T\phi (x)+b \\=\sum_{i=1}^{m} \alpha i yi\phi (x)+b\\=\sum_{i=1}^{m}\alpha i yi\kappa (x,xi)+b

而这里的函数κ()就是“核函数”(kernal function)。

而关于核函数其实存在多种选择,因为我自己也对其不够了解,所以只在此给出西瓜书上的常用核函数表,如下:

1.3 联系

在我们初步了解二者的概念后,我们就可以知道,其实KSVM(核SVM)就是线性SVM在原本处理不了的非线性数据上做出的一个拓展,旨在增加维度而能实现让SVM进行分类。

1.4 区别

适用范围:在线性SVM中,它适用于处理线性可分的数据集,即可以通过一个超平面(在二维空间中是一条直线,在高维空间中是一个超平面)来分隔不同类别的数据点;而KSVM中,它适用于处理非线性可分的数据集,即数据不能通过一个简单的超平面来分隔。在这种情况下,数据可能需要被映射到一个更高维的空间,才能找到一个合适的分隔超平面。

计算复杂度:线性SVM的复杂度相对较低,而KSVM因为核函数的缘故,计算复杂度较高。

实际应用:在线性可分数据集上,线性SVM通常比KSVM更快并且更简单。例如,在文本分类或一些简单的图像识别任务中,数据可能是线性可分的;在非线性可分数据集上,KSVM能够更好地捕捉数据中的复杂关系。例如,在手写数字识别、生物信息学等领域,数据通常是非线性可分的,KSVM能够提供更高的准确率。

1.5 python代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from mpl_toolkits.mplot3d import Axes3D

# 加载Iris数据集
iris = datasets.load_iris()
X = iris.data[:, :3]  # 使用前三个特征
y = iris.target
# 使用线性核的支持向量机
svm = SVC(kernel='linear')
svm.fit(X, y)
# 创建3D图形
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')  # 使用add_subplot代替Axes3D
ax.view_init(elev=-152, azim=-26)  # 设置视角
# 掩码
mask_0 = y == 0
mask_1 = y == 1
mask_2 = y == 2
# 绘制散点图
ax.scatter(X[mask_0, 0], X[mask_0, 1], X[mask_0, 2], c='b', s=60, label="Setosa")
ax.scatter(X[mask_1, 0], X[mask_1, 1], X[mask_1, 2], c='r', marker='^', s=60, label="Versicolour")
ax.scatter(X[mask_2, 0], X[mask_2, 1], X[mask_2, 2], c='g', marker='s', s=60, label="Virginica")
# 设置坐标轴标签
ax.set_xlabel("Sepal length")
ax.set_ylabel("Sepal width")
ax.set_zlabel("Petal length")
# 添加图例
ax.legend()
# 绘制决策平面
w = svm.coef_[0]
a = -w[0] / w[2]
b = -w[1] / w[2]
xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 50),
                     np.linspace(X[:, 1].min(), X[:, 1].max(), 50))
zz = (-svm.intercept_[0] - a * xx - b * yy) / w[2]

# 画出平面
surf = ax.plot_surface(xx, yy, zz, rstride=1, cstride=1, color='none',
                       alpha=0.3, edgecolor='darkblue')
# 显示图形
plt.show()

三、 补足

此外,我们会发现在分类时偶尔会有些数据点分类错误或是在间隔内,那么我们就可以称它为“软间隔”,那么我可以在这里完整描述下关于软间隔的含义:它适用于不完全线性可分的数据集,允许一定的误差。并通过调整C来控制惩罚程度,以达到最好的泛化能力。而于此相对的,硬间隔的含义就是:适用于 完全线性可分的数据集,不允许任何训练样本出现在间隔内或是被错误地分类。

因为在现实中大多不能做到硬间隔的分类,所以我们我们需要软间隔,更需要关于它而对原有的SVM模型进行修改,比如加入损失函数,引入松弛变量等,这样就能得到常说的“软间隔SVM”。

SVM处了能处理分类问题还能进行回归,这样就是“支持向量回归”了,即Support Vector Regression。

关于SVM的东西还有很多,我将在之后继续介绍。

此上

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

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

相关文章

AIGC生图基础知识

一、引言 AIGC,即AI-Generated Content,是一种利用大型预训练模型如生成对抗网络(GAN)、扩散网络(Diffusion)和语言大模型(Transformer)等人工智能技术,通过对大量数据进…

Gradio 自定义组件

如何使用 Gradio 自定义组件,Gradio 前端使用 Svelte,后端使用的 Python。如何自定义一个组件呢?Gadio 提供了类似于脚手架的命令,可以生成需要开发组件的前后和后端代码。 创建组件 运行如下命令,gradio 会自动生成…

OBC充电机测试的步骤和规范

一、测试前准备 1. 确认测试环境:确保测试环境的温度、湿度等条件符合设备的工作要求。 2. 检查设备:检查OBC充电机是否完好无损,电源线、插头等是否连接良好,显示屏是否正常显示。 3. 准备工具:准备好电压表、电流…

ubuntu20.04安装cudnn

先登入账号 网址:https://developer.nvidia.com/cudnn 选择ubuntu20.04 x86_64(Deb) 在下载好文件的文件夹下打开终端 sudo apt-get install zlib1gsudo dpkg -i cudnn-local-repo-${distro}-8.x.x.x_1.0-1_amd64.debsudo cp /var/cudnn-lo…

大数据时代:历史、发展与未来

文章目录 引言1980年:大数据的先声2006年:云计算与大数据的诞生2008年:大数据的科学探索2009年:大数据成为行业热词2011年:大数据的商业价值2013年:世界大数据元年结语 引言 在信息技术飞速发展的今天&…

钢铁焦化水泥超低排的原因

钢铁、焦化和水泥行业实施超低排放的原因,朗观视觉小编建议大家可以从环境保护、产业升级、政策推动以及企业可持续发展等多个方面进行分析。 一、环境保护需求 空气质量改善:钢铁、焦化和水泥行业是传统的高污染行业,其排放的颗粒物、二氧化…

表格HTML

//test.html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>表格与CSS分开示例</tit…

【STL】string 基础,应用与操作

string 1.string相关介绍 STL&#xff08;标准模板库&#xff09;中的string容器是C标准库提供的用于处理和操作字符串的类&#xff0c;位于头文件中。std::string提供了比传统的C风格字符串&#xff08;字符数组&#xff09;更方便和安全的功能&#xff0c;具有动态内存管理…

python脚本编译为.so速度对比

有两个好处&#xff1a; 产品代码保护&#xff0c;so文件不可读 计算能力加速&#xff0c;本质上编译过程为python -> c -> so文件&#xff0c;相当于动态语言转换为静态语言&#xff0c;程序执行能力和计算能力有所提升 编译为so文件后比原始python代码执行时间快2ms左…

VISIA 皮肤检测

费用:自费158元 不能医保报销 先清洁肌肤,然后做一个皮肤检测. 1200万像素高清摄像头,一个白光,一个偏正光,还有一个紫外光,三种模式,分析面部情况. 8张图 反应皮肤情况应用: 在医美前和医美一次修复完成后,皮肤情况对比. 数值越高 越好 斑点图: 皱纹图: 分数比较低的话,皮肤…

【计算机基础题目】二叉树的前序中序后续遍历之间相互转换 详细例子

创作日志&#xff1a; 笔试题目&#xff0c;掌握了技巧之后这道题就是 so easy~ 一、 1、已知二叉树的 前序和中序&#xff0c;可以求出后序 2、已知二叉树的 中序和后序&#xff0c;可以求出前序 3、已知二叉树的 前序和后序&#xff0c;无法求出唯一的中序 二、求法 求法是…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统部署Docker Compose管理工具Dockge

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统部署Docker Compose管理工具Dockge 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Dockge介绍2.1 Dockge简介2.2 Dockge功能…

华为云DevSecOps和DevOps

目录 1.华为云DevSecOps和DevOps 1.1 DevSecOps 1.1.1 核心功能 1.1.2 优势 1.2 DevOps 1.2.1 核心功能 1.2.2 优势 1.3 DevOps和DevSecOps的区别 1.3.1 安全性集成 1.3.2 自动化的安全工具 1.3.3 团队协作 1.3.4 质量与合规性 1.3.5 成本与风险管理 1.3.5 总结 …

添可2024新品发布会,让智能家电成为“美好家”的具象表达

9月19日&#xff0c;添可以“万物新生&#xff0c;智领美好家”为主题&#xff0c;于上海浦东美术馆举办2024年度新品发布会。 会上&#xff0c;添可凭借对智能家电与家居设计领域的深刻洞察&#xff0c;全新发布了芙万Art Station智能洗地机、芙万Artist洗地机、饮万水纪元净…

《拿下奇怪的前端报错》:npm install卡住了一个钟- 从原理搞定安装的全链路问题

相信前端的小伙伴稍微入行一段时间的&#xff0c;接触过不同的项目&#xff0c;就可能遇到过npm install卡住的情况&#xff0c;下面我就来分析下几种场景、定位的方法和解决办法。不再只是删除node_modules然后重来了&#xff0c;虽然它能解决80%的问题 1 npm install 的原理…

Vue 常用高级指令解析

Vue 高级指令的重要性 Vue 高级指令是一种扩展 Vue.js 框架的功能的方式&#xff0c;可以让你在处理 DOM 元素时具有更多的控制权。它们可以通过自定义指令的方式进行编写和应用。 高级指令的重要性在于&#xff0c;它们使开发者能够通过 Vue 框架来创建更加复杂和灵活的交互…

数据库函数

1.字符串函数 例子&#xff1a; 2.数值函数 例子&#xff1a; 3.日期函数 例子&#xff1a; 4.流程函数 例子&#xff1a; 参考视频&#xff1a;27. 基础-函数-字符串函数_哔哩哔哩_bilibili

FinGPT金融大模型

FinGPT仓库https://github.com/AI4Finance-Foundation/FinGPT 功能&#xff1a; Adviser。根据新闻判断市场情绪&#xff08;积极、消极、中性&#xff09;&#xff0c;给出投资建议。Quantitative Trading。定制属于自己的金融助手。叫它关注某几个股票、监测消息等。可以直…

Linux安装、Nginx反向代理、负载均衡学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

代码管理-使用TortoiseGit同步项目到Github/Gitee

1 什么是TortoiseGit TortoiseGit下载地址 TortoiseGit是Git的Windows桌面可视化工具&#xff0c;通过软件的操作来实现Git命令的效果&#xff0c;使所有的操作都能用图形化实现。TortoiseGit安装很简单&#xff0c;这里不对安装流程进行讲解。下载之后即可按照普通软件的方式…