详解机器学习经典模型(原理及应用)——支持向量机

news2024/9/25 5:04:06

一、什么是支持向量机

        支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,可用于解决数据分类(二分类)和回归问题。在分类问题上,SVM的核心思想是在特征空间中找到一个最优的超平面,这个超平面能够最大化地分开不同类别的数据点,即最大化两类数据点之间的间隔;而在回归问题中,支持向量机的目标是找到一个函数,该函数在给定的数据点上有最小的预测误差,与分类问题中最大化两类数据点之间的间隔不同,回归问题关注的是找到一个合适的函数,使得实际值和预测值之间的差异最小。支持向量机与其他机器学习/深度学习不一样的地方在于,其他方法往往通过降维解决问题(比如神经网络每一层神经元数量的递减设置),而支持向量机是通过升维直至维度高到足以满足分类/回归要求来解决问题的。

二、支持向量机的原理

1、最优超平面

        SVM的目标是找到一个超平面,使得不同类别的数据点之间的间隔(margin)最大化。间隔定义为从超平面到最近的数据点(支持向量)的最短距离。对于线性可分的情况,SVM的优化问题可以表示为:

min_{w,b}\frac{1}{2}||w||^{2}

        受以下约束条件,对于所有的i,有:

y_{i}(wx_{i}+b)\geqslant 1

        其中,w是超平面的法向量,b是超平面的偏置项,x_{i}是数据点,y_{i}是数据点的标签,取值为 +1 或 -1,wx_{i}+b是数据点到超平面的距离。

2、软间隔

        在现实世界中,数据往往不是完全线性可分的。为了处理这种情况,SVM引入了软间隔(soft margin)的概念,允许一些数据点违反间隔规则。软间隔SVM的优化问题可以表示为:

min_{w,b,\varepsilon }\frac{1}{2}||w||^{2}+C\sum_{i=1}^{n}\varepsilon _{i}

        受以下条件约束,对于所有的i,有:

y_{i}(wx_{i}+b)\geqslant 1-\varepsilon _{i}

\varepsilon _{i}\geqslant 0

        其中,\varepsilon _{i}是松弛变量,用于处理间隔违规,C是惩罚参数,控制间隔违规的严重性。

3、核技巧

        当数据不是线性可分时,SVM可以使用核技巧将数据映射到高维空间,在这个空间中寻找线性分割,这就是我们前面说到的通过升维解决问题。核函数的选择取决于数据的特性和问题的需求,常见的核函数包括:

        (1)线性核

K(x_{i},x_{j}) = x_{i}x_{j}

        这里,x_{i}x_{j}是数据集中的两个特征向量,取两向量的点积(内积)。线性核相当于假设数据在原始空间中已经是线性可分的,因此不需要映射到高维空间。

        (2)径向基函数RBF核

        径向基函数(Radial Basis Function, RBF)核,也称为高斯核,是支持向量机(SVM)中常用的核函数之一。它在机器学习中的作用是将原始数据映射到高维空间,使得在原始空间中线性不可分的数据在高维空间中变得线性可分:

K(x_{i},x_{j}) = exp(-\gamma ||x_{i}-x_{j}||^{2})

        其中,x_{i}x_{j}是输入空间中的两个样本;\gamma是核函数的参数,它决定了单个训练样本的影响范围,通常需要通过交叉验证来选择;||x_{i}-x_{j}||是样本之间的欧几里得距离。

        (3)多项式核

        多项式核(Polynomial Kernel)是支持向量机中的一种核函数,它允许SVM在高维空间中处理非线性问题。多项式核通过将原始特征映射到一个更高维的空间,使得数据在这个新空间中变得线性可分:

K(x_{i},x_{j}) = (\gamma x_{i}x_{j}+r)^d

        其中,x_{i}x_{j}是数据集中的两个特征向量;\gamma是核函数的参数,也称为缩放系数或核函数的系数;r是一个常数,为偏置项;dd 是多项式的度数,它决定了多项式的阶数。

三、支持向量机求解

        SVM的优化问题通常通过拉格朗日乘子法(知道名字就行,面试官都不一定记得公式推导。。)来求解,转化为对偶问题

