我想在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 <- matrix(nr=2, nc=5, data=rbinom(2*5,1, prob=.2))
W <- matrix(nr=2, nc=5, data=rbinom(2*5,7, prob=.2))
我设置了以下参数:
k <- 20
its <- 10
为用户和项目创建初始矩阵
# initial users matrix.
U <- matrix(nr= nrow(R), nc=k, data=5 *rnorm(nrow(R)*k))
# initial items matrix.
V <- matrix(nr=k, nc=ncol(R), data=5* rnorm(ncol(R)*k))
现在我用ALS执行矩阵分解
w.err <- NULL
for(iter in 1:its) {
# update users
for(i in 1:nrow(R)) {
U[i,] <- t(solve(V %*% (diag(R[i,])%*% t(V)) + 0.1 * diag(k),
as.vector(V %*% as.vector(t(W[i,])%*% diag(R[i,])))))
}
# update items
for(j in 1:ncol(R)){
V[,j] <- solve(t(U) %*% (diag(R[,j]) %*% U) + 0.1 * diag(k),
t(U) %*% (diag(R[,j]) %*% W[, j]))
}
R.hat <- U %*% V
w.err[iter] <- sum((R* (W-U%*%V))^2)
}
R.hat
是所需的结束矩阵。
w.err
只是对迭代错误的控制。很适合绘图:)
代码正常工作。就在我增加R
(和W
)中的行数和列数时,性能会显着下降。虽然我们可以说nr=200, nr=500
,但在8核2.67 Ghz机器上已经运行了两个小时nr=2000, nr=5000
(还没有完成)。
我没有使用NMF
或NMFN
包,因为负值是可能的,因此它不是非负MF。
有谁知道如何提高性能?也许我只是愚蠢,我的代码是胡说八道,如果你能指出改进,我会很高兴。
我找了类似的问题,但找不到。也许我只是忽略了它。