在协方差矩阵上计算 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 库有关。
我在我的 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 库有关。