计算最小二乘法时矩阵维数的问题
The problem with the dimensions of a matrix when computing the least squares method
我之前在这方面的主题。
我决定不更改主要问题,而是为每个问题创建一个新问题。
这一次,问题是follows.I在多项式回归中使用了最小二乘法。
对该函数关于参数b的向量求微分并使导数为零,我们得到方程组(矩阵形式)。这个公式。
也就是说,如果我想从这里表达b,我需要做我所做的。
b=X^{T}y/(X^{T}X)=> b=X'*y1/(X'*X)
代码:
#Generating random values of experimental data
x=0:0.1:5;
y=3*x+2;
y1=y+randn(size(y));
k=5;#Polynomial degree
X=[x' ones(length(x),1)];
b=X'*y1/(X'*X); Error: operator *: nonconformant arguments (op1 is 2x51, op2 is 1x51)\
是的,数组 X
和 y1
的维度不重合。随附的屏幕截图将显示 everything.In 此屏幕截图变量 X、y1 和 X'(转置)。
然后我决定 select 数组 X
中的 1 列并将其乘以 y1
。
如果您查看屏幕截图,您会发现现在转置的 X'
与 y1
尺寸相匹配。也就是应该没有错误,但是还是存在
你数学错了。做矩阵运算的时候不能随随便便地划分。
最小二乘解是
b=(X'*X)^-1 * X' * y
还有你对y
的定义是错误的,或者你的尺码不合适。
x=0:0.1:5;
y=(3*x+2)'; %transpose!
y1=y+randn(size(y));
X=[x' ones(length(x),1)];
矩阵的逆是你永远不应该用数字表示的东西。幸运的是,有一种叫做 Moore-Penrose pseudoinverse 的东西,它确保在使用时,您将得到原始问题的最小二乘解。所以让我们使用它。
b=pinv(X'*X)*X'*y;
b_with_noise=pinv(X'*X)*X'*y1;
注意下面基本都是零到数值精度,说明是正确的
sum(X*b-y)
ans =
-5.8176e-14
现在,在 MATLAB/octave 中,您可以更轻松地做到这一点:
b=X\y;
b_with_noise=X\y1;
MATLAB 将找到计算最小二乘解的最佳算法。 mldivide
有更多信息(八度文档有点缺乏,但应该以同样的方式工作)。
我之前在这方面的主题。
我决定不更改主要问题,而是为每个问题创建一个新问题。
这一次,问题是follows.I在多项式回归中使用了最小二乘法。
对该函数关于参数b的向量求微分并使导数为零,我们得到方程组(矩阵形式)。这个公式。
也就是说,如果我想从这里表达b,我需要做我所做的。
b=X^{T}y/(X^{T}X)=> b=X'*y1/(X'*X)
代码:
#Generating random values of experimental data
x=0:0.1:5;
y=3*x+2;
y1=y+randn(size(y));
k=5;#Polynomial degree
X=[x' ones(length(x),1)];
b=X'*y1/(X'*X); Error: operator *: nonconformant arguments (op1 is 2x51, op2 is 1x51)\
是的,数组 X
和 y1
的维度不重合。随附的屏幕截图将显示 everything.In 此屏幕截图变量 X、y1 和 X'(转置)。
然后我决定 select 数组 X
中的 1 列并将其乘以 y1
。
如果您查看屏幕截图,您会发现现在转置的 X'
与 y1
尺寸相匹配。也就是应该没有错误,但是还是存在
你数学错了。做矩阵运算的时候不能随随便便地划分。
最小二乘解是
b=(X'*X)^-1 * X' * y
还有你对y
的定义是错误的,或者你的尺码不合适。
x=0:0.1:5;
y=(3*x+2)'; %transpose!
y1=y+randn(size(y));
X=[x' ones(length(x),1)];
矩阵的逆是你永远不应该用数字表示的东西。幸运的是,有一种叫做 Moore-Penrose pseudoinverse 的东西,它确保在使用时,您将得到原始问题的最小二乘解。所以让我们使用它。
b=pinv(X'*X)*X'*y;
b_with_noise=pinv(X'*X)*X'*y1;
注意下面基本都是零到数值精度,说明是正确的
sum(X*b-y)
ans =
-5.8176e-14
现在,在 MATLAB/octave 中,您可以更轻松地做到这一点:
b=X\y;
b_with_noise=X\y1;
MATLAB 将找到计算最小二乘解的最佳算法。 mldivide
有更多信息(八度文档有点缺乏,但应该以同样的方式工作)。