☰
递推最小二乘与渐消记忆参数辨识:MATLAB实现与对比
2026/11/2 4:07:44 网站建设 项目流程

简介:这份资源面向学习系统辨识、自动控制与信号处理的学生及工程人员,提供一套基于最小二乘类算法的参数辨识 MATLAB 程序,用于解决线性系统参数在线估计与辨识问题。压缩包共 1 个 docx 文件,约 78KB,以文档形式完整呈现程序代码与仿真说明,便于对照阅读与复现。内容围绕递推最小二乘与渐消记忆最小二乘两种方法展开:先构造极点位于单位圆内的稳定系统,生成 500 点 M 序列输入并叠加白噪声扰动,再通过增益矩阵与估计方差递推更新参数,并绘制参数估计过程曲线;随后将递推语句中的遗忘因子改为 0.998,对比两种算法的辨识精度差异。读者可据此理解遗忘因子对参数跟踪效果的影响,掌握从系统建模、数据生成到结果可视化的完整流程,并可直接将代码迁移至控制系统或信号处理中的参数估计任务。目前已有 2162 人学习。

1. 最小二乘参数辨识:为什么“猜参数”这件事能算得这么准

你有没有遇到过这种场景:手里有个系统,输入输出数据都测得到,但系统内部那几个关键系数是多少,完全不知道。就像你有一台老式音响,旋钮转了多少度你看不见,只能靠放不同音乐、听声音变化,反推每个旋钮大概在什么位置。参数辨识干的就是这件事——用能观测到的输入输出,反推系统内部那组看不见的参数。

而最小二乘,是干这件事最经典、最朴素的一把工具。它的思路一句话就能说清:找一组参数,让模型算出来的输出和真实测到的输出,误差平方和最小。这份 MATLAB 程序演示的正是这套思路的递推版本:不用等攒齐所有数据再一次性算,而是每来一个新采样点就更新一次参数估计,边跑边修正。对搞控制、信号处理的人来说,这是绕不开的基础功,也是理解“在线估计”这四个字最直观的入口。

2. 递推最小二乘到底在递推什么:从一次性算账到边跑边改

2.1 一次性最小二乘的困境:数据一多就算不动

先把最朴素的最小二乘想成“一次性算总账”。假设你采集了 N 组输入输出数据,把它们排成矩阵形式,标准解是参数估计等于数据矩阵伪逆乘以输出向量。数学上很干净,但工程上有个硬伤:矩阵求逆的计算量随数据量增长得很快,而且每新增一个采样点,整个矩阵都得重算一遍。

打个比方,这就像你每记一笔账,都要把前面所有账目重新加总一次。记十笔还行,记一万笔就纯属折磨。更麻烦的是,很多系统是实时运行的,参数可能随时间缓慢漂移,你不可能停下来攒够数据再算。所以工程上真正需要的,是一种“来一个点、改一点”的算法,而不是“攒一堆、算一次”。

递推最小二乘就是为这个需求生的。它把一次性求逆拆成一步步的小修正,每来一个新数据,只做几次向量和矩阵乘法,计算量恒定,内存也只需要存当前参数估计和一个小矩阵。这份程序里那个 4×4 的 P 矩阵,就是承载“历史信息”的黑匣子,它的大小不随数据量增长,这是递推算法最值钱的地方。

2.2 三个核心变量:Theta、P、K 各管什么

看这份程序的递推循环,真正在动的只有三个量,搞懂它们的分工,整个算法就不玄了。

Theta 是参数估计值,也就是你要猜的那组系数。程序里初始化成四个 1,意思是“我先瞎猜一组”,然后靠数据一点点把它拉向真值。它对应系统差分方程里 z(k+1)、z(k)、u(k+1)、u(k) 前面的四个系数,真值分别是 -1.8、0.9、0.75、0.5。

P 是估计方差矩阵,通俗说就是“我对当前估计有多不确定”。初始化成 100 倍单位阵,表示一开始非常不确定,谁都不信。随着数据进来,P 会逐渐缩小,表示信心在增加。它同时决定了新数据能对参数产生多大影响——P 大,新数据话语权大;P 小,参数就趋于稳定。

