用Python实现9大回归算法详解——07. 支持向量机回归算法

news2024/9/21 22:55:28
1. 支持向量机回归的基本概念

支持向量机回归(Support Vector Regression, SVR)是支持向量机(SVM)的一个应用,主要用于回归任务。与分类任务中的 SVM 类似,SVR 通过找到一个最大化边界(即支持向量)的模型,来最小化模型的误差。在 SVR 中,模型试图在误差不超过某个阈值(ϵ\epsilonϵ)的情况下,最大限度地保持平滑度。

2. 支持向量机回归的数学表达
2.1 SVR 目标函数

支持向量机回归的目标是在满足一定误差(\epsilon)的情况下,使模型尽可能简单。其优化问题可以表示为:

\min_{\mathbf{w}, b, \xi, \xi^*} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} (\xi_i + \xi_i^*)

在约束条件下:

\begin{aligned} & y_i - (\mathbf{w} \cdot \mathbf{x}_i + b) \leq \epsilon + \xi_i \\ & (\mathbf{w} \cdot \mathbf{x}_i + b) - y_i \leq \epsilon + \xi_i^* \\ & \xi_i, \xi_i^* \geq 0, \quad i = 1, 2, \dots, n \end{aligned}

其中:

  • \mathbf{w} 是权重向量。
  • b 是偏置项。
  • \epsilon 是误差容忍度。
  • \xi_i\xi_i^*​ 是松弛变量,允许有些点位于边界外。
2.2 拉格朗日函数

为了求解上述优化问题,我们引入拉格朗日乘子并构造拉格朗日函数:

L(\mathbf{w}, b, \xi, \xi^*, \alpha, \alpha^*, \eta, \eta^*) = \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} (\xi_i + \xi_i^*) - \sum_{i=1}^{n} \alpha_i (\epsilon + \xi_i - y_i + \mathbf{w} \cdot \mathbf{x}_i + b) - \sum_{i=1}^{n} \alpha_i^* (\epsilon + \xi_i^* + y_i - \mathbf{w} \cdot \mathbf{x}_i - b)

其中,\alpha_i 和 \alpha_i^* 是拉格朗日乘子,C 是惩罚参数,控制模型对误差的容忍度。

2.3 对偶问题

通过对拉格朗日函数求偏导数并进行优化,可以得到对偶问题的表达式:

\max_{\alpha, \alpha^*} -\frac{1}{2} \sum_{i,j=1}^{n} (\alpha_i - \alpha_i^*)(\alpha_j - \alpha_j^*) K(\mathbf{x}_i, \mathbf{x}_j) - \epsilon \sum_{i=1}^{n} (\alpha_i + \alpha_i^*) + \sum_{i=1}^{n} y_i (\alpha_i - \alpha_i^*)

在约束条件下:

\sum_{i=1}^{n} (\alpha_i + \alpha_i^*) =0

0 \leq \alpha_i, \alpha_i^* \leq C

2.4 最终回归模型

通过解对偶问题,最终的回归模型可以表示为:

f(\mathbf{x}) = \sum_{i=1}^{n} (\alpha_i - \alpha_i^*) K(\mathbf{x}_i, \mathbf{x}) + b

3. 支持向量机回归的核函数

与 SVM 类似,SVR 也可以应用核函数来处理非线性回归问题。常见的核函数包括:

  • 线性核

K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j

  • 多项式核

K(\mathbf{x}_i, \mathbf{x}_j) = (\gamma \mathbf{x}_i \cdot \mathbf{x}_j + r)^d

  • 高斯径向基函数(RBF)核

K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma \|\mathbf{x}_i - \mathbf{x}_j\|^2)

其中,\gamma 是核函数的参数,控制核的宽度。

4. 支持向量机回归的优缺点

优点

  1. 有效处理高维数据:SVR 可以很好地处理特征空间非常大的数据集,尤其是在使用核函数的情况下。
  2. 控制泛化能力:通过调整参数 \epsilonC,可以很好地控制模型的泛化能力。
  3. 适用于非线性数据:SVR 通过核技巧可以很好地处理非线性回归问题。

缺点

  1. 计算复杂度高:SVR 的训练过程涉及二次规划问题,计算复杂度较高,尤其是在大规模数据集上。
  2. 难以解释:对于非线性核函数,SVR 模型的解释性较差,很难直观理解模型的决策过程。

5. 支持向量机回归案例

我们将通过一个具体的案例来展示如何使用支持向量机回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们将使用一个模拟的数据集来进行回归预测。该数据集包含一个特征和一个目标变量,目标变量与特征之间存在非线性关系。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, r2_score

