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

时间:2015-06-29 21:12:55

标签: r sas svd sas-iml

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

1 个答案:

答案 0 :(得分:1)

在统计数据中,我们将非常小的差异描述为“统计上无关紧要”。对于数值分析师来说,差异小于“机器epsilon”(.M中的.Machine $ double.eps或SAS中的常量(“maceps”))几乎总是“在数值上无关紧要”。

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;

我的建议是在比较不同的软件时忽略“数字无关紧要”的结果。有关浮点计算的更多信息,请参阅The Floating Point Guide。有关真正的细节,请参阅"What every computer scientist should know about floating-point arithmetic"