NMF Multiplicative Update for NMF with Offset Models


These update rules proposed by Badea (2008) are modified version of the updates from Lee et al. (2001), that include an offset/intercept vector, which models a common baseline for each feature accross all samples:

V \approx W H + I

nmf_update.offset_R implements a complete single update step, using plain R updates.

nmf_update.offset implements a complete single update step, using C++-optimised updates.

Algorithms ‘offset’ and ‘.R#offset’ provide the complete NMF-with-offset algorithm from Badea (2008), using the C++-optimised and pure R updates nmf_update.offset and nmf_update.offset_R respectively.


nmf_update.euclidean_offset.h(v, w, h, offset, eps = 10^-9, copy = TRUE)

nmf_update.euclidean_offset.w(v, w, h, offset, eps = 10^-9, copy = TRUE)

nmf_update.offset_R(i, v, x, eps = 10^-9, ...)

nmf_update.offset(i, v, x, copy = FALSE, eps = 10^-9, ...)

nmfAlgorithm.offset_R(..., .stop = NULL, maxIter = 2000, eps = 10^-9, stopconv = 40, 
  check.interval = 10)

nmfAlgorithm.offset(..., .stop = NULL, maxIter = 2000, copy = FALSE, eps = 10^-9, 
      stopconv = 40, check.interval = 10)


current value of the offset/intercept vector. It must be of length equal to the number of rows in the target matrix.
target matrix.
small numeric value used to ensure numeric stability, by shifting up entries from zero to this fixed value.
logical that indicates if the update should be made on the original matrix directly (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.
current iteration number.
current NMF model, as an NMF-class object.
extra arguments. These are generally not used and present only to allow other arguments from the main call to be passed to the initialisation and stopping criterion functions (slots onInit and Stop respectively).
specification of a stopping criterion, that is used instead of the one associated to the NMF algorithm. It may be specified as:
  • the access key of a registered stopping criterion;
  • a single integer that specifies the exact number of iterations to perform, which will be honoured unless a lower value is explicitly passed in argument maxIter.
  • a single numeric value that specifies the stationnarity threshold for the objective function, used in with nmf.stop.stationary;
  • a function with signature (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.
maximum number of iterations to perform.
number of iterations intervals over which the connectivity matrix must not change for stationarity to be achieved.
interval (in number of iterations) on which the stopping criterion is computed.
current basis matrix
current coefficient matrix


an NMFOffset-class model object.


nmf_update.euclidean_offset.h and nmf_update.euclidean_offset.w compute the updated NMFOffset model, using the optimized C++ implementations.

The associated model is defined as an NMFOffset-class object. The details of the multiplicative updates can be found in Badea (2008). Note that the updates are the ones defined for a single datasets, not the simultaneous NMF model, which is fit by algorithm ‘siNMF’ from formula-based NMF models.


Badea L (2008). "Extracting gene expression profiles common to colon and pancreatic adenocarcinoma using simultaneous nonnegative matrix factorization." _Pacific Symposium on Biocomputing. Pacific Symposium on Biocomputing_, *290*, pp. 267-78. ISSN 1793-5091, .

Lee DD and Seung H (2001). "Algorithms for non-negative matrix factorization." _Advances in neural information processing systems_. .


Original update definition: Liviu Badea Port to R and optimisation in C++: Renaud Gaujoux