2011-10-11 6 views
6

non riesco a Seam di trovare alcun tutorial abbastanza semplici o descrizioni sul clustering in SciPy, quindi cercherò di spiegare il mio problema:Clustering con SciPy - cluster tramite matrice delle distanze, come tornare gli oggetti originali

Cerco di raggruppare i documenti (clustering gerarchico agglomerato) e ho creato un vettore per ogni documento e prodotto una matrice di distanza simmetrica. La vector_list contiene vettori (molto lunghi) che rappresentano ciascun documento. L'ordine di questo elenco di vettori è lo stesso del mio elenco di documenti di input in modo che (si spera) potrò abbinare i risultati del clustering con il documento corrispondente.

distances = distance.cdist(vector_list, vector_list, 'euclidean') 

Questo dà una matrice come questo, dove la linea diagonale è ciascun documenti distanza a se stesso (sempre 0)

[0 5 4] 
[5 0 4] 
[5 4 0] 

nutro questa matrice distanza linkage scipys' funzione().

restituisce qualcosa che non sono sicuro di cosa sia, ma viene visualizzato come tipo di dati numpy.ndarray. Secondo i documenti, posso nutrirlo nuovamente in fcluster per ottenere "ammassi piatti". Io uso la metà della distanza massima nella matrice della distanza come soglia.

idx = hier.fcluster(clu,0.5*distances.max(), 'distance') 

Questo restituisce un numpy.ndarray che ancora non ha molto senso per me. Un esempio è [6 3 1 7 1 8 9 4 5 2]

Quindi la mia domanda: che cosa è che ricevo dalla legame e fcluster funzioni, e come posso passare da lì e tornare a il mio documento che ho creato per prima cosa la matrice della distanza, per vedere se i cluster hanno senso? Lo sto facendo bene?

risposta

3

Prima di tutto, non c'è bisogno di passare attraverso l'intero processo con cdist e linkage se si utilizza fclusterdata invece di fcluster; Quella funzione è possibile alimentare una matrice (n_documents, n_features) di conteggi termine, valori tf-idf o qualsiasi altra cosa siano.

L'uscita fclusterdata è la stessa di quella di fcluster: un array T tale che "T[i] è il numero di cluster piatta a cui osservazione originale i appartiene" Ad esempio, il modulo cluster.hierarchy appiattisce il clustering in base a una soglia impostata su 0.5*distances.max(). Nel tuo caso, il terzo e il quinto documento sono raggruppati insieme, ma tutti gli altri formano dei cluster, quindi potresti voler impostare la soglia più alta o utilizzare un diverso criterion.

+0

1. Quindi il mio utilizzo di cdist e linkage è ridondante se utilizzo fclusterdata .. l'input che alimento cdist (vector_list) è una lunga lista di vettori di conteggio parole in cui ogni riga è il testo comparato rispetto al vocabolario completo del documento collezione. Quando dici che posso nutrire fculsterdata 'qualunque siano le mie caratteristiche' in un (n_documenti, n_features), intendi una dict ala (document_id: vector) ad es. (1: [0,0,0,1,0,2,0 ])? – Eiriks

+0

2. Come puoi vedere che il terzo e il quinto documento sono raggruppati insieme nell'elenco [6 3 1 7 1 8 9 4 5 2]? Quello che voglio fare è sapere quanti cluster ho, quanto è grande ciascun cluster, quali sono i testi in ogni cluster e qual è il centeroide di ogni cluster. Non riesco a vedere come l'array T mi porta lì. L'i in T [i] mi dice solo dove si trova in T i, è solo un riferimento a uno dei numeri [6 3 1 7 1 8 9 4 5 2]? – Eiriks

+1

@Eiriks: 1. si. Per caratteristiche, intendo valori numerici. 2.Il terzo e il quinto elemento (1-indicizzati) di quella lista hanno lo stesso valore. I valori nell'elenco sono numeri di cluster. –