svd() 和调用 svd、R 和 IML 之间的区别

difference between svd() and call svd, R and IML

我正在将一个包从 R 翻译成 IML,完成后在线免费:)。 我从一个大矩阵的分解中得到了不同的结果,当你看它们时,这两个结果看起来是一样的,但是,例如,如果我取 U 的前 2 列并执行 U'*U,我的 2x2 矩阵将大不相同( U_11 = 1.1e-17 和 U_11 =1.4e-17)。差异非常小 (3e-18),这让我认为这可能与每个软件、SAS IML 和 R 使用的小数位数有关。 有人知道更多关于这个话题的信息吗?我该如何测试呢?谢谢。

在统计学中,我们将非常小的差异描述为 "statistically insignificant." 对于数值分析师来说,小于 "machine epsilon"(R 中的机器$double.eps 或常量("maceps") 在 SAS 中)几乎总是 "numerically insignificant."

SAS 和 R 都使用双精度计算,并且可能正在调用类似的数值库。对于这么小的差异,我推测原因不是算法,而是因为每个软件使用不同的编译器标志和优化标志。

即使在单个产品中,计算两个不同订单的结果也可能导致像这样的微小差异。例如,运行 以下 DATA 步:

data _null_;
x = (1 + 1 + 1 + 1 + 1 + 1 + 1) / 7;
y = (1/7 + 1/7 + 1/7 + 1/7 + 1/7 + 1/7 + 1/7);
diff = x - y;
put diff=;
run;

我的建议是在比较不同软件时忽略 "numerically insignificant" 结果。有关浮点计算的详细信息,请参阅 The Floating Point Guide. For the real nitty gritty, see "What every computer scientist should know about floating-point arithmetic"