OLS 的 Cholesky 分解有多糟糕?

机器算法验证 回归 机器学习 最小二乘
2022-04-16 05:58:04

我听说我不应该对 OLS 使用 Cholesky 分解,因为它非常不稳定,所以我想我会尝试一个非常简单的例子来看看它有多糟糕。

首先让我们在 R 中设置问题:

X <- rbind(c(1, 1), c(1.00001, 1))
kappa(t(X) %*% X)

条件号是160002098109!哦,男孩,系数肯定会减少至少十亿!

y <- rnorm(2)
L <- chol(t(X) %*% X)
z <- solve(t(L), t(X) %*% y)

result <- data.frame(chol = solve(L, z), qr = coefficients(lm.fit(X, y, method = 'qr')))
result

        chol        qr
x1 -148230.9 -148231.0
x2  148231.9  148232.1

……几乎没有区别。发生了什么?如果条件数太大以至于没有方法可以很好地处理它,那么 Cholesky 解实际上明显不如 QR 分解稳定的条件数范围是多少?

1个回答

您所看到的正是人们所期望的。矩阵的条件数X是关于106. 双精度浮点计算给出大约 18 位精度,因此,在双精度下,您最多可以得到186=12来自 QR 的估计系数的有效数字,最多1866=6Cholesky 的重要数字,在考虑到由于条件反射而损失的准确性之后。(Cholesky 损失了两倍的有效数字,因为形成XTX条件数的平方。)因此,两种算法的系数应该在第 6 位有效数字开始有所不同,这正是您所看到的。您的结果表明,x2两种算法之间的相对差异约为

0.2/148232=1.35×106,
它与您开始时的条件编号非常吻合。

条件数X当残差很小时,是一个合理的精度指南。如果我们确保确切的系数是 1 和 1.00001

> y <- X %*% c(1,1.00001)

并重新运行我们得到的计算

> result
                 chol                qr
x1 0.9999833544961814 0.999999999968327
x2 1.0000266455870466 1.000010000031673

确认 QR 实际上对 12 位有效数字是正确的,而 Cholesky 对 6 位有效数字是正确的。

Cholesky 的拟合值通常比估计的系数更精确。如果拟合值对您来说比系数更重要,并且在高度共线的情况下通常如此,那么 Cholesky 通常没问题。当残差非常大时,Cholesky 也与 QR 一样好,但这对于两种算法来说都是最困难的情况。我的博士生导师是澳大利亚最重要的数字分析师(迈克·奥斯本),他过去常说 Cholesky 并没有人们想象的那么糟糕。

在 Golub 和 Van Loan (1996) 的第 5.3.8 节中给出了 Cholesky 与 QR 的完整敏感性分析,并且比我上面使用的简单计算要复杂得多。Cholesky 的灵敏度大致与κ+ρκ2在哪里κ是条件数Xρ是一个在实践中几乎不可能计算的理论量。 ρ取决于残差的大小——它大致与残差的平均平方成正比,但要小得多。QR 的灵敏度比 Cholesky 好一些,但并不总是像我上面建议的那样好。Golub 和 Van Loan 评论:

至少,这个讨论应该让你相信选择“正确”的算法是多么困难!

参考

Golub, GH 和 Van Loan CF (1996)。矩阵计算约翰霍普金斯大学出版社,巴尔的摩。