基于偏最小二乘法PLS多输入单输出的回归预测【MATLAB】

基于偏最小二乘法(PLS)多输入单输出的回归预测【MATLAB】

在科学研究和工程实践中,我们常常需要根据多个相关变量来预测一个关键结果。例如,根据气温、湿度、风速等多个气象因素预测空气质量指数,或根据多种原材料成分预测产品的最终性能。这类“多输入单输出”的预测任务,对模型处理复杂变量关系的能力提出了挑战。本文将介绍一种经典且高效的统计建模方法——偏最小二乘法(Partial Least Squares, PLS),并展示如何在MATLAB中利用它实现精准的回归预测。

为什么选择偏最小二乘法(PLS)?

在处理多输入数据时,变量之间往往存在高度相关性(即共线性),或者输入变量的数量远超样本数量,这会使传统回归方法(如多元线性回归)失效或表现不佳。偏最小二乘法正是为解决这类问题而设计的。

PLS的核心优势在于它能够:

  • 有效处理共线性:即使输入变量之间高度相关,PLS也能稳定地提取信息,避免模型崩溃。
  • 降维与信息融合:它不直接使用原始变量,而是通过分析输入与输出之间的关系,构建出一组新的、互不相关的“综合变量”(也称潜变量或主成分)。这些综合变量集中了原始数据中的关键信息,同时大幅降低了数据的复杂度。
  • 兼顾输入与输出的关系:与主成分分析(PCA)只关注输入数据的方差不同,PLS在提取综合变量时,会同时考虑这些变量对输出目标的预测能力,确保降维过程“有的放矢”。

因此,PLS特别适合于变量多、相关性强、样本量有限的复杂预测场景。

PLS的工作原理(直观理解)

可以将PLS的运作过程想象成一场“信息提炼”之旅:

  1. 寻找最佳“投影方向”:PLS首先在输入数据中寻找一个方向,使得沿着这个方向投影后得到的“综合变量”,既能最大程度地概括输入数据的变化,又能最好地解释输出变量的变化。
  2. 提取第一对“潜变量”:根据找到的方向,计算出输入数据的第一个“综合变量”和对应的输出“综合变量”。这两个变量共同捕捉了数据中最核心的预测信息。
  3. 剥离已提取信息:将原始数据中已经被这对“潜变量”解释的部分剔除,得到“残差数据”。
  4. 重复过程:在残差数据上重复上述步骤,寻找下一个最佳方向,提取第二对潜变量。这个过程可以持续进行,直到提取出足够数量的潜变量,或者模型性能不再显著提升。
  5. 建立预测模型:最终,PLS将这些潜变量与原始输出变量建立回归关系。当有新的输入数据时,模型会先将其转换为对应的潜变量,再通过回归方程预测出最终的输出结果。

整个过程自动化地完成了从高维、相关数据中提取关键预测因子,并建立简洁高效模型的任务。

MATLAB实现步骤

在MATLAB中实现PLS回归预测非常便捷,主要依赖其内置的统计和机器学习工具。以下是关键步骤:

  1. 数据准备

    • 使用 readtablexlsread 等函数加载数据。
    • 将数据划分为训练集和测试集(可使用 cvpartition)。
    • 对输入和输出数据进行归一化处理(mapminmax 函数),这是PLS的标准预处理步骤。
  2. 模型训练

    • 调用 plsregress 函数,输入训练集的输入矩阵和输出向量。
    • 指定需要提取的潜变量数量。这个数量可以通过交叉验证(Cross-Validation)来确定,以避免过拟合。plsregress 函数会返回模型系数、得分、载荷等关键信息。
  3. 模型验证与潜变量选择

    • 利用交叉验证结果,绘制预测误差随潜变量数量变化的曲线。
    • 选择误差最小或趋于稳定的潜变量数量,作为最终模型的配置。
  4. 预测与评估

    • 使用训练好的模型对测试集进行预测。
    • 计算预测性能指标,如决定系数(R²)、均方根误差(RMSE)等,评估模型的准确性。
    • 使用 plot 函数绘制预测值 vs. 真实值的散点图,直观检验模型效果。

应用场景

偏最小二乘法在众多领域都有广泛应用:

  • 化学与制药:光谱数据分析(如近红外、拉曼光谱),根据光谱特征预测物质浓度或成分。
  • 生物医学:基因表达数据分析,预测疾病状态或治疗反应。
  • 工业过程控制:根据多个传感器读数预测关键产品质量指标。
  • 社会科学:分析调查问卷数据,预测用户满意度或行为倾向。

优势与注意事项

优势

  • 算法成熟稳定,理论基础扎实。
  • 特别擅长处理小样本、多变量、高共线性的数据。
  • 模型具有较好的可解释性,可通过载荷分析了解各输入变量的重要性。