# 生成模拟数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

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

# 绘制数据点
plt.scatter(X, y, color='darkorange', label='data')
plt.title('Data Points')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

 输出:

解释

  • 数据生成:生成的数据包含一个输入特征 X 和一个目标变量 y,其中目标变量是通过对输入特征的正弦函数进行变换并加入噪声后得到的。这种数据模拟了真实情况下的非线性关系。

  • 数据可视化:通过绘制数据点,我们可以直观地看到数据的分布情况,数据具有明显的非线性趋势。

5.2 模型训练与预测

我们使用 SVR 进行模型训练,并选择 RBF 核函数。RBF 核函数可以很好地处理非线性数据。

# 定义支持向量机回归模型,使用RBF核函数
svr = SVR(kernel='rbf', C=1.0, epsilon=0.1)

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

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

解释

  • 模型定义:我们选择 RBF 核函数来处理非线性数据。参数 C 控制对训练误差的惩罚,\epsilon 控制模型的精度。
  • 模型训练:使用训练集对 SVR 模型进行训练。
  • 模型预测:训练完成后,对测试集进行预测。
5.3 模型评估与结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能。

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

均方误差 (MSE): 0.008105511962284498
决定系数 (R²): 0.9831038186845479

解释

  • 均方误差 (MSE):MSE 是预测值与实际值之间的平均平方误差。MSE 越小,模型的预测效果越好。在本例中,MSE 为 0.008,表明模型的预测误差非常小。
  • 决定系数 (R²)R^2 表示模型解释了目标变量方差的百分比。这里的 R^2 为 0.983,说明模型能够解释 98.0% 的目标变量方差,拟合效果极佳。
5.4 模型预测的可视化

为了更直观地展示支持向量机回归模型的预测效果,我们将绘制测试集的预测值与实际值的对比图。

# 绘制测试集预测值与实际值的对比图
plt.scatter(X_test, y_test, color='darkorange', label='Actual')
plt.scatter(X_test, y_pred, color='navy', label='Predicted')
plt.plot(X_test, y_pred, color='blue', linewidth=2, label='SVR Model')
plt.title('SVR: Actual vs Predicted')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.legend()
plt.show()

输出:

 

可视化解释

  • 实际值(橙色点):表示测试集的实际目标值。
  • 预测值(蓝色点):表示模型预测的目标值。通过对比可以看出,模型的预测值与实际值非常接近。
  • 预测曲线(蓝色线):表示 SVR 模型的预测曲线,说明模型很好地捕捉到了数据中的非线性关系。
5.5 参数调优

为了进一步提升模型性能,我们可以调整 SVR 模型的参数,如 C\epsilon。这些参数决定了模型的复杂度和对误差的容忍度。

  1. 参数  C:控制对训练误差的惩罚。较大的 C 值会让模型尝试更好地拟合训练数据,但可能导致过拟合。
  2. 参数 \epsilon:控制模型的精度。较小的 \epsilon 值会使模型更精确地拟合数据,但也可能增加模型复杂度。

通过网格搜索(Grid Search)或随机搜索(Random Search),可以找到最优的参数组合。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10],
    'epsilon': [0.01, 0.1],
    'kernel': ['rbf']
}

# 实例化支持向量机回归模型
svr = SVR()

