为什么不使用“正规方程”来找到简单的最小二乘系数呢?


17

我在这里看到了这个列表,简直不敢相信有这么多方法可以求解最小二乘。对“正规方程” 维基百科似乎是一个相当简单的方法

α^=y¯β^x¯,β^=i=1ñ(X一世-X¯ÿ一世-ÿ¯一世=1个ñX一世-X¯2

那么为什么不仅仅使用它们呢?考虑到Mark L.上面的第一个链接,我认为一定存在计算或精度问题。Stone提到SVD或QR是统计软件中流行的方法,并且正常方程式“从可靠性和数值精度的角度来看很麻烦”。但是,在下面的代码中,与三个流行的python函数相比,正则方程使我的精度达到了〜12个小数位:numpy的polyfit;西皮的罪过 ; 和scikit-learn的LinearRegression

更有意思的是,当n = 100000000时,法线方程法最快。polyfit为12.9s;用于线性回归的4.2s;对于标准方程式为1.8秒。

码:

import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import linregress
import timeit

b0 = 0
b1 = 1
n = 100000000
x = np.linspace(-5, 5, n)
np.random.seed(42)
e = np.random.randn(n)
y = b0 + b1*x + e

# scipy                                                                                                                                     
start = timeit.default_timer()
print(str.format('{0:.30f}', linregress(x, y)[0]))
stop = timeit.default_timer()
print(stop - start)

# numpy                                                                                                                                      
start = timeit.default_timer()
print(str.format('{0:.30f}', np.polyfit(x, y, 1)[0]))
stop = timeit.default_timer()
print(stop - start)

# sklearn                                                                                                                                    
clf = LinearRegression()
start = timeit.default_timer()
clf.fit(x.reshape(-1, 1), y.reshape(-1, 1))
stop = timeit.default_timer()
print(str.format('{0:.30f}', clf.coef_[0, 0]))
print(stop - start)

# normal equation                                                                                                                            
start = timeit.default_timer()
slope = np.sum((x-x.mean())*(y-y.mean()))/np.sum((x-x.mean())**2)
stop = timeit.default_timer()
print(str.format('{0:.30f}', slope))
print(stop - start) 

答案相当夸张。如果您只是避免显式计算逆,那并不是那么可怕。
mathreadler '18

3
关于速度的一些注意事项:您仅查看一个协变量,因此矩阵求逆的成本本质上为0。如果查看几千个协变量,那将会改变。其次,由于您只有一个协变量,因此在打包竞争者中实际上需要花费大量时间进行数据处理(但这应该只是线性扩展,因此没什么大不了的)。普通方程式解决方案不进行数据处理,因此速度更快,但是结果没有任何麻烦。
悬崖AB

Answers:


22

一种Xb一种一种Ť一种ØG10CØñd一种Ť一种一种Ť一种X=一种ŤbØG10CØñd一种Ť一种=2ØG10CØñd一种

1081016

有时您会摆脱法线方程,而有时却没有。


2
一种简单的查看方式(如果您不知道/不关心条件号)是(基本上)将某物自身相乘(“平方”),这意味着您可能会损失大约一半的精确。(如果A是标量,这应该更加明显,并且应该很容易看到使A为矩阵并不会真正改变潜在的问题。)
user541686

除了精度上的差异外,QR和法线方程之间还有很大的速度差异吗?因为在后一种情况下,您可能正在求解(X'X)-1 * X'Y,由于求逆,这很慢?我问是因为我不确定QR的工作原理,所以也许那里有些东西和矩阵反转一样慢。还是仅考虑精度损失?
西蒙

4
@Simon好吧,当您求解法线方程时,您实际上从不会形成逆矩阵,这太慢了。您必须形成矩阵一种Ť一种 和向量 一种Ťb但是,然后您解决了系统问题。
蚂蚁

8

如果您只需要解决这一变量问题,请继续使用公式。没有错。例如,我可以看到您在ASM中为嵌入式设备编写了几行代码。实际上,我在某些情况下使用了这种解决方案。当然,您不必为了解决这一小问题而拖动大型统计库。

数值不稳定性和性能是较大问题和一般设置的问题。如果您求解多元最小二乘等问题,那么对于一般问题,您当然不会使用。


0

现代统计软件包都无法解决使用正态方程的线性回归问题。正规方程仅存在于统计书中。

不应使用法线方程,因为计算矩阵逆是非常有问题的。

当有封闭形式的数学解可用时,为什么要使用梯度下降进行线性回归?

...尽管可以使用直接正态方程。注意,在正规方程中,必须将矩阵求逆。现在,将矩阵求逆需要O(N3)进行计算,其中N是X矩阵中的行数,即观测值。而且,如果X病态,那么它将在估计中产生计算错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.