注意事项

  • 数据标准化是必要步骤。
  • 潜变量数量的选择至关重要,需通过交叉验证等方法谨慎确定。
  • 主要适用于线性或近似线性关系;对于强非线性问题,可考虑结合核方法或其他非线性模型。

结语

偏最小二乘法(PLS)作为一种强大的多变量分析工具,在多输入单输出回归预测任务中表现出色。它巧妙地解决了高维数据带来的共线性和维度灾难问题,通过提取关键潜变量,构建出简洁而高效的预测模型。借助MATLAB强大的数据处理和统计分析功能,研究人员和工程师可以轻松实现PLS模型,快速从复杂数据中挖掘价值,为科学决策和工程优化提供有力支持。无论是初学者还是资深从业者,PLS都是一项值得掌握的重要技能。

部分代码

%% 清空环境
warning off;          % 关闭警告提示
clc;                  % 清空命令行
clear;                % 清除工作区变量
close all;            % 关闭所有图形窗口%% 读取数据
res = xlsread('data.xlsx');  % 假设最后一列为输出(标签),其余为输入(特征)
fprintf('数据已加载,共 %d 个样本,%d 个特征。\n', size(res,1), size(res,2)-1);%% 划分训练集和测试集
train_ratio = 0.7;            % 训练集占比
n = size(res, 1);             % 总样本数
trainnum = floor(train_ratio * n);  % 训练样本数量
idx = randperm(n);            % 随机打乱索引% 提取训练集(输入 P,输出 T),并转置为 【特征×样本】格式
P_train = res(idx(1:trainnum), 1:end-1)';  % 输入:前若干列为特征
T_train = res(idx(1:trainnum), end)';      % 输出:最后一列为目标值
M = size(P_train, 2);                      % 训练样本个数% 提取测试集
P_test = res(idx(trainnum+1:end), 1:end-1)'; % 测试输入
T_test = res(idx(trainnum+1:end), end)';     % 测试输出
N = size(P_test, 2);                         % 测试样本个数fprintf('训练集大小: %d 个样本\n', M);
fprintf('测试集大小: %d 个样本\n', N);%% 数据归一化 [0,1]
% 对输入和输出分别进行归一化,并保存参数用于反归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);% 转置为【样本×特征】格式,适配 plsregress 函数输入要求
p_train = p_train';
p_test  = p_test';
t_train = t_train';
t_test  = t_test';

运行结果在这里插入图片描述

在这里插入图片描述

代码下载

https://mbd.pub/o/bread/YZWXlJhvaA==

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

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

相关文章

SQL Server核心架构深度解析

SQL Server 的体系结构是一个复杂但设计精密的系统,主要可以分为四大核心组件,它们协同工作以管理数据库、处理查询、确保数据安全与一致性。以下是其体系结构的核心组成部分: 核心组件:协议层 (Protocol Layer) 作用:…

Django REST Framework Serializer 进阶教程

1. 序列化器概述 在 Django REST Framework(DRF)中,序列化器(Serializer)用于将复杂的数据类型(如模型实例)转换为 JSON 格式,以便于 API 返回给客户端。此外,序列化器还…

面试问题详解十四:Qt 多线程同步【QSemaphore】讲解

在多线程开发中,经常需要控制多个线程对共享资源的访问数量。例如限制同时下载文件的数量、控制数据库连接池的连接使用等等。这时候,Qt 提供的 QSemaphore(信号量)就非常派得上用场。一、什么是 QSemaphore? QSemapho…

Spark mapGroups 函数详解与多种用法示例

mapGroups 是 Spark 中一个强大的分组操作函数,它允许你对每个分组应用自定义逻辑并返回一个结果。以下是多个使用简单样例数据的具体用法示例。基础示例数据假设我们有一个简单的学生成绩数据集:// 创建示例DataFrame val studentScores Seq(("Ma…

【图论】Graphs.jl 图数据的读写与生成器

