2016-04-11 20 views
5

Ho un piccolo problema per eseguire TSNE sul mio set di dati, utilizzando la somiglianza del coseno.somiglianza coseno TSNE in sklearn.manifold

ho calcolato la somiglianza coseno di tutti i miei vettori, quindi ho una matrice quadrata che contiene la mia somiglianza coseno:

A = [[ 1 0.7 0.5 0.6 ] 
    [ 0.7 1 0.3 0.4 ] 
    [ 0.5 0.3 1 0.1 ] 
    [ 0.6 0.4 0.1 1 ]] 

Poi, sto usando TSNE così:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
model = manifold.TSNE(metric="precomputed") 
Y = model.fit_transform(A) 

Ma io non sono sicuro che l'utilizzo metrico precalcolate mantenere il senso della mia somiglianza coseno:

#[documentation][1] 
If metric is “precomputed”, X is assumed to be a distance matrix 

Ma quando provo ad usare coseno metrica, ho ottenuto un errore:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
model = manifold.TSNE(metric="cosine") 
Y = model.fit_transform(A) 

raise ValueError("All distances should be positive, either " 
ValueError: All distances should be positive, either the metric or 
precomputed distances given as X are not correct 

Quindi la mia domanda è, come è possibile eseguire TSNE utilizzando coseno metrica su un set di dati esistente (matrice di similarità)?

+0

quale versione è scikit imparare? - Il codice funziona per me. – cel

+0

Spiacente, aggiorno il mio codice, uso la funzione 'fit_transform' per trasformare il mio input. e l'errore sembra provenire da lì ... ho codificato una piccola parte che non funziona: 'da sklearn importazione collettore NumPy importazione come np A = np.matrix ([[1, 0,7 , 0,5,0.6], [1, 0,7,0,5,0,6], [0,5,0,3,1,0,1], [0,6,0,4,0,1,1]]) model = manifold.TSNE (metrico = "coseno") Y = model.fit_transform (A) ' – HugoLasticot

risposta

5

Posso rispondere alla maggior parte della domanda, tuttavia non sono del tutto sicuro del motivo per cui questo errore si sta verificando nel secondo esempio.

Hai calcolato la somiglianza del coseno di ciascuno dei tuoi vettori, ma scikit presuppone una matrice di distanza per l'input per TSNE. Tuttavia questa è una distanza di trasformazione molto semplice = 1 - somiglianza. Quindi per il tuo esempio

import numpy as np 
from sklearn import manifold 
A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) 
A = 1.-A 
model = manifold.TSNE(metric="precomputed") 
Y = model.fit_transform(A) 

Questo dovrebbe darti la trasformazione che desideri.

+0

Grazie! Ho appena letto un articolo su questo. Hai ragione, funziona. Per essere più precisi, possiamo aggiungere la radice quadrata di questo valore. Sei d'accordo ? – HugoLasticot

+0

Perché 'distanza = 1 - somiglianza '? – mrgloom

+0

È definito come quello per la metrica coseno, puoi vedere sulla [pagina wiki] (https://en.wikipedia.org/wiki/Cosine_similarity) – ncfirth

0

può essere fatto con sklearn pairwise_distances:

from sklearn.manifold import TSNE 
from sklearn.metrics import pairwise_distances 

distance_matrix = pairwise_distances(X, X, metric='cosine', n_jobs=-1) 
model = TSNE(metric="precomputed") 
Xpr = model.fit_transform(distance_matrix) 

I valori in distance_matrix saranno nell'intervallo [0,2], perché (1 - [-1,1]).