在协方差矩阵上计算 svd 时的奇怪行为:Microsoft R 和 vanilla R 之间的不同结果

Strange behaviour when computing svd on a covariance matrix: different results between Microsoft R and vanilla R

我在我的 macbook 运行 Microsoft R 3.3.0 上做主成分分析时得到了一些奇怪的结果。与同事仔细核实后,我意识到 SVD 函数的输出与我使用 vanilla R 可能得到的输出不同。

这是可重现的结果,请加载文件 (~78 Mb) here

使用 Microsoft R 3.3.0 (x86_64-apple-darwin14.5.0) 我得到:

>> sv <- svd(Cx)
>> print(sv$d[1:10])

 [1] 122.73664 104.45759  90.52001  87.21890  81.28256  74.33418      73.29427  66.26472  63.51379
[10]  55.20763

而不是在香草 R 上(在两台不同的 linux 机器上使用 R 3.3 和 R 3.3.1):

>> sv <- svd(Cx)
>> print(sv$d[1:10])

 [1] 122.73664  34.67177  18.50610  14.04483   8.35690   6.80784   6.14566
 [8]   3.91788   3.76016   2.66381

所有数据都不会发生这种情况,如果我创建一些随机矩阵并在其上应用 svd,我会得到相同的结果。所以,它看起来像是一种数值不稳定性,不是吗?

更新:我尝试使用 svd 包在同一台机器 (macbook) 上使用相同版本的 R 计算同一矩阵 (Cx) 上的 SVD,最后我得到 "right" 个数字。那么这似乎是由于 Microsoft R Open 使用的 svd 实现。

更新:该行为也发生在 MRO 3.3.1

典型例子构成病态矩阵。有一些最接近零的 SV 使得 SVD 分解数值对 SVD 的不同实现敏感,这可能就是你所看到的

这似乎是一种错误,已确认 in the Github of microsoft-r-open。 他们说这种行为正在调查中,它与 MacOs 中的 Accelerate 库有关。