==============
Random Numbers
==============
How milk handles random numbers
-------------------------------
Many algorithms (e.g., `kmeans`) require random number initialisation.
In `milk`, all functions that internally use random numbers take an `R`
parameter. If left unspecified (or set to `None`), then it means that the
internal initialisation should be used.
`R` can be specified by an integer, a `random.Random` instance, or a
`numpy.RandomState` instance. If the same `R` is passed twice to the function,
then the results are deterministic.
Functions that use random numbers
---------------------------------
- `kmeans`: for initial cluster choice.
- `repeated_kmeans`: for use in `kmeans` internally.
- `som`: for initial choice of points.
- `nnmf` and `sparse_nnmf`: for initialisation.
``random`` and ``numpy.random``
-------------------------------
There are two randomness mechanisms used internally by `milk`: `random` (the
standard Python package) and `numpy.random`. Setting the seed on just one of
them will not be enough. You need to set *both*. This is in alternative to
using the `R` technique outlined above.