对于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
是我的X
和Y
点的矩阵。但是,我似乎只得到所有点的一对回归系数。
提前谢谢!
答案 0 :(得分:0)
如果我了解您的问题表达方式,那么您所设置的内容很可能不是解决问题的正确方法。该假设假设您尝试将所有点放在一行。因此,B
的每一行仅作为一个行上的一个点,您试图找到线性回归。如果你想同时解决多条线,你需要改变你的配方。
这实际上非常简单。我将假设您有30 (x,y)
个点,其中每个点表示一条线的等式。您将这些设置为Xs
和Ys
。这些方程中的每一个的输出也在Zs
中。我还假设这些是列向量,因此,您有一个系统设置:
a_i
和b_i
是每行的系数。您知道每行的(x,y)
,您的目标是为每个对应的a
和b
求解。因此,您需要重新构建系统,以便解决a
和b
。
以矩阵形式重写该问题,可以这样做:
a_1, b_1, a_2, b_2, ...
的右侧向量是您最终要解决的问题。你可以看到我们有一个Y = M*X
的矩阵方程,其中M
和Y
是已知的,X
是我们需要通过X = M\Y
来解决的问题。因此,您需要将x
和y
值重新排列为如上所述的块矩阵。首先,我们需要找到正确的线性索引,以便我们可以将x
和y
值放入此矩阵中,然后使用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
值可以表示相同的行为,但我们从第二列开始。获得这些索引后,我们在此矩阵中设置x
和y
值,现在我们只需求解系数:
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
系数。