2015-08-19 4 views
7

Ho due serie di dati treno e test. I due set di dati hanno rispettivamente articoli 30213 e 30235 con 66 dimensioni ciascuno.Riduzione dimensionale con t-SNE

Sto provando ad applicare t-SNE di scikit imparare a ridurre la dimensione a 2. Poiché i set di dati sono grandi e ottengo MemoryError se provo a elaborare tutti i dati in una volta, cerco di suddividerli in pezzi e trasformano un pezzo in un momento come questo:

tsne = manifold.TSNE(n_components=2, perplexity=30, init='pca', random_state=0) 

X_tsne_train = np.array([ [ 0.0 for j in range(2) ] for i in range(X_train.shape[0]) ]) 

X_tsne_test = np.array([ [ 0.0 for j in range(2) ] for i in range(X_test.shape[0]) ]) 

d = ((X_train, X_tsne_train), (X_test, X_tsne_test)) 

chunk = 5000 

for Z in d: 

     x, x_tsne = Z[0], Z[1] 
     pstart, pend = 0, 0 
     while pend < x.shape[0]: 
       if pend + chunk < x.shape[0]: 
         pend = pstart + chunk 
       else: 
         pend = x.shape[0] 
       print 'pstart = ', pstart, 'pend = ', pend 
       x_part = x[pstart:pend] 
       x_tsne[pstart:pend] += tsne.fit_transform(x_part) 
       pstart = pend 

funziona senza MemoryError ma trovo che diverse esecuzioni di script producono uscite diverse per gli stessi elementi di dati. Ciò potrebbe essere dovuto alle operazioni di adattamento e trasformazione che avvengono insieme su ogni blocco di dati. Ma se provo ad adattarmi ai dati del treno con tsne.fit(X_train), ottengo MemoryError. Come ridurre correttamente la dimensione di tutti gli elementi di dati in treno e set di test a 2 senza alcuna incongruenza tra i blocchi?

+0

Come la risposta corrente fa notare, non è possibile applicare t-END a blocchi più piccoli e unire i risultati in modo significativo. Tuttavia, mi interessa la domanda più semplice "** Ho dei piccoli dati (articoli 5k in Dim 66) e t-SNE produce un MemoryError, perché è così? **" (Personalmente ho 24k righe in Dim 50 e lo stesso problema). –

risposta

2

Non sono del tutto sicuro di cosa intendiate per "output diversi con gli stessi dati", ma ecco alcuni commenti che potrebbero aiutarvi.

Innanzitutto, t-SNE non è realmente una tecnica di "riduzione delle dimensioni" nello stesso senso in cui PCA o altri metodi lo sono. Non c'è modo di prendere un modello t-SNE fisso e appreso e applicarlo ai nuovi dati. (Si noti che la classe non ha il metodo transform(), solo fit() e fit_transform().) Pertanto, non sarà possibile utilizzare un set di "treno" e "test".

In secondo luogo, ogni volta che si chiama fit_transform() si ottiene un modello completamente diverso. Il significato delle tue dimensioni ridotte è, quindi, non coerente da chunk a chunk. Ogni pezzo ha il suo piccolo spazio a bassa dimensione. Il modello è diverso ogni volta e quindi i dati non vengono proiettati nello stesso spazio.

In terzo luogo, non includere il codice in cui si divide "treno" da "test". Può darsi che, mentre stai facendo attenzione a impostare il seme casuale di t-SNE, non stai impostando il seme casuale della divisione treno/test, risultando in divisioni di dati diverse e quindi risultati diversi nelle esecuzioni successive.

Infine, se si desidera utilizzare t-SNE per visualizzare i dati, è possibile prendere in considerazione il consiglio sulla pagina di documentazione e applicare PCA per ridurre la dimensionalità dell'input da 66 a, ad esempio 15. Ciò comporterebbe ridurre drasticamente l'impronta di memoria di t-SNE.

TSNE in SKLearn Docs

+2

Mentre questo è tutto vero, non è molto utile per le persone che hanno dati dimensionabili e si imbattono in 'MemoryError's. Le FAQ t-SNE dicono di ridurre la dimensionalità dei dati quando sono troppo grandi, ma la mia comprensione è che milioni di esempi in Dim 50 dovrebbero andare bene, a lungo. Ho 24k punti in Dim 50, non è troppo grande. Perché sta fallendo? –

+0

come evitare l'errore di memoria? fare partizionare o dividere i dati manualmente? –