matlab - 使用 QR 分解 (MATLAB) 求解线性回归模型
问题描述
背景:我想实现一个 MATLAB 算法,它以 x 和 y 作为输入向量,使用修改后的 QR 版本解决与存储在 x 和 y 中的数据相关的线性回归问题,然后绘制线性函数图。
所以首先我写了修改后的 QR 算法:
function x=QRQ(A,b,n)
[Q1,R1]=qr(A);
c1=Q1'*b;
n=length(c1);
x=backward(R1,c1,n);
end
function x=backward(U,y,n)
x=zeros(n,1);
x(n)=y(n)/U(n,n);
for i=n -1 : -1 : 1
x(i)=(y(i)-U(i,i+1 : n)*x(i+1 : n))/U(i,i);
end
end
然后我写了线性回归的算法:
function ysol = LinearReg(x,y)
A=[x ones(21,1)];
z=QRQ(A,y,2);
ysol=z(1)*x+z(2);
plot(x,y,'bo',x,ysol,'g-');
end
我尝试在以下数据上运行此算法:
x=[0;0.25;0.5;0.75;1;1.25;1.5;1.75;2;2.25;2.5;2.75;3;3.25;3.5;3.75;4;4.25;4.5;4.75;5];
y=[4;3;7;7;1;4;4;6;7;7;2;6;6;1;1;4;9;3;5;2;7];
我收到的完整错误消息是:
Index in position 2 exceeds array bounds (must not exceed 2).
Error in untitled>backward (line 12)
x(n)=y(n)/U(n,n);
Error in untitled>QRQ (line 8)
x=backward(R1,c1,n);
Error in untitled>LinearReg (line 20)
z=QRQ(A,y,2);
导致错误的行是 x(n)=y(n)/U(n,n); 唯一在位置 2 具有索引的变量是 U。显然 U 只有 2 列,并且 n 的值 > 2,因此存在错误。使用调试器,我看到 U 是一个 21x2 数组,n 的值为 21。
如何修复这个 MATLAB 算法?
解决方案
在U
你的情况下是R1
. 由于矩阵A
的秩为二,R1
因此只有两列,因为A
已经只有两列。然后,您尝试R1 * x = y
使用从 开始的索引使用反向替换来求解系统n
,但在这里您显然必须从 开始2
。
(请记住,这R1
是一个上三角矩阵。)
推荐阅读
- jquery - jQuery if 语句使用需要选择部分中的所有页面的 URL,但有例外
- python - pandas csv to psql:输出中正在生成附加列(?)
- javascript - Adobe Acrobat 的嵌入式 Javascript 代码:TypeError:this.getField 不是函数
- c# - 具有命名空间的 Linq XML Xelement 返回 Null
- java - 如何解决 allure-maven 插件上的 ClassNotFoundException(预期为 jetty 7)
- excel - 在电子邮件正文中添加图表
- c# - 如何使用反射从另一个类创建实例
- sql - 更高效的 SQL 查询访问
- r - 大小参数在 ggplot2 的 geom_errorbar 中不起作用
- typescript - 在 TypeScript 中创建 HTMLHeadingElement