我試圖從331x23152和23152x23152矩陣中獲取點積。R中的慢點積
在Python和Octave中這是一個簡單的操作,但是在R中這似乎非常慢。
N <- 331
M <- 23152
mat_1 = matrix(rnorm(N*M,mean=0,sd=1), N, M)
mat_2 = matrix(rnorm(N*M,mean=0,sd=1), M, M)
tm3 <- system.time({
mat_3 = mat_1%*%mat_2
})
print(tm3)
輸出是
user system elapsed
101.95 0.04 101.99
換句話說,這點積需要超過100秒來執行。
我正在運行64位R-3.4.0,在帶有16 GB RAM的i7-4790上運行RStudio v1.0.143。因此,我不希望這項行動花費這麼長時間。
我可以俯視嗎?我已經開始研究包bigmemory和bigalgebra,但我不禁想到有一個解決方案,而不必訴諸包。
編輯
爲了讓您有時間差的想法,以下是八度的腳本:
n = 331;
m = 23152;
mat_1 = rand(n,m);
mat_2 = rand(m,m);
tic
mat_3 = mat_1*mat_2;
toc
輸出是
Elapsed time is 3.81038 seconds.
而且在Python:
import numpy as np
import time
n = 331
m = 23152
mat_1 = np.random.random((n,m))
mat_2 = np.random.random((m,m))
tm_1 = time.time()
mat_3 = np.dot(mat_1,mat_2)
tm_2 = time.time()
tm_3 = tm_2 - tm_1
print(tm_3)
輸出是
2.781277894973755
正如你所看到的,這些數字都沒有,即使在同一個球場。
EDIT 2
宋哲元在李的要求,這裏是點積玩具的例子。
在R:
mat_1 = matrix(c(1,2,1,2,1,2), nrow = 2, ncol = 3)
mat_2 = matrix(c(1,1,1,2,2,2,3,3,3), nrow = 3, ncol = 3)
mat_3 = mat_1 %*% mat_2
print(mat_3)
的輸出是:
[,1] [,2] [,3]
[1,] 3 6 9
[2,] 6 12 18
在八度:
mat_1 = [1,1,1;2,2,2];
mat_2 = [1,2,3;1,2,3;1,2,3];
mat_3 = mat_1*mat_2
的輸出是:
mat_3 =
3 6 9
6 12 18
在Python:
import numpy as np
mat_1 = np.array([[1,1,1],[2,2,2]])
mat_2 = np.array([[1,2,3],[1,2,3],[1,2,3]])
mat_3 = np.dot(mat_1, mat_2)
print(mat_3)
的輸出是:
[[ 3 6 9]
[ 6 12 18]]
有關矩陣的點產品的更多信息:https://en.wikipedia.org/wiki/Matrix_multiplication
EDIT 3
爲sessionInfo()
的輸出是:
> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=Dutch_Netherlands.1252 LC_CTYPE=Dutch_Netherlands.1252 LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C LC_TIME=Dutch_Netherlands.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.0 tools_3.4.0
EDIT 4
我試過bigalgebra
包,但這似乎並沒有加快速度:
library('bigalgebra')
N <- 331
M <- 23152
mat_1 = matrix(rnorm(N*M,mean=0,sd=1), N, M)
mat_1 <- as.big.matrix(mat_1)
mat_2 = matrix(rnorm(N*M,mean=0,sd=1), M, M)
tm3 <- system.time({
mat_3 = mat_1%*%mat_2
})
print(tm3)
輸出是:
user system elapsed
101.79 0.00 101.81
EDIT 5
詹姆斯建議改變我的隨機產生的矩陣:
N <- 331
M <- 23152
mat_1 = matrix(runif(N*M), N, M)
mat_2 = matrix(runif(M*M), M, M)
tm3 <- system.time({
mat_3 = mat_1%*%mat_2
})
print(tm3)
的輸出是:
user system elapsed
102.46 0.05 103.00
R的矩陣運算速度取決於您的R版本,操作系統以及它是否鏈接了BLAS庫。一種簡單的方法是安裝Microsoft R Open,或者您可以將它連接到[Intel MKL](https ://software.intel.com/en-us/articles/using-intel-mkl-with-r)。 [查看更多](https://simplystatistics.org/2016/01/21/parallel-blas-in-r/)。 –
@李哲源ZheyuanLi:如果你的意思是我想要點產品,那麼是嗎?據我所知,這三種實現都採用兩個矩陣的點積,或者我錯過了什麼? – BdB
8核:R:4至5核,Python:7至8核,八進制:8核。所以確實看起來R使用大約一半的可用處理能力 – BdB