NMF (version 0.21.0)

scale.NMF: Rescaling NMF Models

Description

Rescales an NMF model keeping the fitted target matrix identical.

Usage

# S3 method for NMF
scale (x, center = c("basis", "coef"),
    scale = 1)

Arguments

x

an NMF object

center

either a numeric normalising vector \(\delta\), or either 'basis' or 'coef', which respectively correspond to using the column sums of the basis matrix or the inverse of the row sums of the coefficient matrix as a normalising vector. If numeric, center should be a single value or a vector of length the rank of the NMF model, i.e. the number of columns in the basis matrix.

scale

scaling coefficient applied to \(D\), i.e. the value of \(\alpha\), or, if center='coef', the value of \(1/\alpha\) (see section Details).

Value

an NMF object

Details

Standard NMF models are identifiable modulo a scaling factor, meaning that the basis components and basis profiles can be rescaled without changing the fitted values:

$$X = W_1 H_1 = (W_1 D) (D^{-1} H_1) = W_2 H_2$$ with \(D= \alpha diag(1/\delta_1, \ldots, 1\delta_r)\)

The default call scale(object) rescales the basis NMF object so that each column of the basis matrix sums up to one.

Examples

Run this code
# NOT RUN {
# random 3-rank 10x5 NMF model
x <- rnmf(3, 10, 5)

# rescale based on basis
colSums(basis(x))
colSums(basis(scale(x)))

rx <- scale(x, 'basis', 10)
colSums(basis(rx))
rowSums(coef(rx))

# rescale based on coef
rowSums(coef(x))
rowSums(coef(scale(x, 'coef')))
rx <- scale(x, 'coef', 10)
rowSums(coef(rx))
colSums(basis(rx))

# fitted target matrix is identical but the factors have been rescaled
rx <- scale(x, 'basis')
all.equal(fitted(x), fitted(rx))
all.equal(basis(x), basis(rx))
# }

Run the code above in your browser using DataLab