Per scegliere un numero ottimale di fattori latenti nella fattorizzazione a matrice non negativa, utilizzare la convalida incrociata.
Come hai scritto, lo scopo di NMF è trovare W e H a bassa dimensione con tutti gli elementi non negativi che minimizzino l'errore di ricostruzione ∥V−WH∥2 . Immagina di tralasciare un elemento di V , ad esempio Vab , e di eseguire NMF della matrice risultante con una cella mancante. Ciò significa trovare W e H minimizzando l'errore di ricostruzione su tutte le celle non mancanti:
∑ij≠ab(Vij−[WH]ij)2.
Una volta fatto ciò, possiamo prevedere l'elemento lasciato fuori Vab calcolando [WH]ab e calcolando l'errore di previsione
eab=(Vab−[WH]ab)2.
Si può ripetere questa procedura tralasciando tutti gli elementi
Vab uno alla volta e riassumendo gli errori di predizione su tutti
a e
b . Ciò si tradurrà in un valore PRESS complessivo (somma residua prevista dei quadrati)
E(k)=∑abeab che dipenderà da
k . Eventualmente la funzione
E(k) avrà un minimo che può essere usato come
k 'ottimale'.
Si noti che questo può essere costoso dal punto di vista computazionale, poiché il NMF deve essere ripetuto per ogni valore lasciato fuori e potrebbe anche essere difficile da programmare (a seconda di quanto sia facile eseguire NMF con valori mancanti). In PCA si può aggirare questo tralasciando le file complete di V (che accelera molto i calcoli), vedere la mia risposta in Come eseguire la convalida incrociata per PCA per determinare il numero di componenti principali? , ma questo non è possibile qui.
Naturalmente tutti i soliti principi di convalida incrociata si applicano qui, quindi si possono tralasciare molte celle alla volta (invece di una sola) e / o ripetere la procedura solo per alcune celle casuali invece di eseguire il ciclo su tutte le celle. Entrambi gli approcci possono aiutare ad accelerare il processo.
Modifica (marzo 2019): guarda questo bellissimo scritto illustrato di @AlexWilliams : http://alexhwilliams.info/itsneuronalblog/2018/02/26/crossval . Alex utilizza https://github.com/kimjingu/nonnegfac-python per NMF con valori mancanti.