Utilizzo di Scikit-learn (v 0.15.2) per la fattorizzazione della matrice non negativa su una matrice sparsa di grandi dimensioni (meno dell'1% dei valori> 0). Voglio trovare i fattori riducendo al minimo gli errori solo su valori diversi da zero della matrice (ad esempio, non calcolare gli errori per le voci che sono zero) e per favorire la scarsità. Non sono sicuro se qualcosa non va in quello che sto provando. Il pacchetto di scikit-learn NMF e ProjectedGradientNMF hanno funzionato bene per me prima. Ma sembra che quando la dimensione della matrice aumenta, la fattorizzazione è terribilmente lenta.Factorizzazione rapida della matrice non negativa su matrice sparsa grande
Sto parlando di matrici con> 10^10 celle. Per la matrice con ~ 10^7 celle, trovo che il tempo di esecuzione sia buono.
I parametri utilizzati sono i seguenti: nmf_model = NMF(n_components = 100, init='nndsvd', random_state=0, tol = 0.01, sparseness='data')
.
Quando ho provato leggermente diversi parametri (passare a init=random
), ottengo il seguente avviso. Dopo l'avviso, l'esecuzione dello script si interrompe.
/lib/python2.7/site-packages/sklearn/decomposition/nmf.py:252: UserWarning: Iteration limit reached in nls subproblem.
warnings.warn("Iteration limit reached in nls subproblem.")
C'è un modo per rendere più veloce e risolvere il problema precedente? Ho provato a usare la matrice sparsa numpy (column-and row-sparse), ma sorprendentemente - è più lento nel test che ho fatto con una matrice più piccola (~ 10^7 celle).
Considerando che si dovrebbero eseguire più iterazioni di tale fattorizzazione (per scegliere un numero ideale di fattori e la convalida incrociata k-fold), un modo più rapido per risolvere questo problema è altamente auspicabile.
Sono aperto anche a suggerimenti di pacchetti/strumenti che non sono basati su sklearn o Pyhon. Capisco che le domande sulle scelte di pacchetti/strumenti non siano incoraggiate, ma per un caso d'uso specifico, sapendo quali tecniche potrebbero essere utili da altri utenti del settore.
Il metodo NMF di Scipy calcola gli errori solo per le voci non zero della matrice? Le voci zero indicano valori mancanti. Sta usando la regolarizzazione per garantire la scarsità della soluzione? Non ho trovato i dettagli nella documentazione. Forse bisogno di scavare nel codice. Un caso di uso generale, che coinvolge anche la frequenza dei termini, ma anche cose come tag di articoli. Questa matrice è molto scarsa. La tua soluzione sembra ok, ma quando la matrice è enorme, non è ancora scalabile. Diciamo che voglio scoprire elementi che sono stati taggati meno di 2 volte, o tag che appartengono a meno di 5 elementi. Come filtrarli tutti? – vpk
Immagino tu intenda il metodo NMF di scikit e non quello di Scipy? Il modo in cui l'algoritmo gestisce la scarsità può essere impostato dalla "sparsità" del paramentatore. È nella documentazione. Per gli ultimi due casi, non vedo perché dovresti usare NMF per questo. Penserei che ci siano altri strumenti più appropriati per questo. – wonderkid2
Sì, scikit. Di quali altri strumenti stai parlando? – vpk