要使SVD稳定添加多少正则化?


10

我一直在使用英特尔MKL的SVD(dgesvd通过SciPy的),并注意到,当我改变之间的精确结果是显著不同float32float64当我的基质被严重空调/没有满秩。我应该添加一些关于最小化正则化的指南,以使结果对float32-> float64变化不敏感吗?

特别是 A=UDVT, 我看到 L 规范 VTX当我在float32和之间更改精度时,会移动约1 float64L2 规范 A105 在784个总数中,约有200个零特征值。

在做SVD λI+Aλ=103 使差异消失了。


大小是多少 NN×N 矩阵 A对于那个例子(甚至是方矩阵)?200个零特征值或奇异值?Frobenius规范||A||F一个有代表性的例子也将有所帮助。
安东门少夫

在这种情况下,使用784 x 784矩阵,但我对寻找lambda的高价值的通用技术更感兴趣
Yaroslav Bulatov

所以,区别是 V仅在对应于零奇异值的最后一列中?
尼克·阿尔杰

2
如果存在多个相等的奇异值,则svd不是唯一的。在您的示例中,我猜想问题出在多个零奇异值上,而不同的精度导致相应奇异空间的基数选择不同。我不知道为什么当您进行正则化时,情况会发生变化……
德克(Dirk)

1
...什么是 X
费德里科·波洛尼

Answers:


1

尽管这个问题有很好的答案,但是对于小奇异值(带有图解),这是一条经验法则。

如果奇异值非零但非常小,则应将其倒数定义为零,因为其表观值可能是舍入误差的产物,而不是有意义的数字。一个合理的答案是“小有多小?” 是以这种方式编辑所有与最大比率小于的奇异值N 乘以机器精度 ϵ

数字食谱p。795

补充:以下几行计算了此经验法则。

#!/usr/bin/env python2

from __future__ import division
import numpy as np
from scipy.sparse.linalg import svds  # sparse, dense or LinOp

#...............................................................................
def howsmall( A, singmax=None ):
    """ singular values < N float_eps sing_max  may be iffy, questionable
        "How small is small ?"
        [Numerical Recipes p. 795](http://apps.nrbook.com/empanel/index.html?pg=795)
    """
        # print "%d singular values are small, iffy" % (sing < howsmall(A)).sum()
        # small |eigenvalues| too ?
    if singmax is None:
        singmax = svds( A, 1, return_singular_vectors=False )[0]  # v0=random

    return max( A.shape ) * np.finfo( A.dtype ).eps * singmax


希尔伯特矩阵似乎被广泛用作舍入误差的测试用例:

在此处输入图片说明

在这里,希尔伯特矩阵的尾数中的低位被置零 A.astype(np.float__).astype(np.float64),然后np.linalg.svd在中运行float64。(svd所有结果float32大致相同。)

简单地将其截断float32甚至可能对去噪高维数据(例如,训练/测试分类)有用。

真正的测试用例将是受欢迎的。


顺便说一句,scipy似乎为float32添加了1e3的因数,为float64添加了1e6的因数,很好奇它们来自何处
Yaroslav Bulatov

@Yaroslav Bulatov,numpyscipy.linalg.svd调用LAPACK gesdd,看参数JOBRdgejsv“指定范围的奇异值问题的许可设置为零很小的正奇异值,如果他们在外面......”(scipy.sparse.linalg.svds包ARPACK并有一个参数tol,公差表示奇异值。)
denis

13

对称矩阵的奇异值分解 A=AT 是一个且与其规范本征分解相同(即具有正交特征向量矩阵),而对于非对称矩阵则是相同的 M=UΣVT 只是对称矩阵的规范特征值分解

H=[0MMT0]=[U00V][0ΣΣ0][U00V]T
因此,在不失一般性的前提下,让我们考虑一个密切相关的问题:如果两个对称矩阵近似相同,那么我们是否应该期望它们的标准特征分解也近似相同?

答案是令人惊讶的。让ϵ>0 很小,并考虑两个矩阵

Aϵ=[1ϵϵ1]=VΛϵVT,Bϵ=[1+ϵ001ϵ]=UΛϵUT
两者都有特征值 Λϵ=diag(1+ϵ,1ϵ),但其特征向量为
V=12[1111],U=[1001].
而矩阵 AϵBϵ 大约相同,它们的特征矩阵 VU有很大的不同。实际上,由于本征分解对于ϵ>0,真的没有选择 U,V 这样 UV

现在,将这种见解以有限的精度应用于SVD,让我们写 M0=U0Σ0V0T作为您的float64 精度矩阵,并且Mϵ=UϵΣϵVϵT 与相同矩阵的float32精度相同。如果我们假设SVD本身是精确的,则奇异值Σ0,Σϵ 必须相差不超过一个小的常数因子 ϵ107,但奇异向量 U0,UϵV0,Vϵ 可以相差很大。因此,如图所示,在奇异矢量的意义上,没有办法使SVD“稳定”。



1
这是一个很好的参考。我不知道,很多年前我在数学课上学到了这个例子:-)
理查德·张
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.