Rescales an NMF model keeping the fitted target matrix identical.
S3 (NMF)
`scale`(x, center = c("basis", "coef"), scale = 1)
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.D
, i.e. the value of alpha
,
or, if center='coef'
, the value of 1/alpha
(see section Details).an NMF object
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 H = (W D) (D^-1 H) withD= alpha * diag(1/delta_1, ..., 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.
# random 3-rank 10x5 NMF model
x <- rnmf(3, 10, 5)
# rescale based on basis
colSums(basis(x))
## [1] 4.821564 4.774258 5.044443
colSums(basis(scale(x)))
## [1] 1 1 1
rx <- scale(x, 'basis', 10)
colSums(basis(rx))
## [1] 10 10 10
rowSums(coef(rx))
## [1] 0.712381 1.167180 1.600620
# rescale based on coef
rowSums(coef(x))
## [1] 1.477490 2.444735 3.173035
rowSums(coef(scale(x, 'coef')))
## [1] 1 1 1
rx <- scale(x, 'coef', 10)
rowSums(coef(rx))
## [1] 10 10 10
colSums(basis(rx))
## [1] 0.712381 1.167180 1.600620
# fitted target matrix is identical but the factors have been rescaled
rx <- scale(x, 'basis')
all.equal(fitted(x), fitted(rx))
## [1] TRUE
all.equal(basis(x), basis(rx))
## [1] "Mean relative difference: 0.7950857"