接受/拒绝奇异值的标准应该是什么?

计算科学 线性代数 回归 svd
2021-12-22 09:14:33

我正在使用奇异值分解解决一个系统。奇异值(缩放前)是:

1.82277e+29
1.95011e+27
1.15033e+23
1.45291e+21
4.79336e+17
7.48116e+15
8.31087e+12
1.71838e+11
5.63232e+08
2.17863e+08
9.02783e+07
1.72345e+07
1.73889e+05
8.09382e+02
2.16644e+00

我发现接受所有奇异值及其对我的解向量的相关贡献会产生较差的结果。我将它们全部按最大数缩放,产生以下奇异值:

1.0
1.06986e-02
6.31091e-07
7.97089e-09
2.62971e-12
4.10428e-14
4.55948e-17
9.42732e-19
3.08998e-21
1.19523e-21
4.95281e-22
9.45510e-23
9.53980e-25
4.44040e-27
1.18854e-29

如果我包括最后两个,最好的解决方案只会开始变坏,并且只有在项左右才会变好。1019

当我包含最后两个术语时,准确性急剧下降。这是为什么?包含/不包含奇异值的标准是什么?

我的矩阵方程来自线性最小二乘拟合,其中我使用多项式基组来拟合我创建的一些嘈杂数据。通过将每一边( A\cdot X = B )乘以A)和对此执行 SVD。m×nmnAX=BAAAX=AX

我通过它与我的嘈杂数据的近似程度来判断我的解决方案的答案。

我还注意到,即使在“良好”拟合的情况下,我也不能很好地拟合接近零(我的数据范围从)。这是为什么?1010

3个回答

形成伪逆的标准容差是仅反转至少为max(m,n)ϵA2,其中是机器精度,的最大奇异值一致。Am×nϵA2A

更加稳定AHA

首先,我们需要计算奇异值分解 然后,我们可以通过 其中

[U,Σ,V]=svd(A)
A=Vf(Σ)UH,
f(σ)={1/σ,σmax(m,n)ϵA2,0,otherwise

然后可以将解计算为

X=AB.

啊!!不,,一千次,

人们使用 SVD 的原因正是为了避免形成叉积矩阵,因为这个矩阵的形成是形成病态线性系统的好方法!分解旨在直接应用于(另请参阅我以前的一些答案。)AAA

我之前向您提到过,将奇异值归零的通常标准是将它们与最大奇异值和机器 epsilon 的乘积进行比较。但是,这会因您形成叉积矩阵而变得毫无意义。请尝试再次运行分解,但这次是在设计矩阵本身而不是叉积矩阵上。任何其他方式都是公然滥用分解。

我认为这里有几个人为您的问题提供了有价值的提示。

但是,为了将来参考,您可以通过查看有关此问题的大量文献来回答您关于如何解决病态线性最小二乘问题的问题。

具体来说,您可以使用 TSVD(截断奇异值分解)作为获得解决方案的简单方法: 其中是第 i 个奇异值,是矩阵中的第 i 个列来自分解是你的问题的右手边,符号表示条目的复共轭,然后转向一行向量,使得

xk=i=1kuiHbσivi
σiuiviUVUSVH=AbuHuHb产生一个标量(点积)。因此,您的解决方案是向量xk

这个设置的主要问题,除了被迫计算非常昂贵的 SVD 之外,是如何选择要使用的奇异值的数量,即同样,有很多方法可以做到这一点,但最流行的方法是差异原则、广义交叉验证方法和 L 曲线。k

所有这些(以及更多)都在 Matlab 中由 Per Christian Hansen 教授编写的优秀工具箱Regularization Tools中实现,他还发表了几篇关于逆问题的论文和几本书籍。该工具箱易于使用,并且应该很容易翻译成其他编程语言。

总之,虽然其他人对您的应用程序提供了重要的见解,表明其他方法更合适,但以上是关于在您仍然需要时如何解决问题的快速总结。