Para elegir un número óptimo de factores latentes en la factorización de matrices no negativas, utilice la validación cruzada.
Como usted escribió, el objetivo de NMF es encontrar de baja dimensión \mathbf W y \mathbf H con todos los elementos no negativos minimizando el error de reconstrucción \|\mathbf V-\mathbf W\mathbf H\|^2 . Imaginemos que omitimos un elemento de \mathbf V por ejemplo V_{ab} y realizar el NMF de la matriz resultante con una celda faltante. Esto significa encontrar \mathbf W y \mathbf H minimizando el error de reconstrucción sobre todas las celdas no perdidas: \sum_ {ij\ne ab} (V_{ij}-[\mathbf W\mathbf H]_{ij})^2.
Una vez hecho esto, podemos predecir el elemento que queda fuera V_{ab} por ordenador [\mathbf W\mathbf H]_{ab} y calcular el error de predicción e_{ab}=(V_{ab}-[\mathbf W\mathbf H]_{ab})^2. Se puede repetir este procedimiento omitiendo todos los elementos V_{ab} de uno en uno, y sumar los errores de predicción de todos los a y b . Esto dará como resultado un valor global PRESS (suma de cuadrados residuales previstos) E(k)=\sum_{ab}e_{ab} que dependerá de k . Esperemos que la función E(k) tendrá un mínimo que podrá utilizarse como "óptimo". k .
Tenga en cuenta que esto puede ser costoso computacionalmente, porque el NMF tiene que repetirse para cada valor omitido, y también puede ser difícil de programar (dependiendo de lo fácil que sea realizar el NMF con valores omitidos). En PCA se puede evitar esto omitiendo filas completas de \mathbf V (que acelera mucho los cálculos), véase mi respuesta en ¿Cómo realizar la validación cruzada del ACP para determinar el número de componentes principales? pero aquí no es posible.
Por supuesto, aquí se aplican todos los principios habituales de la validación cruzada, por lo que se pueden omitir muchas celdas a la vez (en lugar de sólo una), y/o repetir el procedimiento sólo para algunas celdas aleatorias en lugar de hacer un bucle sobre todas las celdas. Ambos enfoques pueden ayudar a acelerar el proceso.
Editar (Mar 2019): Véase este magnífico artículo ilustrado de @AlexWilliams : http://alexhwilliams.info/itsneuronalblog/2018/02/26/crossval . Alex utiliza https://github.com/kimjingu/nonnegfac-python para NMF con valores perdidos.