首页 > 解决方案 > 使用 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 算法?

标签: matlabmatrixlinear-regression

解决方案


U你的情况下是R1. 由于矩阵A的秩为二,R1因此只有两列,因为A已经只有两列。然后,您尝试R1 * x = y使用从 开始的索引使用反向替换来求解系统n,但在这里您显然必须从 开始2

(请记住,这R1是一个上三角矩阵。)


推荐阅读