有人能解释Revol R中LU分解的异常行为吗?
一个简单的矩阵基准测试表明,Revolution Analytics有人能解释Revol R中LU分解的异常行为吗?,r,matrix,decomposition,R,Matrix,Decomposition,一个简单的矩阵基准测试表明,Revolution AnalyticsR2.13.2 LU分解比矩阵乘法慢近5倍。 理论和多年的实践表明,对于A*A,LU应该是时间的1/3到2/3 Revo R和Matlab使用Intel的数学内核进行此测试。 R2.14.1未使用内核。所有内容都是64位的 异常情况见下表2。这是关于A*A的表1。还有其他(明显的)异常,但LU是最明显的异常 Table 1 (secs) A
R2.13.2
LU分解比矩阵乘法慢近5倍。
理论和多年的实践表明,对于A*A
,LU应该是时间的1/3到2/3
Revo R和Matlab使用Intel的数学内核进行此测试。
R2.14.1
未使用内核。所有内容都是64位的
异常情况见下表2。这是关于A*A
的表1。还有其他(明显的)异常,但LU是最明显的异常
Table 1 (secs)
A*A LU A\b Det Inv
----------------------------------------------------
R 2.14.1 0.757 0.43 0.45 0.20 1.11
Revo R 2.13.2 0.063 0.35 0.11 0.03 0.14
Matlab 2011b 0.062 0.08 0.10 0.07 0.16
----------------------------------------------------
Averaged over 20 runs on a 1000x1000 random matrix
Table 2 (normalized)
A*A LU A\b Det Inv
----------------------------------------------------
R 2.14.1 1 0.57 0.19 0.26 1.47
Revol R 2.13.2 1 4.67* 1.58 1.33 2.17
Matlab 2011b 1 0.67 1.72 0.61 1.68
----------------------------------------------------
Note: x = A\b in Matlab is x <- solve(A,b) in R.
以秒为单位的时间
Dell Precision 690, 2 x Intel® Xeon® E53405 CPU @ 2.33GHz,
16GB ram, 2 Processors, 8 Cores and 8 Threads,
Windows 7 Prof., 64-bit
包含表格和所用代码的正在进行的工作报告
更新2: 我修改了矩阵基准测试,只测试矩阵分解。这些是所有其他矩阵算法的基础,如果这些算法不稳定,那么所有其他算法也将不稳定 我换了一个全新的
Lenovo ThinkPad X220, Intel Core i7-2640M CPU @ 2.80GHz,
8GB ram, 1 Processor, 2 Cores and 4 Threads
Windows 7 Professional, 64-bit.
注意:Core i7
处理器采用Intel的Turbo Boost,如果感觉到高需求,可将时钟频率提高至3.5GHz。据我所知,三个系统中的任何一个都不受涡轮增压程序(mer)控制
我希望这些变化将使结果更加有用
Table 3. Times(secs)
A*A chol(A) lu(A) qr(A) svd(A) eig(A) Total
-----------------------------------------------------------------------------
R 2.14.1 0.904 0.157 0.260 0.568 4.260 6.967 13.11
Revol R 2.13.2 0.121 0.029 0.062 0.411 1.623 3.265 5.51
Matlab 2011b 0.061 0.014 0.033 0.056 0.342 0.963 1.47
-----------------------------------------------------------------------------
Times(secs) averaged over 20 runs
Table 4. Times(normalized)
A*A chol(A) lu(A) qr(A) svd(A) eig(A) Total
----------------------------------------------------------------------------
R 2.14.1 1.000 0.174 0.288 0.628 4.714 7.711 14.52
Revol R 2.13.2 1.000 0.237 0.515 3.411 13.469 27.095 45.73
Matlab 2011b 1.000 0.260 0.610 0.967 5.768 16.774 25.38
----------------------------------------------------------------------------
Times(secs) averaged over 20 runs
我们可以从表4中看到,虚假异常已经消失,所有系统都按照理论预测的那样运行
Table 5. Times/Matlab Times
A*A chol(A) lu(A) qr(A) svd(A) eig(A) Total
----------------------------------------------------------------------------
R 2.14.1 15 11 8 10 12 7 9
Revol R 2.13.2 2 2 2 7 5 3 4
----------------------------------------------------------------------------
Rounded to the nearest integer
FWIW您不是在测量分解的时间,而是通过始终转换矩阵而产生的开销。在常规R中:
# actual lu call
> system.time(lu(A))
user system elapsed
0.136 0.000 0.139
# your code
> system.time(expand(lu(Matrix(A))))
user system elapsed
0.536 0.000 0.537
因此,很可能是您自己造成了开销。当分解很快时,这一点尤其重要。还请注意,考虑“R”的性能是不明确的,因为R本身的性能因您使用的BLAS而异
(作为旁注-您可能希望在基准测试中使用
system.time
,您也可能对microbenchmark
R软件包感兴趣)!扩展(…)正在增加开销。我将更新上面的表。另外,感谢您的“微基准”提示。FWIW主要的开销在矩阵中
,开销在扩展中
小得多
# actual lu call
> system.time(lu(A))
user system elapsed
0.136 0.000 0.139
# your code
> system.time(expand(lu(Matrix(A))))
user system elapsed
0.536 0.000 0.537