基于支持向量回归(SVR)的预测模型MATLAB实现

简介: 基于支持向量回归(SVR)的预测模型MATLAB实现

支持向量回归(SVR)预测模型实现,包含数据生成、模型训练、参数优化、预测评估及可视化分析功能。

一、SVR基本原理

支持向量回归(Support Vector Regression, SVR)是SVM在回归问题上的扩展,核心思想是:

寻找一个超平面$f(x)=w^Tϕ(x)+b$,使得所有样本点到超平面的偏差不超过预设阈值ε,同时最小化模型复杂度(即$∥w∥^2$)

数学表达:
image.png

约束条件:
image.png

其中:

  • C:惩罚参数(控制过拟合与欠拟合平衡)
  • ε:不敏感损失参数(允许的最大偏差)
  • ξi,ξi∗:松弛变量(处理超出$ε$的误差)
  • ϕ(x):核函数映射(将数据映射到高维空间解决非线性问题)

二、完整MATLAB实现

%% 支持向量回归(SVR)预测模型
% 功能: 实现SVR回归预测,包含参数优化、多核函数比较、可视化分析
% 数据集: 非线性合成数据(可替换为实际数据)

clear; clc; close all;

%% 1. 参数设置
% 数据参数
nSamples = 200;          % 样本数量
noiseLevel = 0.3;         % 噪声水平 (0-1)
testRatio = 0.3;          % 测试集比例

% SVR模型参数
kernelType = 'rbf';       % 核函数类型: 'linear', 'poly', 'rbf', 'sigmoid'
C = 10;                   % 惩罚参数 (典型值: 0.1-1000)
epsilon = 0.1;            % 不敏感损失参数 (典型值: 0.01-1)
gamma = 'scale';          % RBF核参数: 'scale'(1/n_features)或具体数值
degree = 3;               % 多项式核次数 (仅poly核有效)
coef0 = 0;                % 核函数独立项 (poly/sigmoid核有效)

% 训练参数
optimizeParams = true;    % 是否自动优化参数
cvFolds = 5;              % 交叉验证折数
visualize = true;         % 是否可视化结果

%% 2. 生成/加载数据集
% 生成非线性回归数据 (示例: 正弦函数叠加噪声)
rng(42);  % 固定随机种子
X = linspace(0, 10, nSamples)';  % 输入特征 (1)
y = sin(X) + noiseLevel*randn(nSamples, 1);  % 目标变量 (含噪声)

% 添加特征维度 (演示多维输入,此处扩展为2)
X = [X, X.^2/10];  % 特征矩阵: [x1, x2],x2=x1²/10

% 划分训练集和测试集
nTrain = floor(nSamples*(1-testRatio));
trainIdx = randperm(nSamples, nTrain);
testIdx = setdiff(1:nSamples, trainIdx);

X_train = X(trainIdx, :);
y_train = y(trainIdx);
X_test = X(testIdx, :);
y_test = y(testIdx);

% 数据标准化 (SVR对尺度敏感)
[X_train_scaled, mu_X, sigma_X] = zscore(X_train);  % 特征标准化
y_train_scaled = (y_train - mean(y_train)) / std(y_train);  % 目标标准化
X_test_scaled = (X_test - mu_X) ./ sigma_X;  % 测试集用训练集的均值和标准差