max_{\alpha }\sum_{i=1}^{n}\alpha _{i}-\frac{1}{2}\sum_{i,j=1}^{n}y_{i}y_{j}\alpha _{i}\alpha_{j}K(x_{i},x_{j})

        受以下约束条件,对于所有i,有:

\sum_{i=1}^{n}\alpha _{i}y_{i} = 0

0\leqslant \alpha _{i}\leqslant C

        其中,\alpha _{i}是拉格朗日乘子,K(x_{i},x_{j})是核函数。最终,模型参数w和b可以通过\alpha计算得到:

w = \sum_{i=1}^{n}\alpha_{i}y_{i}x_{i}

b = y_{i}-\sum_{j=1}^{n}\alpha_{j}y_{j}K(x_{i},x_{j})

四、支持向量机应用

1、分类

        虽然SVM是二分类模型,但是诸如scikit-learn之类的第三方库已经构建了一整套完整的代码使得我们可以直接使用SVM进行多分类。

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据预处理:标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 创建 SVM 分类器实例
# 可以选择不同的核函数,如 'linear', 'poly', 'rbf', 'sigmoid'
# 在scikit-learn中,SVC类提供了decision_function_shape参数,可以用来控制决策函数的形状,从而支持多分类。默认情况下,decision_function_shape='ovr',这意味着使用一对多策略。
svm_classifier = SVC(kernel='rbf', C=1.0)  # C 是正则化参数

# 训练模型
svm_classifier.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = svm_classifier.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

# 可打印支持向量
print("Support vectors:")
print(svm_classifier.support_vectors_)

2、回归

# 导入必要的库
from sklearn.datasets import load_boston
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target

# 数据预处理:标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 创建 SVM 回归器实例
# 可以选择不同的核函数,如 'linear', 'poly', 'rbf'
svr = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)

# 训练模型
svr.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = svr.predict(X_test)

# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')

# 可计算决定系数 R^2
r2 = svr.score(X_test, y_test)
print(f'R^2 Score: {r2:.2f}')

五、总结

        支持向量机在实际业务中有诸多应用,对于特征量较大、特征关系呈现非线性或者内存有限的情况,支持向量机都是常用的解决方案。

1、优点

        (1)有效的分类性能:在许多实际应用中,SVM提供了非常有效的分类性能。

        (2)核技巧:SVM的核技巧允许它在高维空间中找到复杂的决策边界。

        (3)内存效率:SVM只与支持向量有关,这使得它在内存使用上非常高效。

        (4)鲁棒性:SVM对于数据中的噪声和异常值具有一定的鲁棒性。

        (5)适用于小样本数据:SVM在小样本数据集上也能表现良好。

2、缺点

        (1)计算复杂度:SVM的计算复杂度较高(因为要不断升维计算),尤其是在处理大规模数据集时。

        (2)参数选择:SVM的性能依赖于核函数和惩罚参数的选择,这需要大量的实验来确定最佳参数。

        (3)不支持在线学习:SVM不适用于在线学习或实时更新模型的场景。

        (4)解释性差:相比于决策树等模型,SVM的决策过程较难解释。

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

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