# 进行网格搜索
grid_search = GridSearchCV(estimator=svr, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数:", grid_search.best_params_)

输出:

最佳参数: {'C': 10, 'epsilon': 0.01, 'kernel': 'rbf'}

 解释

  • 参数选择:我们通过网格搜索选择了多个 C\epsilon 值,以及核函数 rbf
  • 交叉验证:通过 5 折交叉验证(cv=5),网格搜索选择出最优参数组合。
  • 最佳参数输出:训练完成后,输出最优的参数组合。

6. 总结

支持向量机回归是一种强大的回归算法,通过最大化边界和最小化误差来构建稳健的回归模型。它特别适用于高维数据和非线性回归任务。通过合理选择核函数和调整模型参数,SVR 能够在各种复杂的回归任务中表现出色。然而,SVR 的计算复杂度较高,且模型解释性较差,因此在应用时需要注意这些限制。

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

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

相关文章

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位,长空格是1,短空格是0,全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目,里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法,方法里面包含lodash的cloneDeep,cloneDeep在这个页面并没有引入,但是vscode却没有提示,很不友好,容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的,在一般逻辑中队列是一个用 来存储数据的中间容器(前边几个阻塞队列也是用来存放数据的),但SynchronousQueue 却不是用来存放数据的,…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中,非线性系统的稳定性和自激振荡(self-oscillation)问题往往较线性系统更为复杂。为了分析这些问题,描述函数法(Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的,需要把资源通过qrc放到exe里面,然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下,打开前盖,然后按住开始键不松手,直到所有指示灯全部亮起后再松开手,然后将硒鼓取出再装回,盖上前盖,清零操作完成。 联想LJ2405打印机碳粉清零…

编程学习之路:如何克服挫折感,成为更好的自己

目录 编程学习之路:如何克服挫折感,成为更好的自己 一、小瓜有话说 1、学习的广度可以带动深度 2、清空大脑和清空代码都是解决问题的方式 ①清空大脑:睡个觉,拉个屎,吃顿饭。 ②清空代码:换一种思维…

花钱买不到系列-深刻理解进程地址空间

花钱买不到系列—linux虚拟地址空间-CSDN博客https://blog.csdn.net/weixin_49529507/article/details/141272458?spm1001.2014.3001.5501 在上一篇文章中,引出了虚拟地址这块,也用大富翁给儿子们画饼的例子解释,通过大富翁的例子&…

内存管理篇-03物理内存管理-32位

正片从现在开始了。 1.结构体关联 当DDR初始化后,整个内存就可以访问了。但是需要合理的管理,防止内存碎片以及安全相关的问题。因此需要对物理内存进行严格的管理。 物理内存分为:页, 分区,内存节点。DMA需要连续的内…

配置PXE预启动执行环境:Kickstart自动化无人值守安装

文章目录 实现 Kickstart 无人值守安装1. 安装Kickstart和配置应答文件(图形化界面)2. 配置 PXE 菜单支持 Kickstart 无人值守安装3. 验证 Kickstart 无人值守安装4. 拓展:命令行配置应答文件(命令行界面) 实现 Kickst…

猜数3次-python

题目要求: 定一个数字(1-10,随机产生,通过3次判断来猜出数字) 数字随机产生,范围1-10有三次机会猜测数字,通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps:补充随机函数 imp…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…

合合信息文档解析Coze插件发布,PDF转Markdown功能便捷集成

近日,TextIn开发的PDF转Markdown插件正式上架Coze平台。 在扣子搜索“pdf转markdown”,或在Coze平台搜索“pdf2markdown”,即可找到插件,在你的专属智能体中便捷使用文档解析功能。 如果想测试解析插件在你需要的场景下表现如何&…

R语言VAR模型的多行业关联与溢出效应可视化分析

全文链接:https://tecdat.cn/?p37397 摘要:本文对医疗卫生、通信、金融、房地产和零售等行业的数据展开深入研究。通过读取数据、计算收益率、构建 VAR 模型并进行估计,帮助客户进一步分析各行业变量的影响及残差的协方差与相关矩阵&#xf…

xml打印模板解析-SAAS本地化及未来之窗行业应用跨平台架构

一、为何要自己设置打印模板系统 1.确保自由知识产权 2.支持跨平台:物联网,自助终端,电脑,web,C#,jsp,android,java,php 等多种语言 二、xml 代码解析 package CyberWinPHP.Cyber_Plus;import java.io.…

2024下半年软考有哪些科目开考?该怎么选?

近年来,软考(软件水平考试)的难度逐渐攀升,这并非源于题目本身的复杂化,而是官方对通过率的调控策略所致。整体通过率维持在13%左右,高级别考试更是低至10%以下,考生需慎重对待。以湖南2024年上…

数据仓库建模的步骤-从需求分析到模型优化的全面指南

想象一下,你正站在一座巨大的图书馆前。这座图书馆里存放着你公司所有的数据。但是,书籍杂乱无章,没有分类,没有索引。你如何才能快速找到所需的信息?这就是数据仓库建模要解决的问题。本文将带你深入了解数据仓库建模的主要步骤,让你掌握如何将杂乱的数据转化为有序、高效、易…

Java | Leetcode Java题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPerfectSquare(int num) {double x0 num;while (true) {double x1 (x0 num / x0) / 2;if (x0 - x1 < 1e-6) {break;}x0 x1;}int x (int) x0;return x * x num;} }

监控摄像头能看到电脑屏幕内容吗?监控摄像头VS电脑屏幕监控软件!告别盲区,让您的企业管理无死角!

在企业管理中&#xff0c;监控摄像头和电脑屏幕监控软件都是重要的工具&#xff0c;但它们在监控电脑屏幕内容方面存在显著差异。本文将深入探讨监控摄像头在捕捉电脑屏幕内容时的局限性&#xff0c;并对比介绍安企神——电脑屏幕监控软件的优势及其功能策略&#xff0c;帮助企…