%% 3. SVR模型训练
if optimizeParams
    % 自动参数优化 (网格搜索+交叉验证)
    paramGrid = struct(...
        'C', logspace(-1, 3, 10), ...    % C: 0.1~1000
        'epsilon', logspace(-2, 0, 5), ...% ε: 0.01~1
        'gamma', logspace(-2, 1, 5) ...    % γ: 0.01~10 (RBF核)
    );

    bestParams = struct('C', C, 'epsilon', epsilon, 'gamma', gamma);
    bestMSE = inf;

    % 网格搜索
    for C_val = paramGrid.C
        for eps_val = paramGrid.epsilon
            for gam_val = paramGrid.gamma
                % 训练模型 (使用交叉验证评估)
                cvModel = fitrsvm(X_train_scaled, y_train_scaled, ...
                    'KernelFunction', kernelType, ...
                    'BoxConstraint', C_val, ...
                    'Epsilon', eps_val, ...
                    'KernelScale', gam_val, ...
                    'KFold', cvFolds);

                % 交叉验证MSE
                cvMSE = kfoldLoss(cvModel, 'LossFun', 'mse');

                % 更新最优参数
                if cvMSE < bestMSE
                    bestMSE = cvMSE;
                    bestParams.C = C_val;
                    bestParams.epsilon = eps_val;
                    bestParams.gamma = gam_val;
                end
            end
        end
    end

    % 使用最优参数训练最终模型
    C = bestParams.C;
    epsilon = bestParams.epsilon;
    gamma = bestParams.gamma;
    fprintf('最优参数: C=%.2f, ε=%.3f, γ=%.3f\n', C, epsilon, gamma);
end

% 训练SVR模型
svrModel = fitrsvm(X_train_scaled, y_train_scaled, ...
    'KernelFunction', kernelType, ...
    'BoxConstraint', C, ...          % 惩罚参数C
    'Epsilon', epsilon, ...          % 不敏感损失ε
    'KernelScale', gamma, ...        % 核参数 (RBF核为γ)
    'Standardize', false, ...        % 已手动标准化
    'Solver', 'SMO');                % 求解器 (SMO/LIBSVM)

% 查看模型信息
disp('SVR模型详情:');
disp(svrModel);


%% 4. 模型预测与反标准化
% 训练集预测
y_train_pred_scaled = predict(svrModel, X_train_scaled);
y_train_pred = y_train_pred_scaled * std(y_train) + mean(y_train);  % 反标准化

% 测试集预测
y_test_pred_scaled = predict(svrModel, X_test_scaled);
y_test_pred = y_test_pred_scaled * std(y_train) + mean(y_train);  % 反标准化


%% 5. 模型评估
% 计算评估指标
metrics = evaluateRegression(y_train, y_train_pred, y_test, y_test_pred);

% 打印评估结果
fprintf('\n===== 模型评估结果 =====\n');
fprintf('训练集: MSE=%.4f, RMSE=%.4f, MAE=%.4f, R²=%.4f\n', ...
    metrics.train.MSE, metrics.train.RMSE, metrics.train.MAE, metrics.train.R2);
fprintf('测试集: MSE=%.4f, RMSE=%.4f, MAE=%.4f, R²=%.4f\n', ...
    metrics.test.MSE, metrics.test.RMSE, metrics.test.MAE, metrics.test.R2);


%% 6. 可视化分析
if visualize
    % 预测结果对比图
    figure('Name', 'SVR预测结果', 'Position', [100, 100, 1200, 500]);

    % 训练集
    subplot(1,2,1);
    scatter(X_train(:,1), y_train, 30, 'b', 'filled', 'DisplayName', '真实值');
    hold on;
    [X1_sorted, idx] = sort(X_train(:,1));  % 按x1排序
    plot(X1_sorted, y_train_pred(idx), 'r-', 'LineWidth', 2, 'DisplayName', 'SVR预测');
    xlabel('特征x1'); ylabel('目标y'); title('训练集预测结果');
    legend('Location', 'best'); grid on;

    % 测试集
    subplot(1,2,2);
    scatter(X_test(:,1), y_test, 30, 'b', 'filled', 'DisplayName', '真实值');
    hold on;
    [X1_test_sorted, idx_test] = sort(X_test(:,1));
    plot(X1_test_sorted, y_test_pred(idx_test), 'r-', 'LineWidth', 2, 'DisplayName', 'SVR预测');
    xlabel('特征x1'); ylabel('目标y'); title('测试集预测结果');
    legend('Location', 'best'); grid on;

    % 残差分析
    figure('Name', '残差分析', 'Position', [100, 100, 1200, 400]);
    subplot(1,2,1);
    scatter(y_train_pred, y_train_pred - y_train, 30, 'b', 'filled');
    xlabel('预测值'); ylabel('残差'); title('训练集残差图'); grid on;
    plot([min(y_train_pred), max(y_train_pred)], [0, 0], 'r--');

    subplot(1,2,2);
    scatter(y_test_pred, y_test_pred - y_test, 30, 'b', 'filled');
    xlabel('预测值'); ylabel('残差'); title('测试集残差图'); grid on;
    plot([min(y_test_pred), max(y_test_pred)], [0, 0], 'r--');

    % 核函数比较 (可选)
    compareKernels(X_train_scaled, y_train_scaled, X_test_scaled, y_test, ...
        {
   'linear', 'poly', 'rbf'}, C, epsilon, gamma);
