k-significa implementazione con matrice di distanza personalizzata in input


14

Qualcuno può indicarmi un'implementazione di k-mean (sarebbe meglio se in MATLAB) che può prendere la matrice di distanza in input? L'implementazione di matlab standard richiede la matrice di osservazione in input e non è possibile modificare in modo personalizzato la misura della somiglianza.


2
Potresti provare a generare dati grezzi corrispondenti alla tua matrice di distanze euclidee e inserirli in K-Means. Un approccio semplice alternativo potrebbe essere l'uso del metodo Ward di raggruppamento gerarchico della matrice: K-Means e Ward condividono un'ideologia simile a ciò che è un cluster.
ttnphns,


Non Matlab, ma la pagina di Python sotto è-è-possibile-specificare-la-tua-propria-distanza-funzione-usando-scikits-impara-k-mezzi può usare una qualsiasi delle 20 metriche dispari in scipy.spatial. distanza.
denis,

Risposte:


13

Poiché k-mean deve essere in grado di trovare i mezzi di diversi sottoinsiemi dei punti che si desidera raggruppare, non ha davvero senso chiedere una versione di k-mean che accetta una matrice di distanza come input.

Invece potresti provare k-medoids . Ci sono alcune implementazioni matlab disponibili.


1
Ciao, grazie per la risposta; invece di fornire direttamente la matrice della distanza sarebbe possibile fornire come input una metrica della distanza personalizzata? Il punto è che devo confrontare due metodi di clustering e, poiché nel secondo uso una matrice di somiglianza personalizzata, voglio usare lo stesso approccio con i kmean per ottenere un confronto equo.
Eugenio,

2
ELKI ti consente di utilizzare funzioni di distanza arbitrarie con k-medie. Si noti che l'algoritmo potrebbe non riuscire a convergere. K-mean è davvero progettato per la distanza euclidea al quadrato (somma dei quadrati). Con altre distanze, la media potrebbe non ottimizzarsi più e, boom, l'algoritmo alla fine non converge. Seriamente, considera l'uso di k-medoids. In realtà è stato scritto per consentire l'utilizzo dell'idea k- mean con distanze arbirarie .
Ha QUIT - Anony-Mousse il

È inoltre disponibile una libreria Python / C ++ che consente di fornire una funzione metrica personalizzata: github.com/annoviko/pyclustering/issues/417
CpILL

7

Potresti trasformare la tua matrice di distanze in dati grezzi e inserirli nel clustering di K-Means. I passaggi sarebbero i seguenti:

1) Le distanze tra i tuoi N punti devono essere quadrate euclidee. Eseguire " doppio centraggio " della matrice: sottrai la media delle righe da ciascun elemento; nel risultato, sottrai la media della colonna da ciascun elemento; nel risultato, aggiungere la matrice media a ciascun elemento; dividi per meno 2. La matrice che hai ora è la matrice SSCP (somma dei quadrati e del prodotto incrociato) tra i tuoi punti in cui l'origine è posta al centro geometrico della nuvola di N punti. (Leggi la spiegazione del doppio centraggio qui .)

2) Eseguire PCA (analisi dei componenti principali) su quella matrice e ottenere la matrice di caricamento dei componenti NxN . È probabile che alcune delle ultime colonne siano tutte 0, quindi tagliatele. Ciò con cui stai adesso sono i punteggi dei componenti principali, le coordinate dei tuoi N punti sui componenti principali che passano, come assi, attraverso la tua nuvola. Questi dati possono essere trattati come dati grezzi adatti per l'input di K-Means.

PS Se le tue distanze non sono euclidee quadrate geometricamente corrette potresti riscontrare problemi: la matrice SSCP potrebbe non essere positiva (semi) definita. Questo problema può essere affrontato in diversi modi ma con perdita di precisione.


Grazie per la tua risposta! In realtà non ho una matrice di distanze reali ma una matrice di somiglianza (0 ... 1) tra gli oggetti e le somiglianze non sono calcolate esattamente usando le distanze euclidiane ma con un algoritmo personalizzato che prende in considerazione i dati grezzi ma non nella modo standard. Immagino che in questo caso non riesco ad applicare la tua procedura, vero?
Eugenio,

È ancora possibile, dopo aver convertito le somiglianze in distanze. Quest'ultimo probabilmente non sarà vero euclideo (e quindi l'SSCP avrà alcuni autovalori negativi); quindi prova ad aggiungere una piccola costante alle distanze fino a quando l'SSCP perde neg. eig. Esistono anche altri modi per aggirare il problema. E ricorda che raddoppia la matrice centrale delle distanze al quadrato .
ttnphns,

PS E comunque. Se la tua matrice è simile, allora, beh, è ​​ancora meglio. Lo tratti semplicemente come quella matrice SSCP di cui parlavo e fai PCA con esso. Tuttavia, rimane il problema dei possibili autovalori negativi.
ttnphns,

@ttnphns, scusa mi manca la tua spiegazione per il passaggio 1. La matrice distanza X(diciamo N * N) sta per essere simmetrica, in modo colMeans(X) =rowMeans(X) e una volta che si sottrae riga o col mezzo: Y=X-rowMeans(X), mean(Y)è 0.
Zhubarb

1
@Zhubarb, quando dico You could turn your matrix of distances into raw data(punti 1 e 2) mi riferisco, in sostanza, al ridimensionamento multidimensionale (MDS) di Torgerson , in cui il doppio centraggio è il passo iniziale. Cerca su questo sito (e anche su Google) questa procedura. Il "doppio centraggio" è la conversione delle distanze (al quadrato) nella matrice del prodotto scalare corrispondente definita sull'origine messa nel centroide della nuvola dei punti.
ttnphns,

3

Si prega di consultare questo articolo, scritto da uno dei miei conoscenti;)

http://arxiv.org/abs/1304.6899

Si tratta di un'implementazione k-mean generalizzata, che accetta come input una matrice di distanza arbitraria. Può essere qualsiasi matrice simmetrica non negativa con una diagonale zero. Si noti che potrebbe non dare risultati sensati per matrici a distanza strane. Il programma è scritto in C #.

Il codice sorgente può essere ottenuto visitando il link sopra, quindi facendo clic su Altri formati, quindi facendo clic su Scarica sorgente. Quindi otterrai un file .tar.gz contenente Program.cs. In alternativa, il codice sorgente può essere copiato anche dal PDF.


3

È possibile utilizzare la libreria di Java Machine Learning. Hanno un'implementazione K-Means. Uno dei costruttori accetta tre argomenti

  1. Valore K
  2. Un oggetto di questo è un'istanza della classe DistanceMeasure .
  3. Numero di iterazioni.

Si può facilmente estendere la classe DistanceMeasure per ottenere il risultato desiderato. L'idea è di restituire i valori da una matrice di distanza personalizzata nel metodo di misura (Istanza x, Istanza y) di questa classe.

K-Means è garantito per convergere assumendo determinate proprietà della metrica della distanza. La distanza euclidea, la distanza di Manhattan o altre metriche standard soddisfano questi presupposti. Poiché una metrica della distanza personalizzata potrebbe non soddisfare questi presupposti, il costruttore ha un terzo parametro che specifica il numero di iterazioni da eseguire per la creazione del clusterer.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.