我提前为我的问题的相当抽象的性质道歉,但它间接是一个关于编程算法的问题,我不认为我会成为唯一一个对此感到疑惑的程序员。
这是关于Octave中多变量普通最小二乘(OLS)回归算法的实现(并且,我假设,也在MatLab中)。据我所知,如果只用一次测量将两个变量输入到线性回归中,结果(即系数)应该在数学上不确定:除非你接受黑魔法作为一个有效的前提,怎么可能告诉我每个变量对最终结果的影响方式是什么?在更一般的情况下,测量的数量必须(我认为)至少等于结果系数的变量数量才有意义(更不用说统计错误和所有这些)。
然而,Octave非常乐意计算结果,没有任何警告:octave:1> ols([1], [1, 1])
ans =
0.50000
0.50000
换句话说 - 如果我做对了 - 给定等式1 = x + y,Octave快乐地断定x = y = 0.5。
因此,假设(像我一样)Octave与撒旦没有直接联系,这是我的问题:
答案 0 :(得分:1)
看看这个Octave文档:
http://www.gnu.org/software/octave/doc/interpreter/Linear-Least-Squares.html
在输出beta的描述中,它表示当矩阵不是满秩时,该值将是x乘y的伪逆(正如矩阵[1,1]的情况一样。[0.5; 0.5]是[1,1]的伪逆。
希望有所帮助!
答案 1 :(得分:1)
您的系统根本不是满级。根据{{3}} ols
解决了
b = pinv(x)*y
或者,在您的情况下,只需
b = pinv([1 1])
ans =
0.5000
0.5000
答案 2 :(得分:0)
Ordinary least square回归表示为:
Ax = y
通常使用pseudo-inverse:
直接解决x = inv(A'*A)*A'*y
或
x = pinv(A) * y
在满秩矩阵的情况下,我们可以执行Cholesky decomposition:R = chol(A'*A)
以便(A'*A) = R'R
。这可以用作:
Ax = y
A'Ax = A'y
R'Rx = A'y
Rx = R'\(A'y)
x = R\(R'\(A'y))
请注意,在最后一步中,反斜杠运算符(mldivide
)使用三角矩阵R
执行简单的前后向替换
事实上,Octave是如何实现它的:http://hg.octave.org/octave/file/tip/scripts/statistics/base/ols.m#l110
还有其他方法可以解决系统,例如迭代方法。