一文理清最小二乘法估计

news2024/11/23 3:49:00

1 最小二乘法估计(LS)

1.1 原理与推导

最小二乘法最早是高斯在预估星体轨道时提出来的,后来成为了估计理论的奠基石。考虑如下CAR模型:

其中:

 

 参数估计的任务就是根据输入和输出,估计出a1,a2,----,ana,b1,b2,...,bnb这na+nb+1个参数。

将1-1式改成差分方程形式:

 对于L组输入{y(k),u(k),k=1,2,...,L},系统参数的最小二乘估计为:

其中:

 

上式推导过程为:

对于第k次测量,其残差为:

构造如下性能指标J:

 当J取极小值时,将有:

此时有:

 1.2 例子

考虑如下系统:

 Matlab程序为:

%最小二乘参数估计(LS)
clear all;

a=[1 -1.5 0.7]'; b=[1 0.5]'; d=3; %对象参数
na=length(a)-1; nb=length(b)-1; %na、nb为A、B阶次

L=400; %数据长度
uk=zeros(d+nb,1); %输入初值:uk(i)表示u(k-i)
yk=zeros(na,1); %输出初值
x1=1; x2=1; x3=1; x4=0; S=1; %移位寄存器初值、方波初值
xi=sqrt(1)*randn(L,1); %白噪声序列

theta=[a(2:na+1);b]; %对象参数真值
for k=1:L
    phi(k,:)=[-yk;uk(d:d+nb)]'; %此处phi(k,:)为行向量,便于组成phi矩阵
    y(k)=phi(k,:)*theta+xi(k); %采集输出数据
    
    M=xor(x3,x4); %产生M序列
    IM=xor(M,S);  %产生逆M序列
    if IM==0
        u(k)=-1;
    else
        u(k)=1;
    end
    S=not(S); %产生方波
    
    %更新数据
    x4=x3; x3=x2; x2=x1; x1=M; 
    
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=u(k);
    
    for i=na:-1:2
        yk(i)=yk(i-1);
    end
    yk(1)=y(k);
