nnmf_mm {NMFN} | R Documentation |
Non-negative Matrix Factorization - multiplicative update method
nnmf_mm(x, k, maxiter, eps)
x |
original input matrix |
k |
number of factors / components |
maxiter |
max number of iterations |
eps |
small threshold value |
W, H - returned decomposed matrices
Suhai (Timothy) Liu
Lee and Sung 2001
## The function is currently defined as function (x, k, maxiter, eps) { print_iter <- 50 x <- as.matrix(x) if (any(!is.finite(x))) stop("infinite or missing values in 'x'") dx <- dim(x) n <- dx[1L] m <- dx[2L] if (!n || !m) stop("0 extent dimensions") W <- matrix(abs(rnorm(n * k)), n, k) H <- matrix(abs(rnorm(k * m)), k, m) Xr_old = W %*% H for (iter in 1:maxiter) { H = H * (t(W) %*% x)/((t(W) %*% W) %*% H + eps) W = W * t(H %*% t(x))/(W %*% (H %*% t(H)) + eps) if (iter%%print_iter == 0) { Xr = W %*% H diff = sum(abs(Xr_old - Xr)) Xr_old = Xr eucl_dist = distance2(x, W %*% H) errorx = mean(abs(x - W %*% H))/mean(x) cat("Iter = ", iter, "\t") cat("relative error = ", errorx, "\t") cat("diff = ", diff, "\t") cat("eucl dist = ", eucl_dist, "\n") if (errorx < 1e-05) { cat("Execution finishes at iteration = ", iter, "\n") break } } } z <- c(list(W = W, H = H)) z }