K 是增益矩阵,可以理解成“这次新数据带来的修正力度”。它由 P 和新数据向量共同算出,本质是在“相信历史”和“相信新观测”之间做加权。程序里那句K=P*h*inv(h'*P*h+1),分母里的 1 代表噪声方差,整个式子就是在算一个最优的折中比例。

% 递推核心:每来一个新采样点,更新一次参数 h = [-z(i-1); -z(i-2); M(i-1); M(i-2)]; % 当前回归向量,由历史输出和输入拼成 K = P * h * inv(h' * P * h + 1); % 增益:新数据该信几分 Theta(:,i-1) = Theta(:,i-2) + K * (z(i) - h' * Theta(:,i-2)); % 按预测误差修正参数 P = (eye(4) - K * h') * P; % 更新不确定度,信心随数据增加

这段代码里,z(i) - h'*Theta是“预测误差”,也就是模型猜的输出和真实输出差多少。K 乘上这个误差,就是这次要往哪个方向修、修多少。P 的更新则保证随着数据累积,修正幅度自然收敛,不会一直剧烈跳动。参数说明上,分母那个+1对应噪声方差为 1 的假设,如果噪声方差不同,这个位置要相应调整,否则增益尺度会偏。

2.3 为什么普通递推会“始终有偏差”

程序跑完第一版,作者发现一个现象:四条参数曲线都朝着真值靠,但最后都停在离真值差一点的位置,怎么都贴不上去。这不是代码写错了,而是普通递推最小二乘的固有特性。

原因在于 P 矩阵会越缩越小。数据越多,算法越“自信”,新数据的修正力度被压得越低。当 P 缩到很小,后面再来的数据几乎改不动参数了,早期数据里那点噪声造成的小偏差就被永久固化下来。通俗地说,这算法记性太好、忘性太差,把开头几笔不太准的账一直带在身上。

这在系统参数恒定、噪声干净时问题不大,偏差有限。但一旦系统参数有缓慢变化,或者你希望估计更贴近真值,这种“只信历史、不认新账”的脾气就成了短板。渐消记忆法就是冲着这个短板去的。

3. 渐消记忆最小二乘:给老数据“打个折”的思路

3.1 遗忘因子 0.998 改的到底是什么

程序第二版只动了两行:把增益分母里的+1改成+0.998,把 P 更新末尾除以0.998。就这两处,结果明显更贴近真值。这个 0.998 就是遗忘因子,通常记作 λ,取值在 0 到 1 之间,越接近 1 忘得越慢。

它的作用机制可以这样理解:每次更新后,把 P 整体放大一点点(除以小于 1 的数等于放大)。P 被放大,意味着算法主动“恢复一点不确定”,让新数据重新拥有话语权。老数据的影响被按比例打折,越老折得越狠,所以叫渐消记忆。

打个比方,普通递推像一本越写越厚的账本,每页权重一样,新页很难盖过旧页;渐消记忆则像每隔一段时间把旧账按折扣重估一次,让最近的记录更有分量。0.998 这个值意味着大约每 500 个采样点,老数据的权重衰减到原来的三成多,节奏和这份程序 500 点的数据长度正好匹配。

% 渐消记忆版:仅两处改动,遗忘因子 lambda = 0.998 lambda = 0.998; K = P * h * inv(h' * P * h + lambda); % 分母由 1 改为 lambda Theta(:,i-1) = Theta(:,i-2) + K * (z(i) - h' * Theta(:,i-2)); P = (eye(4) - K * h') * P / lambda; % 更新后整体放大,恢复部分不确定度

参数上,λ 越小平滑性越差但跟踪越快,λ 越接近 1 越稳但跟踪慢。选 λ 本质是在“抗噪声”和“跟变化”之间找平衡,没有万能值,得看系统参数漂移速度和噪声水平。这份程序里 0.998 是配合 500 点数据量试出来的经验值,换个数据长度未必照搬。

3.2 它和普通递推的本质差别:记忆的长度

把两版放一起看,差别不在公式复杂度,而在“记忆长度”这个隐含设定。普通递推的记忆是无限长的,所有历史数据等权参与;渐消记忆的记忆是有限的、指数衰减的,相当于只重点参考最近一段窗口内的数据。

这个差别决定了适用场景。系统参数恒定、噪声小、数据量不大时,普通递推够用且更稳;系统参数会漂移、或者你怀疑早期数据质量差时,渐消记忆更合适。代价是它对噪声更敏感,λ 设得太小,参数曲线会抖得厉害,反而看不清趋势。

提示:遗忘因子不是越小越好。λ 太小等于主动丢弃大部分历史,噪声会被放大成参数抖动;λ 太接近 1 又退化成普通递推。实际调参时先看参数曲线是否收敛,再看是否贴真值,两头兼顾。

3.3 从仿真结果能读出什么

程序最后用plot把四条参数估计曲线和四条真值水平线画在一起,这个可视化不是装饰,是判断算法是否工作的主要手段。看这张图要盯三件事:曲线是否收敛(不再大幅波动)、收敛后是否贴近真值线、收敛速度是否可接受。

第一版图里,曲线收敛了但和真值线有明显间隙,这就是普通递推的偏差在图上现形。第二版图里,间隙明显缩小,说明遗忘因子起了作用。这种“先看现象、再改一行、再看现象”的调试方式,比背公式更能建立对算法的直觉。图形可视化在这里扮演的是黑匣子读数的角色,参数辨识这种看不见摸不着的过程,全靠它把内部状态摊开给你看。

4. 几个容易混淆的概念:别把最小二乘和它的近亲搞混

4.1 参数辨识 vs 系统辨识

易混点:两个词经常混着用,好像是一回事。为什么混:都涉及“从数据里认识系统”,外行听起来没差别。怎么区分:系统辨识范围更大,包含确定模型结构(几阶、什么形式)和估计参数两件事;参数辨识是在模型结构已经定好的前提下,只估那组系数。这份程序里差分方程形式是给定的,只估四个系数,属于参数辨识,不是完整的系统辨识。

4.2 递推最小二乘 vs 渐消记忆最小二乘

易混点:以为后者是前者的升级替代品。为什么混:程序里两版代码只差两行,看起来像修 bug。怎么区分:它们是同一家族的两个变体,针对不同假设。普通递推假设参数恒定、历史等权;渐消记忆假设参数可能漂移、近期数据更重要。不是谁替代谁,是看你的系统属于哪种情况再选。

4.3 最小二乘 vs 最小均方

易混点:名字都带“最小”,都用来做估计。为什么混:目标函数形式相近,都是让误差小。怎么区分:最小二乘是最小化误差平方和,有明确的闭式解和递推形式,偏“批处理/统计”思路;最小均方(LMS)是自适应滤波里的梯度下降方法,一步步沿梯度走,不追求每步最优,偏“在线跟踪”思路。这份程序用的是最小二乘家族,不是 LMS。

4.4 白噪声方差 vs 遗忘因子

易混点:两者都出现在增益公式的分母位置,容易以为是一类东西。为什么混:普通递推分母是+1(噪声方差),渐消记忆分母是+0.998(遗忘因子),位置一样。怎么区分:噪声方差描述的是数据里的随机扰动强度,是系统属性;遗忘因子是你主动设定的算法参数,控制记忆长度。前者该是多少由实际噪声决定,后者是调参手段,两者物理含义完全不同,只是恰好占同一个公式位置。

4.5 估计方差 P vs 参数误差

易混点:看到 P 变小就以为参数一定准了。为什么混:P 确实表示“不确定度”,直觉上越小越准。怎么区分:P 反映的是算法自身对估计的信心,不是真实误差。如果模型结构不对、噪声有偏,P 照样会缩小,但参数可能一直偏。所以判断准不准要看和真值的对比(仿真里能看),实际系统里要看预测残差,不能只信 P。

5. 什么时候该用这套程序,什么时候别硬套

这套 MATLAB 程序最适合的场景很明确:线性差分方程形式已知、参数待估、数据能在线或分段获得、噪声大致平稳。拿它入门递推最小二乘和渐消记忆法,代码短、变量少、结果可视化直观,跑一遍就能把 Theta、P、K 三者的关系看明白。控制系统里辨识对象模型、信号处理里估 AR 模型系数,思路都是这一套。

但有几类情况别硬套。第一,模型结构本身不确定时,先做结构辨识,别指望调参数能救回错误的模型形式。第二,噪声是有色噪声或和输入相关时,普通最小二乘会有偏,需要工具变量法之类的变体,这份程序没覆盖。第三,系统强非线性时,线性差分方程这套框架从根上就不适用。第四,遗忘因子别乱设,λ 太小会让参数抖到没法用,这份程序里 0.998 是配合 500 点数据的经验值,换数据长度要重新试。

我自己的习惯是,每次拿到一组新数据跑辨识,先不急着调遗忘因子,而是先用普通递推看残差和 P 的收敛情况,确认模型结构和数据质量没问题,再决定要不要上渐消记忆。有一次我跳过这步直接调 λ,结果把数据里的异常点当成了参数漂移去跟踪,曲线抖得一塌糊涂,回头查才发现是采集环节出了问题。从那以后我每次辨识前都强制先跑一遍普通递推看基线,再决定动不动遗忘因子。希望这套程序的思路和这份踩坑经验,能帮你在自己的参数辨识任务里少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询