end
thetae=inv(phi'*phi)*phi'*y' %计算参数估计值thetae(结果见MATLAB命令窗口)

 运行结果:

thetae =

   -1.5159
    0.7206
    1.0439
    0.4714

 2 递推最小二乘法(RLS)

 递推最小二乘法RLS是最小二乘法LS的改进版,它可以根据采样的实时数据来不断修正估计参数,从而做到参数的实时估计。其基本思想是:

RLS的实施步骤为:

对于上节中的例子,Matlab程序:

%递推最小二乘参数估计(RLS)
clear all; close all;

a=[1 -1.5 0.7]'; b=[1 0.5]'; d=3; %对象参数
na=length(a)-1; nb=length(b)-1; %na、nb为A、B阶次

L=400; %仿真长度
uk=zeros(d+nb,1); %输入初值:uk(i)表示u(k-i)
yk=zeros(na,1); %输出初值
u=randn(L,1); %输入采用白噪声序列
xi=sqrt(0.1)*randn(L,1); %白噪声序列

theta=[a(2:na+1);b]; %对象参数真值

thetae_1=zeros(na+nb+1,1); %thetae初值
P=10^6*eye(na+nb+1); 
for k=1:L
    phi=[-yk;uk(d:d+nb)]; %此处phi为列向量
    y(k)=phi'*theta+xi(k); %采集输出数据
   
    %递推最小二乘法
    K=P*phi/(1+phi'*P*phi);
    thetae(:,k)=thetae_1+K*(y(k)-phi'*thetae_1);
    P=(eye(na+nb+1)-K*phi')*P;
    
    %更新数据
    thetae_1=thetae(:,k);
    
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=u(k);
    
    for i=na:-1:2
        yk(i)=yk(i-1);
    end
    yk(1)=y(k);
end
plot([1:L],thetae); %line([1,L],[theta,theta]);
xlabel('k'); ylabel('参数估计a、b');
legend('a_1','a_2','b_0','b_1'); axis([0 L -2 1.5]);

 运行结果:

3 遗忘因子最小二乘法(FFRLS)

3.1 FFRLS原理

对于参数时变系统,RLS易出现数据饱和现象,就是随着时间的变化,矫正矩阵P(k)和K(k)越来越小,从而其矫正作用越来越弱,这将导致较大的估计误差。遗忘因子最小二乘法可以较好的处理这个问题。

FFRLS的实施步骤为:

3.2 例子

 考虑系统

Matlab程序为:

%遗忘因子递推最小二乘参数估计(FFRLS)
clear all; close all;

a=[1 -1.5 0.7]'; b=[1 0.5]'; d=3; %对象参数
na=length(a)-1; nb=length(b)-1; %na、nb为A、B阶次

L=2000; %仿真长度
uk=zeros(d+nb,1); %输入初值:uk(i)表示u(k-i)
yk=zeros(na,1); %输出初值
u=randn(L,1); %输入采用白噪声序列
xi=sqrt(0.1)*randn(L,1); %白噪声序列

thetae_1=zeros(na+nb+1,1); %thetae初值
P=10^6*eye(na+nb+1);
lambda=1; %遗忘因子范围[0.9 1]
for k=1:L
    if k==501
        a=[1 -1 0.4]';b=[1.5 0.2]'; %对象参数突变
    end
    theta(:,k)=[a(2:na+1);b]; %对象参数真值
    
    phi=[-yk;uk(d:d+nb)];
    y(k)=phi'*theta(:,k)+xi(k); %采集输出数据
   
    %遗忘因子递推最小二乘法
    K=P*phi/(lambda+phi'*P*phi);
    thetae(:,k)=thetae_1+K*(y(k)-phi'*thetae_1);
    P=(eye(na+nb+1)-K*phi')*P/lambda;
    
    %更新数据
    thetae_1=thetae(:,k);
    
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=u(k);
    
    for i=na:-1:2
        yk(i)=yk(i-1);
    end
    yk(1)=y(k);
end
subplot(1,2,1)
plot([1:L],thetae(1:na,:)); hold on; plot([1:L],theta(1:na,:),'k:');
xlabel('k'); ylabel('参数估计a');
legend('a_1','a_2'); axis([0 L -2 2]);
subplot(1,2,2)
plot([1:L],thetae(na+1:na+nb+1,:)); hold on; plot([1:L],theta(na+1:na+nb+1,:),'k:');
xlabel('k'); ylabel('参数估计b');
legend('b_0','b_1'); axis([0 L -0.5 2]);

 当设置遗忘因子为1时,参数估计如图所示有比较大的误差:

当设置遗忘因子为0.99时,参数估计如图所示:

4 递推增广最小二乘法(RELS)

4.1 RELS原理

当系统模型的干扰为有色噪声时,系统方程表示为

 

 写成最小二乘形式为:

增广最小二乘法 实施步骤:

 4.2 例子

.考虑系统

 Matlab程序:

%递推增广最小二乘参数估计(RELS)
clear all; close all;

a=[1 -1.5 0.7]'; b=[1 0.5]'; c=[1 -1 0.2]'; d=3; %对象参数
na=length(a)-1; nb=length(b)-1; nc=length(c)-1; %na、nb、nc为A、B、C阶次

L=1000; %仿真长度
uk=zeros(d+nb,1); %输入初值:uk(i)表示u(k-i)
yk=zeros(na,1); %输出初值
xik=zeros(nc,1); %噪声初值
xiek=zeros(nc,1); %噪声估计初值
u=randn(L,1); %输入采用白噪声序列
xi=sqrt(0.1)*randn(L,1); %白噪声序列

theta=[a(2:na+1);b;c(2:nc+1)]; %对象参数

thetae_1=zeros(na+nb+1+nc,1); %na+nb+1+nc为辨识参数个数
P=10^6*eye(na+nb+1+nc);
for k=1:L
    phi=[-yk;uk(d:d+nb);xik];
    y(k)=phi'*theta+xi(k); %采集输出数据
    
    phie=[-yk;uk(d:d+nb);xiek]; %组建phie
    
    %递推增广最小二乘法
    K=P*phie/(1+phie'*P*phie);
    thetae(:,k)=thetae_1+K*(y(k)-phie'*thetae_1);
    P=(eye(na+nb+1+nc)-K*phie')*P;
    
    xie=y(k)-phie'*thetae(:,k); %白噪声的估计值
    
    %更新数据
    thetae_1=thetae(:,k);
    
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=u(k);
    
    for i=na:-1:2
        yk(i)=yk(i-1);
    end
    yk(1)=y(k);
    
    for i=nc:-1:2
        xik(i)=xik(i-1);
        xiek(i)=xiek(i-1);
    end
    xik(1)=xi(k);
    xiek(1)=xie;
end
figure(1)
plot([1:L],thetae(1:na,:));
xlabel('k'); ylabel('参数估计a');
legend('a_1','a_2'); axis([0 L -2 2]);
figure(2)
plot([1:L],thetae(na+1:na+nb+1,:));
xlabel('k'); ylabel('参数估计b');
legend('b_0','b_1'); axis([0 L 0 1.5]);
figure(3)
plot([1:L],thetae(na+nb+2:na+nb+nc+1,:));
xlabel('k'); ylabel('参数估计c');
legend('c_1','c_2'); axis([0 L -2 2]);

 运行结果

 

参考:系统辨识与自适应控制Matlab仿真(第3版),庞中华,崔红编著

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

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

相关文章

【MySQL数据库】MySQL日志管理、备份与恢复

MySQL日志管理、备份与恢复 一、MySQL日志管理1.1日志存放位置 二、数据备份2.1物理备份与逻辑备份2.2完整备份、差异备份、增量备份2.3常见的备份方法 三、完整备份与恢复3.1物理冷备份与恢复3.2mysqldump 备份3.3mysqldump数据恢复3.4MySQL增量备份3.5MySQL增量恢复 一、MySQ…

51单片机 - 期末复习重要图

AT89S51片内硬件结构 1.内部硬件结构图 2.内部部件简单介绍 3. 26个特殊功能寄存器分类 按照定时器、串口、通用I/O口和CPU 中断相关寄存器:3IE - 中断使能寄存器IP - 中断优先级寄存器 定时器相关寄存器6TCON - 定时器/计数器控制寄存器TMOD - 定时器/计数器模…

数字图像处理(三)

目录 实验六、图像分割方法 实验七、图像识别与分类 实验六、图像分割方法 一、实验目的 了解图像分割技术相关基础知识;掌握几种经典边缘检测算子的基本原理、实现步骤理解阈值分割、区域分割等的基本原理、实现步骤。理解分水岭分割方法的基本原理、实现方法。…

清华大学实验室走在科研管理前沿,与Zoho合作推进新模式

在教育科研工作中,在重视科研的同时,也不能忽略科研管理的重要性。做好教育科研的管理工作,可以有效提高科研工作的效率和质量。项目管理软件可以帮助教育科研团队更加高效地管理项目,并且简化团队成员之间的协作和沟通&#xff0…

【玩转Docker小鲸鱼叭】理解Docker的核心概念

Docker核心概念 Docker有三大核心概念:镜像(Image)、容器(Container)、仓库(Repository) 1、镜像(Image) Docker镜像 是我们创建和运行Docker容器的基础,它…

青大数据结构【2019】【三分析计算】

关键字: 邻接表时间复杂度、哈希表、平均查找长度ASL、堆排序 邻接表表示法 在邻接表上执行图的遍历操作时,需要对邻接表中所有的边(链表中的结点)访问一次,还需要对所有的顶点访问一次,故时间代价为O(n+2)。 1) 散列序号 0 1 2 3 4 5 6 7 元素 19 15 8 5 13 20

奉加微电子PhyPlusKit软件怎么使用

摘要:本文简介使用奉加微电子PhyPlusKit软件清除芯片、制作hexf文件、烧录程序、串口调试等操作方法。 所用硬件: PHY6222开发板,这个开发板上自带了CP210X串口芯片,与电脑的接口的type-c,既可以供电,又可…

探索Gradio Interface的强大功能与无限可能性——launch方法介绍

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

记录一个iOS头部放大计算

视图层级:由于这是在原有的视图层级的基础上完成的放大功能,所以记录了一下计算方法, tableview 和 放大的背景图片都是self.view的子视图,下拉的时候要方法,上滑的时候要同步上移图片 核心代码 [self.view addSubview…

回了一趟老家,我发现老家没有想象中那么舒服!

大家好,我是千与千寻,千寻最近回了一趟老家,说到回老家,我相信说应该大部人觉得是很舒服,自己很满意的生活节奏与感觉。 但是千寻在老家的这一个星期,感受到了非常多的不舒适,希望和星友们聊聊看…

三极管选型

来源网络,仅作笔记 三极管如何选型? 应根据电路的实际上需选取三极管的类别,即三极管在电路中的效用应与所选三极管的机能相吻合。 三极管的品种很多,分类的方式也不同,一般按半导体导电特点分成NPN型与PNP型两大类;按其在电路中…

zabbix-2-创建自定义监控项

例如监控iostat 下的sda tps值 [rootnode1 ly]# iostatLinux 3.10.0-1160.53.1.el7.x86_64 (node1) 2023年06月13日 _x86_64_ (32 CPU)avg-cpu: %user %nice %system %iowait %steal %idle0.06 0.00 0.04 0.01 0.00 99.89Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 1…

网工内推 | 金融业网工专场,员工旅游,带薪年假,节日福利

01 银信科技 招聘岗位:网络工程师 职责描述: 1) 负责分支机构筹建网络系统调试与部署工作、网络运维管理及问题处理支持; 2) 处理外部代理点系统及网络问题协助支持; 3) 负责网络日志平台监控及…

PyCharm安装教程(图文结合,超详细,小白安装必看)

PyCharm安装教程(图文结合,超详细,小白安装必看) 一、Python开发环境 PyCharm集成开发工具(IDE),是当下全球Python开发者,使用最频繁的工具软件。 绝大多数的Python程序,都是在PyCharm工具内…

python控制台学生管理系统

代码与注释 具体功能说明 设计初始界面设计学生信息录入 【数据校准】录入判断 学生姓名不能为空,并且不成超过4个字【数据校准】录入判断年龄在0-120 需要进行判断【数据校准】录入需要判断学号是否为空与学号是否在10位数【数据校准】录入需要判断成绩是否在0-1…

python数据分析-Mysql中NULL和‘ ‘怎么处理(不使用update)

一、空值NULL和空字符’ ’ 展示代码使用的版本是:8.0.28 空值NULL的长度是NULL,是占用存储空间的。空字符串’ 的长度是0,是不占用空间的。 理解:空字符串就像是一个真空状态的杯子,什么都没有;而空值NULL_就像是一…

17-事件循环(实现单线程非阻塞的方法就是事件循环)

一、是什么 🧀🧀🧀首先,JavaScript是一门单线程的语言,意味着同一时间内只能做一件事,但是这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环 在JavaScript中,所有…

Vue路由模式

1. vue路由简介和基础使用 1.1 什么是路由 设备和ip的映射关系 接口和服务的映射关系 路径和组件的映射关系 1.2 为什么使用路由? 在一个页面里, 切换业务场景,具体使用示例: 网易云音乐 网易云音乐 单页面应用(SPA): 所有功能在一个html页面上实现 前…

虚拟内存(Virtual Memory)

什么是虚拟内存? 虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理。…

.NET的AsyncLocal用法指南

AsyncLocal用法简介 通过 AsyncLocal 我们可以在一个逻辑上下文中维护一份私有数据,该上下文后续代码中都可以访问和修改这份数据,但另一个无关的上下文是无法访问的。 无论是在新创建的 Task 中还是 await 关键词之后,我们都能够访问前面设…