end


%% 7. 辅助函数: 回归评估指标计算
function metrics = evaluateRegression(y_true_train, y_pred_train, y_true_test, y_pred_test)
    % 训练集指标
    residuals_train = y_true_train - y_pred_train;
    metrics.train.MSE = mean(residuals_train.^2);       % 均方误差
    metrics.train.RMSE = sqrt(metrics.train.MSE);       % 均方根误差
    metrics.train.MAE = mean(abs(residuals_train));     % 平均绝对误差
    metrics.train.R2 = 1 - sum(residuals_train.^2)/sum((y_true_train - mean(y_true_train)).^2);  % 决定系数

    % 测试集指标
    residuals_test = y_true_test - y_pred_test;
    metrics.test.MSE = mean(residuals_test.^2);
    metrics.test.RMSE = sqrt(metrics.test.MSE);
    metrics.test.MAE = mean(abs(residuals_test));
    metrics.test.R2 = 1 - sum(residuals_test.^2)/sum((y_true_test - mean(y_true_test)).^2);
end


%% 8. 辅助函数: 核函数比较
function compareKernels(X_train, y_train, X_test, y_test, kernelList, C, epsilon, gamma)
    figure('Name', '不同核函数比较', 'Position', [100, 100, 1200, 500]);

    for i = 1:length(kernelList)
        kernel = kernelList{
   i};
        % 训练模型
        model = fitrsvm(X_train, y_train, ...
            'KernelFunction', kernel, ...
            'BoxConstraint', C, ...
            'Epsilon', epsilon, ...
            'KernelScale', gamma);

        % 预测
        y_pred = predict(model, X_test);
        mse = mean((y_test - y_pred).^2);

        % 可视化 (取第一个特征绘图)
        subplot(1, length(kernelList), i);
        scatter(X_test(:,1), y_test, 30, 'b', 'filled', 'DisplayName', '真实值');
        hold on;
        [X1_sorted, idx] = sort(X_test(:,1));
        plot(X1_sorted, y_pred(idx), 'r-', 'LineWidth', 2, 'DisplayName', '预测');
        title(sprintf('%s核 (MSE=%.4f)', kernel, mse));
        xlabel('特征x1'); ylabel('目标y'); grid on;
        legend('Location', 'best');
    end
end

三、关键功能模块详解

1. 数据生成与预处理

  • 数据生成:生成含噪声的非线性数据(y = sin(x) + 噪声),模拟真实非线性关系。
  • 特征扩展:将1维特征扩展为2维(x2 = x1²/10),演示SVR处理非线性问题的能力。
  • 标准化:使用zscore对特征和目标变量标准化(SVR对特征尺度敏感,必须标准化)。

2. 参数优化(网格搜索+交叉验证)

  • 参数网格:定义C(惩罚参数)、ε(不敏感损失)、γ(RBF核参数)的候选范围。
  • 交叉验证:用5折交叉验证评估每组参数的性能(以MSE为适应度函数)。
  • 最优参数选择:选择交叉验证MSE最小的参数组合作为最终模型参数。

3. SVR模型训练

  • 核函数选择:支持'linear'(线性)、'poly'(多项式)、'rbf'(径向基)、'sigmoid'(Sigmoid)核。
  • MATLAB函数:使用fitrsvm训练模型,关键参数: BoxConstraint:对应惩罚参数CEpsilon:对应不敏感损失参数εKernelScale:对应RBF核参数γ'scale'表示1/n_features); Solver:求解器('SMO''LIBSVM')。

