Matlab 最小二乘估计通过 \ 对于 R 中的欠定系统
Matlabs least square estimate via \ for underdetermined system in R
我想找到欠定线性方程组的最小二乘估计值,就像 Matlab 使用“\”所做的那样。
我试图在 R 中重现的内容
% matlab code
X = [3.8642 9.6604;
14.2000 35.5000;
41.7832 104.4580;
0.4084 1.0210];
y = [1.2300
4.5200
13.3000
0.1300];
X\y % => [0, 0.1273]
我尝试了 R 的 lsfit
方法,MASS
包中的广义逆 (ginv
),并使用 QR 组合 (R^{-1}Q'y) ,但所有 returns 个不同的结果。
为了将来参考,正如我在评论中所述,以预期回答者可以轻松使用的格式提供您的示例输入被认为是一种很好的做法(它可以帮助其他人帮助您!)。此处您期望的是 R 解决方案,因此还应以易于在 R 中使用的方式提供示例输入。以下是您可以提供的方式:
x <- matrix(c(3.8642, 14.2, 41.7832, 0.4084, 9.6604, 35.5, 104.458, 1.021),
ncol = 2)
y <- c(1.23, 4.52, 13.3, 0.13)
有了这部分内容,我们可以继续讨论这个问题:如何为最小二乘估计执行与 MATLAB 的 \
等效的操作? The documentation for \
说
x = A\B solves the system of linear equations A*x = B.
您要查找的 R 中的等效项是 solve()
或 qr.solve()
,在本例中为:
?solve
This generic function solves the equation a %*% x = b for x
. . .
qr.solve can handle non-square systems.
所以,我们可以看到
qr.solve(x, y)
# [1] 0.003661243 0.125859408
这非常接近您的 MATLAB 解决方案。同样,lsfit()
或 lm()
(当然)给你相同的答案:
coef(lm(y ~ x + 0))
# x1 x2
# 0.003661243 0.125859408
lsfit(x, y, intercept = FALSE)$coef
# X1 X2
# 0.003661243 0.125859408
我们可以看到这个答案至少与您的 MATLAB 解决方案一样适合数据:
r_solution <- coef(lm(y ~ x + 0))
y - (x %*% r_solution)
[,1]
[1,] -1.110223e-15
[2,] 1.366296e-06
[3,] -4.867456e-07
[4,] 2.292817e-06
matlab_solution <- c(0, 0.1273)
y - (x %*% matlab_solution)
[,1]
[1,] 0.00023108
[2,] 0.00085000
[3,] 0.00249660
[4,] 0.00002670
当我使用ginv()
时,我能够达到与MATLAB/OCTAVE相同的结果:
- 在 R
中使用 ginv()
library(MASS)
X <- matrix(c(3.8642, 14.2, 41.7832, 0.4084, 9.6604, 35.5, 104.458, 1.021),ncol = 2)
y <- matrix(c(1.23,4.52,13.3,0.13),ncol = 1)
> ginv(X)%*%y
[,1]
[1,] 0.003661243
[2,] 0.125859408
- 在 MATLAB/OCTAVE
中使用 pinv()
或 \
X = [3.8642 9.6604;
14.2000 35.5000;
41.7832 104.4580;
0.4084 1.0210];
y = [1.2300
4.5200
13.3000
0.1300];
>> X\y
ans =
0.0036612
0.1258594
>> pinv(X)*y
ans =
0.0036612
0.1258594
我想找到欠定线性方程组的最小二乘估计值,就像 Matlab 使用“\”所做的那样。
我试图在 R 中重现的内容
% matlab code
X = [3.8642 9.6604;
14.2000 35.5000;
41.7832 104.4580;
0.4084 1.0210];
y = [1.2300
4.5200
13.3000
0.1300];
X\y % => [0, 0.1273]
我尝试了 R 的 lsfit
方法,MASS
包中的广义逆 (ginv
),并使用 QR 组合 (R^{-1}Q'y) ,但所有 returns 个不同的结果。
为了将来参考,正如我在评论中所述,以预期回答者可以轻松使用的格式提供您的示例输入被认为是一种很好的做法(它可以帮助其他人帮助您!)。此处您期望的是 R 解决方案,因此还应以易于在 R 中使用的方式提供示例输入。以下是您可以提供的方式:
x <- matrix(c(3.8642, 14.2, 41.7832, 0.4084, 9.6604, 35.5, 104.458, 1.021),
ncol = 2)
y <- c(1.23, 4.52, 13.3, 0.13)
有了这部分内容,我们可以继续讨论这个问题:如何为最小二乘估计执行与 MATLAB 的 \
等效的操作? The documentation for \
说
x = A\B solves the system of linear equations A*x = B.
您要查找的 R 中的等效项是 solve()
或 qr.solve()
,在本例中为:
?solve
This generic function solves the equation a %*% x = b for x
. . .
qr.solve can handle non-square systems.
所以,我们可以看到
qr.solve(x, y)
# [1] 0.003661243 0.125859408
这非常接近您的 MATLAB 解决方案。同样,lsfit()
或 lm()
(当然)给你相同的答案:
coef(lm(y ~ x + 0))
# x1 x2
# 0.003661243 0.125859408
lsfit(x, y, intercept = FALSE)$coef
# X1 X2
# 0.003661243 0.125859408
我们可以看到这个答案至少与您的 MATLAB 解决方案一样适合数据:
r_solution <- coef(lm(y ~ x + 0))
y - (x %*% r_solution)
[,1]
[1,] -1.110223e-15
[2,] 1.366296e-06
[3,] -4.867456e-07
[4,] 2.292817e-06
matlab_solution <- c(0, 0.1273)
y - (x %*% matlab_solution)
[,1]
[1,] 0.00023108
[2,] 0.00085000
[3,] 0.00249660
[4,] 0.00002670
当我使用ginv()
时,我能够达到与MATLAB/OCTAVE相同的结果:
- 在 R 中使用
ginv()
library(MASS)
X <- matrix(c(3.8642, 14.2, 41.7832, 0.4084, 9.6604, 35.5, 104.458, 1.021),ncol = 2)
y <- matrix(c(1.23,4.52,13.3,0.13),ncol = 1)
> ginv(X)%*%y
[,1]
[1,] 0.003661243
[2,] 0.125859408
- 在 MATLAB/OCTAVE 中使用
pinv()
或 \
X = [3.8642 9.6604;
14.2000 35.5000;
41.7832 104.4580;
0.4084 1.0210];
y = [1.2300
4.5200
13.3000
0.1300];
>> X\y
ans =
0.0036612
0.1258594
>> pinv(X)*y
ans =
0.0036612
0.1258594