1

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としましょうnr=2000, nr=5000

NMF負の値が可能であるため、またはパッケージを使用しませんでしNMFNた。したがって、非負の MF ではありません。パフォーマンスを向上させる方法を知っている人はいますか? 多分私は愚かで、私のコードはナンセンスです。改善点を指摘していただければ幸いです。

同様の質問を探しましたが、見つかりませんでした。たぶん私はそれを見落としただけです。

4

0 に答える 0