4. 预测与评估

  • 反标准化:将预测结果从标准化空间转换回原始空间。
  • 评估指标:计算MSE(均方误差)、RMSE(均方根误差)、MAE(平均绝对误差)、R²(决定系数)。

5. 可视化分析

  • 预测结果对比:绘制训练集/测试集的真实值与预测值曲线。
  • 残差分析:绘制残差(预测值-真实值)散点图,检查模型是否存在系统性偏差。
  • 核函数比较:对比不同核函数在测试集上的MSE和拟合效果。

四、参数说明与调优指南

参数 含义 调优建议
C 惩罚参数(控制过拟合) C→宽松边界(易欠拟合),大C→严格边界(易过拟合);典型范围0.1~1000
ε 不敏感损失参数(允许偏差) ε→允许更大偏差(模型简单),小ε→追求高精度(模型复杂);典型范围0.01~1
γ RBF核参数(控制样本影响范围) γ→样本影响范围小(易过拟合),小γ→样本影响范围大(易欠拟合);典型范围0.01~10
核函数 非线性映射方式 低维/线性数据用'linear';非线性数据优先用'rbf';高阶关系用'poly'

五、扩展功能

1. 多特征输入

若实际数据有多个特征,只需将X替换为n_samples×n_features的矩阵,SVR自动处理多维特征。

2. 大规模数据优化

  • 近似算法:使用'Solver', 'LIBSVM'并开启'CacheSize'缓存核矩阵。
  • 降维:先用PCA等方法降低特征维度。

3. 与其他模型对比

% 对比线性回归、决策树、SVR
mdl_linear = fitlm(X_train, y_train);       % 线性回归
mdl_tree = fitrtree(X_train, y_train);       % 决策树
y_pred_linear = predict(mdl_linear, X_test);
y_pred_tree = predict(mdl_tree, X_test);

% 计算各模型MSE并比较
mse_linear = mean((y_test - y_pred_linear).^2);
mse_tree = mean((y_test - y_pred_tree).^2);
mse_svr = metrics.test.MSE;

参考代码 通过支持向量回归的方式来进行预测 www.youwenfan.com/contentali/83433.html

六、应用场景

  1. 非线性回归预测:房价预测、销量预测、传感器数据预测等。
  2. 小样本学习:SVR在小样本场景下表现优异(依赖支持向量而非全部样本)。
  3. 抗噪声能力:通过ε-不敏感损失和核函数,对噪声有一定鲁棒性。

七、总结

本实现完整展示了SVR从数据预处理、模型训练、参数优化到预测评估的全流程,核心优势在于:

  • 非线性建模:通过核函数处理复杂非线性关系;
  • 稀疏解:仅依赖支持向量,模型简洁;
  • 鲁棒性强:通过ε控制允许偏差,抗噪声能力较好。