相关文章

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器,框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等(后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】:https:…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …

IDEA:如何设置项目启动的JVM运行内存大小

IDEA版本不一样页面也不一样 -Xms20m -Xmx200m 其实在本地开发调试的时候不需要太大内存,如果测试性能建议放到运算服务器上面去跑~~~

最小花费爬楼梯(动态规划)问题

目录 一题目: 二思路: 三代码: 一题目: 最小花费爬楼梯_牛客题霸_牛客网 二思路: 思路:动态规划找前后规律化简题意:此题想要的结果其实就是能上到顶楼也就是: 分为&#xff1…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学,它涵盖了加密技术和解密技术的各个方面,是现代信息安全的核心组成部分。 一、定义与基本概念 定义:密码学是研究如何隐密地传递信息的学科,主要涉及保密通信和数字签名两个方面。它…

4.1章节python中顺序结构

顺序结构(Sequential Structure)是最基本、最简单的程序结构。 顺序结构意味着程序中的语句将按照它们在代码中出现的顺序依次执行。这是大多数编程语言中最直观和自然的执行方式。 在Python中编写顺序结构的程序时,你只需将语句按照你希望它…

docker:docker-compose容器编排

docker-compose容器编排 安装docker-compose 下载链接:https://github.com/docker/compose/releases/下载这个版本 [rootc1-10-66 ~]# ls anaconda-ks.cfg docker-compose-linux-x86_64_2 gpu-burn## 改个名字 [rootc1-10-66 ~]# mv docker-compose-linux-x86…

联想2025届C++开发工程师(编程题AK)

前面20个选择题吧 编程题 T1、爆破 时间限制:3000MS 内存限制:589824KB 题目描述: 小明当起了矿场的爆破工程师。小明工作的矿场可以看作一个N x N的二维网格,小明可以将一个炸弹放置到矿场的任意位置,若干时间后…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

CSS——网格布局(display: grid)之下篇

CSS——网格布局&#xff08;display: grid&#xff09;之下篇 前面我们介绍了网格布局的基础的创建以及一些比较基础的属性&#xff0c;下面我们将介绍网格布局的剩余部分&#xff0c;还将结合实例来进行细致的讲解&#xff08;图文并茂&#xff0c;生动形象有内涵&#xff0…

使用现有的科技或许无法实现对人类智能的模拟

现有科技在实现真正的人类智能方面面临许多挑战。科技的局限性涉及许多领域&#xff0c;在计算能力方面&#xff0c;尽管处理速度不断提升&#xff0c;但要模拟人脑的复杂性仍然困难重重&#xff1b;当前的人工智能依赖于大量数据进行训练&#xff0c;缺乏灵活性和适应性&#…

时间序列数据可视化

#时间序列可视化 #离散数据的时间序列可视化 import numpy as np import pandas as pdts pd.Series(np.random.randn(1000), indexpd.date_range(1/1/2000, periods1000)) ts ts.cumsum() ts.plot() #%% #连续数据的时间序列可视化 import matplotlib.pyplot as plt df pd.D…

打印规律图形

思路&#xff1a;将主对角线的1,2,3,4看成一行&#xff0c;5,6,7看成一行&#xff0c;8,9看成一行&#xff0c;10看成一行。按照这种方法&#xff0c;遍历一遍&#xff0c;正好是1~10。 然后在遍历的过程中将这些数存放在数组中。 上图所示&#xff1a;1的坐标为&#xff08;1…

PCL 八叉树的使用

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1构建八叉树 2.1.2可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09;…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Ga…

Linux驱动开发初识

Linux驱动开发初识 文章目录 Linux驱动开发初识一、驱动的概念1.1 什么是驱动&#xff1a;1.2 驱动的分类&#xff1a; 二、设备的概念2.1 主设备号&次设备号&#xff1a;2.2 设备号的作用&#xff1a; 三、设备驱动整体调用过程3.1 上层用户操控设备的流程&#xff1a;3.2…

conda 虚拟环境安装GDAL

一. 背景 换了新电脑&#xff0c;要重新安装GDAL。从前是下了GDAL的.wheel文件用pip安装&#xff0c;但平时下轮子的网站现在都打不开&#xff0c;比如https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal&#xff0c;不晓得为什么。 后面看了这篇教程解决了问题&#xff08;h…

一文说透RTMP、RTSP、RTP、HLS、MPEG-DASH

实时视频传输协议 1. RTMP&#xff08;Real Time Messaging Protocol&#xff09; 简介&#xff1a;RTMP是由Adobe公司开发的实时消息传输协议&#xff0c;主要用于流媒体数据的传输。它基于TCP传输&#xff0c;具有低延迟、高可靠性的特点。特点&#xff1a;RTMP支持多种视频…

gtk安装和测试

linux的图形库有qt和gtk, qt功能强大&#xff0c;但是商用要付费。 gtk是个免费开源的&#xff0c;也不错。现在linux的类似windows办公环境基本是gtk编写的吧&#xff08;我猜&#xff09;。linux下的wps好像是用qt写的。 闲言少序&#xff0c;开始gtk. 先安装&#xff1a; …