The built-in NMF algorithms described here minimise
the Frobenius norm (Euclidean distance) between an NMF model and a target matrix.
They use the updates for the basis and coefficient matrices (W and H)
defined by Lee et al. (2001).
nmf_update.lee implements in C++ an optimised version of the single update step.
Algorithms lee and .R#lee provide the complete NMF algorithm from Lee et al. (2001),
using the C++-optimised and pure R updates nmf_update.lee and nmf_update.lee_R
respectively.
Algorithm Frobenius provides an NMF algorithm based on the C++-optimised version of
the updates from Lee et al. (2001), which uses the stationarity of the objective value
as a stopping criterion nmf.stop.stationary, instead of the
stationarity of the connectivity matrix nmf.stop.connectivity as used by
lee.
nmf_update.lee_R(i, v, x, rescale = TRUE, eps = 10^-9, ...)
nmf_update.lee(i, v, x, rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL,
...)
nmfAlgorithm.lee_R(..., .stop = NULL, maxIter = nmf.getOption("maxIter") %||% 2000,
rescale = TRUE, eps = 10^-9, stopconv = 40, check.interval = 10)
nmfAlgorithm.lee(..., .stop = NULL, maxIter = nmf.getOption("maxIter") %||% 2000,
rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL, stopconv = 40, check.interval = 10)
nmfAlgorithm.Frobenius(..., .stop = NULL, maxIter = nmf.getOption("maxIter") %||%
2000, rescale = TRUE, copy = FALSE, eps = 10^-9, weight = NULL, stationary.th = .Machine$double.eps,
check.interval = 5 * check.niter, check.niter = 10L)
W should be
rescaled so that its columns sum up to one.NMF-class object.onInit and
Stop respectively).FALSE) or on a copy (TRUE - default).
With copy=FALSE the memory footprint is very small, and some speed-up may be
achieved in the case of big matrices.
However, greater care should be taken due the side effect.
We recommend that only experienced users use copy=TRUE.maxIter.
nmf.stop.stationary;
(object="NMFStrategy", i="integer", y="matrix", x="NMF", ...),
where object is the NMFStrategy object that describes the algorithm being run,
i is the current iteration, y is the target matrix and x is the current value of
the NMF model.
v
-- and h.nmf_update.lee_R implements in pure R a single update step, i.e. it updates
both matrices.
Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing
systems_.