多元线性方程的线性回归系数

时间:2015-03-06 16:01:40

标签: matlab linear-regression

对于Zi=ai*Xi+bi*Yi,我有i = 1..30形式的多个线性方程式。 如何使用MATLAB为每个a组合计算每对回归系数值,或b(Z,X,Y)的30个值?

我尝试过以下代码:

A=Z; B=[Xs Ys];
C = B \ A;

A是我的Z点,而B是我的XY点的矩阵。但是,我似乎只得到所有点的一对回归系数。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果我了解您的问题表达方式,那么您所设置的内容很可能不是解决问题的正确方法。该假设假设您尝试将所有点放在一行。因此,B的每一行仅作为一个行上的一个点,您试图找到线性回归。如果你想同时解决多条线,你需要改变你的配方。

这实际上非常简单。我将假设您有30 (x,y)个点,其中每个点表示一条线的等式。您将这些设置为XsYs。这些方程中的每一个的输出也在Zs中。我还假设这些是向量,因此,您有一个系统设置:

a_ib_i是每行的系数。您知道每行的(x,y),您的目标是为每个对应的ab求解。因此,您需要重新构建系统,以便解决ab

以矩阵形式重写该问题,可以这样做:

a_1, b_1, a_2, b_2, ...的右侧向量是您最终要解决的问题。你可以看到我们有一个Y = M*X的矩阵方程,其中MY是已知的,X是我们需要通过X = M\Y来解决的问题。因此,您需要将xy值重新排列为如上所述的块矩阵。首先,我们需要找到正确的线性索引,以便我们可以将xy值放入此矩阵中,然后使用ldivide运算符通过最小二乘法求解系统。矩阵是N x 2N矩阵,其中N是我们所拥有的方程式或约束的总数(因此在您的情况下为30):

N = numel(Xs);
M = zeros(N, 2*N);
xind = sub2ind(size(M), 1:N, 1:2:2*N);
yind = sub2ind(size(M), 1:N, 2:2:2*N);
M(xind) = Xs;
M(yind) = Ys;

sub2ind允许您使用一行代码将多个值放入矩阵中。具体来说,sub2ind从一组行和列坐标中确定线性索引以访问矩阵。如果您还不知道,可以使用单个数字而不是一对行和列来访问矩阵中的值(和设置值)。 sub2ind允许您通过指定要在矩阵中使用相应向量访问的一组线性索引,一次在矩阵中设置多个值。

在我们的例子中,我们需要两组线性索引 - 一组用于x值,另一组用于y值。请注意,x值从第一列开始,并跳过每隔一列。 y值可以表示相同的行为,但我们从第二列开始。获得这些索引后,我们在此矩阵中设置xy值,现在我们只需求解系数:

coeff = M \ Z;

coeff现在为2N x 1向量,如果您愿意,可以将其重新整理为矩阵:

coeff = reshape(coeff, 2, []);

现在,coeff将被塑造成每个将为您提供每个等式的a,b对。因此,第一列表示a_1, b_1,第二列表示a_2, b_2,依此类推。 coeff的第一行是每个约束的所有a系数,而第二行是每个约束的所有b系数。