Generates NMF models with random values drawn from a uniform distribution.
It returns an NMF model with basis and mixture coefficient matrices filled
with random values.
The main purpose of the function rnmf
is to provide a common
interface to generate random seeds used by the nmf
function.
rnmf(x, target, ...) S4 (NMF,numeric) `rnmf`(x, target, ncol = NULL, keep.names = TRUE, dist = runif) S4 (ANY,matrix) `rnmf`(x, target, ..., dist = list(max = max(max(target, na.rm = TRUE), 1)), use.dimnames = TRUE) S4 (numeric,missing) `rnmf`(x, target, ..., W, H, dist = runif) S4 (missing,missing) `rnmf`(x, target, ..., W, H) S4 (numeric,numeric) `rnmf`(x, target, ncol = NULL, ..., dist = runif) S4 (formula,ANY) `rnmf`(x, target, ..., dist = runif)
NMF-class
.
See the description of the specific methods for more details on the supported
types.nmfModel
, where they are used to initialise
slots that are specific to the instantiating NMF model.target
is a single numeric value.x
should be conserved (TRUE
) or discarded
(FALSE
).function
which must be a distribution function such as e.g.
runif
that is used to draw the entries of both the basis and
coefficient matrices. It is passed in the dist
argument of
rmatrix
.
list
of arguments that are passed internally to rmatrix
,
via do.call('rmatrix', dist)
.
character
string that is partially matched to basis or
coef, that specifies which matrix in should be drawn randomly, the
other remaining as in x
-- unchanged.
list
with elements basis and/or coef, which
specify the dist
argument separately for the basis and coefficient
matrix respectively.
These elements may be either a distribution function, or a list of arguments that
are passed internally to rmatrix
, via
do.call('rmatrix', dist$basis)
or do.call('rmatrix', dist$coef)
.
data.frame
objects are converted into matrices with as.matrix
.data.frame
objects are converted into matrices with as.matrix
.An NMF model, i.e. an object that inherits from class
NMF-class
.
If necessary, extensions of the standard NMF model or custom models must
define a method "rnmf,callNextMethod
, prior to set the values of the specific slots.
See for example the method rnmf
defined for NMFOffset-class
models:
showMethods(rnmf, class='NMFOffset', include=TRUE))
.
For convenience, shortcut methods for working on data.frame
objects
directly are implemented.
However, note that conversion of a data.frame
into a matrix
object may take some non-negligible time, for large datasets.
If using this method or other NMF-related methods several times, consider
converting your data data.frame
object into a matrix once for good,
when first loaded.
signature(x = "NMFOffset", target = "numeric")
: Generates a random NMF model with offset, from class NMFOffset
.
The offset values are drawn from a uniform distribution between 0 and
the maximum entry of the basis and coefficient matrices, which are drawn
by the next suitable rnmf
method, which is the workhorse
method rnmf,NMF,numeric
.
signature(x = "NMF", target = "numeric")
: Generates a random NMF model of the same class and rank as another NMF model.
This is the workhorse method that is eventually called by all other methods.
It generates an NMF model of the same class and rank as x
, compatible with the
dimensions specified in target
, that can be a single or 2-length
numeric vector, to specify a square or rectangular target matrix respectively.
The second dimension can also be passed via argument ncol
, so that
calling rnmf(x, 20, 10, ...)
is equivalent to rnmf(x, c(20, 10), ...)
,
but easier to write.
The entries are uniformly drawn between 0
and max
(optionally specified in ...
) that defaults to 1.
By default the dimnames of x
are set on the returned NMF model.
This behaviour is disabled with argument keep.names=FALSE
.
See nmfModel
.
signature(x = "ANY", target = "matrix")
: Generates a random NMF model compatible and consistent with a target matrix.
The entries are uniformly drawn between 0
and max(target)
.
It is more or less a shortcut for:
rnmf(x, dim(target), max=max(target), ...)
It returns an NMF model of the same class as x
.
signature(x = "ANY", target = "data.frame")
: Shortcut for rnmf(x, as.matrix(target))
.
signature(x = "NMF", target = "missing")
: Generates a random NMF model of the same dimension as another NMF model.
It is a shortcut for rnmf(x, nrow(x), ncol(x), ...)
, which returns
a random NMF model of the same class and dimensions as x
.
signature(x = "numeric", target = "missing")
: Generates a random NMF model of a given rank, with known basis and/or
coefficient matrices.
This methods allow to easily generate partially random NMF model, where one
or both factors are known.
Although the later case might seems strange, it makes sense for NMF models that
have fit extra data, other than the basis and coefficient matrices, that
are drawn by an rnmf
method defined for their own class, which should
internally call rnmf,NMF,numeric
and let it draw the basis and
coefficient matrices.
(e.g. see NMFOffset-class
and rnmf,NMFOffset,numeric-method
).
Depending on whether arguments W
and/or H
are missing,
this method interprets x
differently:
W
provided, H
missing: x
is taken as the number of
columns that must be drawn to build a random coefficient matrix
(i.e. the number of columns in the target matrix).
W
is missing, H
is provided: x
is taken as the number of
rows that must be drawn to build a random basis matrix
(i.e. the number of rows in the target matrix).
W
and H
are provided: x
is taken as the target
rank of the model to generate.
W
and H
missing produces an error, as the
dimension of the model cannot be determined in this case.
The matrices W
and H
are reduced if necessary and possible
to be consistent with this value of the rank, by the internal call to
nmfModel
.
All arguments in ...
are passed to the function nmfModel
which is used to build an initial NMF model, that is in turn passed to
rnmf,NMF,numeric
with dist=list(coef=dist)
or
dist=list(basis=dist)
when suitable.
The type of NMF model to generate can therefore be specified in argument
model
(see nmfModel
for other possible arguments).
The returned NMF model, has a basis matrix equal to W
(if not missing)
and a coefficient matrix equal to H
(if not missing), or drawn
according to the specification provided in argument dist
(see method rnmf,NMF,numeric
for details on the supported values for dist
).
signature(x = "missing", target = "missing")
: Generates a random NMF model with known basis and coefficient matrices.
This method is a shortcut for calling rnmf,numeric,missing
with a
suitable value for x
(the rank), when both factors are known:
codernmf(min(ncol(W), nrow(H)), ..., W=W, H=H).
Arguments W
and H
are required.
Note that calling this method only makes sense for NMF models that contains
data to fit other than the basis and coefficient matrices,
e.g. NMFOffset-class
.
signature(x = "numeric", target = "numeric")
: Generates a random standard NMF model of given dimensions.
This is a shortcut for rnmf(nmfModel(x, target, ncol, ...)), dist=dist)
.
It generates a standard NMF model compatible with the dimensions passed in
target
, that can be a single or 2-length numeric vector, to specify
a square or rectangular target matrix respectively.
See nmfModel
.
signature(x = "formula", target = "ANY")
: Generate a random formula-based NMF model, using the method
nmfModel,formula,ANY-method
.
#----------
# rnmf,NMFOffset,numeric-method
#----------
# random NMF model with offset
x <- rnmf(2, 3, model='NMFOffset')
x
## <Object of class:NMFOffset>
## features: 3
## basis/rank: 2
## samples: 3
## offset: [ 0.8592685 0.4551622 0.1415146 ]
offset(x)
## [1] 0.8592685 0.4551622 0.1415146
# from a matrix
x <- rnmf(2, rmatrix(5,3, max=10), model='NMFOffset')
offset(x)
## [1] 0.16758674 1.43967155 0.09070254 1.63053459 8.45767822
#----------
# rnmf,NMF,numeric-method
#----------
## random NMF of same class and rank as another model
x <- nmfModel(3, 10, 5)
x
## <Object of class:NMFstd>
## features: 10
## basis/rank: 3
## samples: 5
rnmf(x, 20) # square
## <Object of class:NMFstd>
## features: 20
## basis/rank: 3
## samples: 20
rnmf(x, 20, 13)
## <Object of class:NMFstd>
## features: 20
## basis/rank: 3
## samples: 13
rnmf(x, c(20, 13))
## <Object of class:NMFstd>
## features: 20
## basis/rank: 3
## samples: 13
# using another distribution
rnmf(x, 20, dist=rnorm)
## <Object of class:NMFstd>
## features: 20
## basis/rank: 3
## samples: 20
# other than standard model
y <- rnmf(3, 50, 10, model='NMFns')
y
## <Object of class:NMFns>
## features: 50
## basis/rank: 3
## samples: 10
## theta: 0.5
#----------
# rnmf,ANY,matrix-method
#----------
# random NMF compatible with a target matrix
x <- nmfModel(3, 10, 5)
y <- rmatrix(20, 13)
rnmf(x, y) # rank of x
## <Object of class:NMFstd>
## features: 20
## basis/rank: 3
## samples: 13
rnmf(2, y) # rank 2
## <Object of class:NMFstd>
## features: 20
## basis/rank: 2
## samples: 13
#----------
# rnmf,NMF,missing-method
#----------
## random NMF from another model
a <- nmfModel(3, 100, 20)
b <- rnmf(a)
#----------
# rnmf,numeric,missing-method
#----------
# random NMF model with known basis matrix
x <- rnmf(5, W=matrix(1:18, 6)) # 6 x 5 model with rank=3
basis(x) # fixed
## [,1] [,2] [,3]
## [1,] 1 7 13
## [2,] 2 8 14
## [3,] 3 9 15
## [4,] 4 10 16
## [5,] 5 11 17
## [6,] 6 12 18
coef(x) # random
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.66625268 0.5058676 0.2494622 0.2318956 0.1442813
## [2,] 0.56969379 0.2239450 0.1809491 0.4358441 0.8977739
## [3,] 0.06515073 0.6945659 0.9901529 0.7095178 0.7370808
# random NMF model with known coefficient matrix
x <- rnmf(5, H=matrix(1:18, 3)) # 5 x 6 model with rank=3
basis(x) # random
## [,1] [,2] [,3]
## [1,] 0.92838625 0.73168391 0.1459492
## [2,] 0.30243457 0.74252112 0.4800287
## [3,] 0.58870158 0.46922472 0.4528269
## [4,] 0.90567564 0.32727591 0.4540061
## [5,] 0.01954534 0.05723243 0.7321966
coef(x) # fixed
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 10 13 16
## [2,] 2 5 8 11 14 17
## [3,] 3 6 9 12 15 18
# random model other than standard NMF
x <- rnmf(5, H=matrix(1:18, 3), model='NMFOffset')
basis(x) # random
## [,1] [,2] [,3]
## [1,] 0.33447760 0.30402157 0.17421267
## [2,] 0.95252663 0.08696039 0.21986531
## [3,] 0.29234074 0.86826034 0.33064428
## [4,] 0.24446469 0.26103160 0.83145425
## [5,] 0.08533845 0.14251250 0.07538546
coef(x) # fixed
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 10 13 16
## [2,] 2 5 8 11 14 17
## [3,] 3 6 9 12 15 18
offset(x) # random
## [1] 6.757098 5.271827 1.034839 15.725844 15.843636
#----------
# rnmf,missing,missing-method
#----------
# random model other than standard NMF
x <- rnmf(W=matrix(1:18, 6), H=matrix(21:38, 3), model='NMFOffset')
basis(x) # fixed
## [,1] [,2] [,3]
## [1,] 1 7 13
## [2,] 2 8 14
## [3,] 3 9 15
## [4,] 4 10 16
## [5,] 5 11 17
## [6,] 6 12 18
coef(x) # fixed
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 21 24 27 30 33 36
## [2,] 22 25 28 31 34 37
## [3,] 23 26 29 32 35 38
offset(x) # random
## [1] 1.139168 9.845028 7.353051 31.625840 1.324927 32.648738
#----------
# rnmf,numeric,numeric-method
#----------
## random standard NMF of given dimensions
# generate a random NMF model with rank 3 that fits a 100x20 matrix
rnmf(3, 100, 20)
## <Object of class:NMFstd>
## features: 100
## basis/rank: 3
## samples: 20
# generate a random NMF model with rank 3 that fits a 100x100 matrix
rnmf(3, 100)
## <Object of class:NMFstd>
## features: 100
## basis/rank: 3
## samples: 100
rmatrix
Other NMF-interface: basis
, .basis
, .basis<-
, basis<-
, coef
, .coef
, .coef<-
, coef<-
, coefficients
, .DollarNames,NMF-method
, loadings,NMF-method
, misc
, NMF-class
, $<-,NMF-method
, $,NMF-method
, nmfModel
, nmfModels
, scoef