相关文章
|
3月前
|
人工智能 IDE 程序员
从“代码补全”到“理解工程”:Qoder 如何重新定义 AI 编程的边界
Qoder是阿里云推出的智能体编程平台,专注解决真实软件工程难题:理解全库架构、自主执行端到端任务(Quest模式)、持续学习项目规则与习惯。告别碎片化补全,开启有记忆、懂协作的AI开发新范式。
|
2月前
|
人工智能 自然语言处理 API
阿里云百炼大模型服务平台主要模型介绍:文本生成、图像与视频、音频与语音等热门模型与能力简介
阿里云百炼是阿里云推出的一站式大模型开发与应用平台,集成千问(Qwen)全系列及DeepSeek、Kimi、GLM、MiniMax等主流第三方大模型,覆盖文本、图像、音频、视频、向量等多模态能力。开发者可通过OpenAI兼容API直接调用模型,业务人员则可借助可视化工具快速搭建智能体、知识库问答等AI应用,无需自行部署运维。新用户注册开通即可获赠超7000万tokens免费额度,支持从模型体验到应用落地的流程服务,显著降低AI应用开发门槛。
|
2月前
|
人工智能 API Python
GEO工作流搭建指南:用AI自动化你的内容优化
本文详解一套可落地的5节点GEO内容自动化工作流:选题→写作→质检→格式→输出,全程基于Coze零代码搭建,无需编程,市场营销专业学生半天即可上手,已应用于多所高校实训与政校企合作项目。(239字)
|
3月前
|
人工智能 运维 开发工具
一篇搞懂 AI Agent 架构选型,避开 80% 落地坑!
AI Agent正加速落地,但架构选型常成绊脚石。本文精析LangChain、LangGraph、AutoGen、CrewAI、OpenAI Agents SDK五大主流框架,从任务复杂度、可控性、开发效率、成本四大维度对比,助企业按需选型、避坑提速,实现智能化升级。
一篇搞懂 AI Agent 架构选型,避开 80% 落地坑!
|
3月前
|
人工智能 监控 安全
[理论篇-14]大模型评估与可观测性——如何知道你的 AI 到底行不行
用最通俗的话讲清楚,为什么 AI 应用上线前必须"考试"、上线后必须"体检",以及 2025-2026 年业界最实用的评估和监控方法。不管你是开发者、产品经理、还是企业管理者,读完这篇,你就知道怎么判断一个 AI 系统"到底好不好"。
267 3
|
3月前
|
人工智能 运维 自然语言处理
AgentRAG vs 传统RAG:当AI学会"三思而后答"
本文对比传统RAG与AgentRAG:前者单次检索、流程固定,响应快但容错差;后者引入ReAct循环机制,支持多轮自适应检索、深度意图分析、工具动态调用与结果多维评估,显著提升复杂问题回答质量。二者互补而非替代。
|
3月前
|
人工智能 Linux API
hermes agent 安装教程:安装优化 + 模型配置 + 工具启用指南
Hermes Agent 是 Nous Research 于 2026 年发布的开源自主进化 AI 智能体框架(MIT 协议,Python 编写)。它通过任务沉淀技能、持久化记忆、原生多工具集成与并行子智能体,实现“越用越强”。支持 Linux/macOS/WSL2,安装便捷,面向个人与企业的新一代私有化 AI 助手。
|
2月前
|
人工智能
OPC一人公司如何变现?AI时代,普通人的新赚钱方式正在出现
AI时代,“OPC一人公司”正兴起:借助ChatGPT、Midjourney、剪映AI等工具,一人即可高效完成文案、设计、剪辑、运营与客服。轻启动、低门槛、强变现——从AI内容创作到智能体代运营,普通人也能构建完整商业闭环。
|
3月前
|
人工智能 缓存 自然语言处理
阿里云百炼AI通用型节省计划介绍:主要优势、折扣信息与续订及常见问题解答
阿里云百炼AI通用型节省计划是一种针对大模型按量付费的折扣方案。用户承诺一定期限内的月消费金额(3/6/12/24个月),即可享阶梯式折扣,最高5.3折。其核心优势:覆盖阿里直供全部模型(千问、万相、语音等),跨模型通用;承诺越高折扣越大;自动抵扣无需手动绑定,支持立即或指定时间生效。相比其他模型节省计划,通用型覆盖更广、折扣更高、管理更灵活。抵扣顺序为免费额度>资源包>其他节省计划>通用型>按量付费,三方直供模型(如DeepSeek、Kimi)不支持抵扣。建议长期多模型调用的企业和开发者优先选用。
|
3月前
|
人工智能 前端开发 JavaScript
用AI重塑RPA稳定性:实在Agent TARS语义定位技术拆解与落地实践
实在智能在实在Agent v7.3.4中推出TARS AI元素定位技术,通过视觉-语义联合建模,实现多模态编码、语义锚点生成与动态匹配优化,显著提升RPA在敏捷前端环境下的元素识别稳定性与自适应能力,配置即用,助力企业自动化迈向真正无人值守。(239字)

热门文章

最新文章