我想在R中使用交替最小二乘(ALS)执行矩阵分解 . 虽然代码对于小矩阵工作正常,但对于较大的矩阵来说,这是令人难以置信的慢 . 我将不胜感激加快这一进程 . 我使用的是RRopen 8.01,因此它已经使用 MKL 在多个内核上运行 .
我正在使用二进制矩阵作为隐式反馈矩阵 . 此外,我实现了一个加权矩阵 .
## Matrix Factorization with Alternating Least Squares
## R is u * v binary matrix,
## W is u * v weighting matrix
## U is u * k user feature matrix,
## V is v * k item feature matrix
## u is the number of users,
## v is the number of items,
## k is the number of features
## iter is the number of iterations
这是我做的:
# implicit feedback data matrix.
R
W
我设置以下参数:
k
its
为用户和项目创建初始矩阵
# initial users matrix.
U
# initial items matrix.
V
现在我用ALS执行矩阵分解
w.err
for(iter in 1:its) {
# update users
for(i in 1:nrow(R)) {
U[i,]
as.vector(V %*% as.vector(t(W[i,])%*% diag(R[i,])))))
}
# update items
for(j in 1:ncol(R)){
V[,j]
t(U) %*% (diag(R[,j]) %*% W[, j]))
}
R.hat
w.err[iter]
}
R.hat 是所需的结束矩阵 . w.err 只是对迭代错误的控制 . 很适合绘图:)
它的代码工作正常 . 就在我增加 R (和 W )中的行数和列数时,性能显着下降 . 虽然它可以说是 nr=200, nr=500 ,但它已经在8核2.67 Ghz机器上运行了两个小时 nr=2000, nr=5000 (还没有完成) .
我没有使用 NMF 或 NMFN 包,因为负值是可能的,因此它不是非负MF . 有谁知道如何提高性能?也许我只是愚蠢的我的代码是无稽之谈,如果你能指出改进,我会很高兴 .
我寻找类似的问题,但找不到一个 . 也许我只是忽略了它 .