文章目录图数据的读写Graphs.loadgraphGraphs.loadgraphsGraphs.savegraph保存单个图保存图字典Graphs.loadlg_multGraphs.savelgGraphs.savelg_mult图的生成器1. 随机图模型1.1 Erdős–Rnyi 模型1.2 巴拉巴西-阿尔伯特模型 (无标度网络)1.3 小世界网络模型1.4 随机块模型 (SB…

Go指针全解析:从基础到实战

基本概念与定义指针的定义指针是一种特殊的变量类型,它存储的不是实际数据值,而是另一个变量在计算机内存中的地址。在底层实现上,指针本质上是保存内存位置的无符号整数,它直接指向内存中的特定位置,允许程序直接操作…

Oracle 查询有哪些用户 提示用户名密码无效

要查询 Oracle 数据库中的所有用户,可以使用以下 SQL 查询语句。这个查询将返回数据库中所有用户的列表。 [] SELECT username FROM all_users ORDER BY username;如果你有足够的权限(通常是 DBA 权限),你也可以使用 dba_users 视…

小白成长之路-develops -jenkins部署lnmp平台

文章目录一、准备工作1.1两台虚拟机1.2配置文件1.3免密登录二、实战1.构建主item2.测试nginx,php,mysql2.1新建测试项目2.2与正式项目绑定构建后的操作2.3测试2.4导入discuz项目总结一、准备工作 1.1两台虚拟机 服务器:192.168.144.24 客户端:192.168.…

【HarmonyOS 6】仿AI唤起屏幕边缘流光特效

【HarmonyOS 6】仿AI唤起屏幕边缘流光特效 一、前言 最近在做 HarmonyOS 6.0 的适配,发现 Beta1版本里多了个很实用的视效功能——自带背景的双边流光。 之前做屏幕边缘流光特效的时候,要么得自己写渐变动画拼效果,要么就得套好几个组件叠层&…

跟做springboot尚品甄选项目

springbootvue3 【尚硅谷Java项目《尚品甄选》 SpringBootSpringCloud萌新学会企业级java项目】003.后台系统-搭建前端环境(工程创建)_哔哩哔哩_bilibili E:\project\AllProJect\Shangpin Selection\项目材料素材\课件\尚品甄选项目课件 前端套用框架…

【Linux】创建线程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章目录 一、为什么需要线程? 创建线程 示例:计算斐波恩夕法 一、为什么需要线程? 在多核处理器的计算机上,线程可…

HTML应用指南:利用POST请求获取全国九号电动车体验店服务店位置信息

九号公司(Ninebot)作为全球领先的智能短途出行解决方案提供商,始终秉持“智慧移动,愉悦生活”的品牌理念,致力于为个人用户打造安全、智能、时尚的城市出行体验。依托“智能硬件 + 数字服务 + 线下触点”三位一体的战略布局,九号公司已建立起覆盖全国、辐射全球的销售与服…

Kafka面试精讲 Day 4:Consumer消费者模型与消费组

【Kafka面试精讲 Day 4】Consumer消费者模型与消费组 在“Kafka面试精讲”系列的第四天,我们将深入探讨Kafka的核心组件之一——Consumer消费者模型与消费组(Consumer Group)。这是Kafka实现高吞吐、可扩展消息消费的关键机制,也…

使用 Uni-app 打包 外链地址APK 及 iOS 注意事项

本文详细介绍了如何使用 Uni-app 框架将项目打包为 Android APK 和 iOS 应用,重点讲解了 minSdkVersion、targetSdkVersion 和 abiFilters 的配置,以及 iOS 开发的注意事项。文章还包含了您提供的 WebView 示例代码,并提供了关键的注意事项&a…

异常处理小妙招——3.构造函数的安全第一原则:为什么不在构造函数中抛出异常?

文章目录灾难性的生日派对构造函数:对象的出生证明安全第一:严格的出生检查为什么要在构造函数中严格验证?1. 避免"僵尸对象"2. Fail-Fast(快速失败)原则现实世界的实践建议1. 使用工厂方法模式2. 使用Build…

iptables 和 ip route

文章目录iptables原理及常用命令表链链表链表总结iptables 常用命令及参数1. 规则管理命令 (Commands)2. 规则匹配参数 (Rule-Specification - Matches)3. 目标动作参数 (Target)命令示例配置流程示例ip route常用命令iptables和ip route的联系实用命令示例对比iptables原理及常…

RPC和HTTP的区别?

RPC和HTTP是两种不同的通信协议,它们在通信方式、性能效率以及灵活性可扩展性等方面存在区别。以下是具体分析: 通信方式 RPC:RPC是基于远程过程调用的二进制协议,它允许客户端像调用本地函数一样调用远程服务器上的函数或方法[2]…

贝叶斯分类(Bayes Classify)

一. 核心思想贝叶斯分类是一类基于贝叶斯定理(Bayes Theorem)和概率统计的分类算法,核心思想是 “通过已知的先验概率,结合数据的似然性,计算后验概率,最终将样本归为后验概率最高的类别”。它在机器学习、…

怎么熟悉业务,我是做前端的,但对业务了解没有渠道

作为前端开发者,想深入了解业务但“没有渠道”,这是非常普遍的痛点。很多前端同学只接到“切图实现页面”的任务,久而久之就成了“实现工具人”。但业务理解力,恰恰是区分“初级”和“高级”前端的核心分水岭。 好消息是&#xff…

如何批量在PDF文档最后一页盖章?

在面对上百份需要处理的 PDF 文档时,逐个打开文档盖章再进行保存,这些步骤不仅提高我们工作的繁琐,还容易导致处理位置错误或遗漏。那么怎么去将 PDF 文档末页实现批量自动打上电子印章?一般的方式没有办法来满足我们高效率办公的…