Clustering dengan matriks jarak


52

Saya memiliki matriks (simetris) Myang mewakili jarak antara setiap pasangan node. Sebagai contoh,

    ABCD EFGH IJKL
A 0 20 20 20 40 60 60 60 100 120 120 120
B 20 0 20 20 60 80 80 80 120 140 140 140 140
C 20 20 0 20 60 80 80 80 120 140 140 140 140
D 20 20 20 0 60 80 80 80 120 140 140 140 140
E 40 60 60 60 0 20 20 20 60 80 80 80
F 60 80 80 80 20 0 0 20 20 40 60 60 60
G 60 80 80 80 20 20 0 20 60 80 80 80
H 60 80 80 80 20 20 20 0 60 80 80 80
I 100 120 120 120 60 60 60 0 0 20 20 20
J 120 140 140 140 80 60 80 80 20 0 20 20
K 120 140 140 140 80 60 80 80 20 20 0 20
L 120 140 140 140 80 60 80 80 20 20 20 0

Apakah ada metode untuk mengekstrak cluster dari M(jika diperlukan, jumlah cluster dapat diperbaiki), sehingga setiap cluster berisi node dengan jarak kecil di antara mereka. Dalam contoh tersebut, cluster akan menjadi (A, B, C, D), (E, F, G, H)dan (I, J, K, L).

Saya sudah mencoba UPGMA dan k-berarti tetapi cluster yang dihasilkan sangat buruk.

Jarak adalah langkah rata-rata yang diambil oleh walker acak untuk berpindah dari node Ake node B( != A) dan kembali ke node A. Dijamin itu M^1/2adalah metrik. Untuk menjalankan- kberarti, saya tidak menggunakan centroid. Saya mendefinisikan jarak antar simpul ncluster csebagai jarak rata-rata antara ndan semua simpul dalam c.

Terima kasih banyak :)


1
Anda harus mempertimbangkan untuk menambahkan informasi yang telah Anda coba UPGMA (dan yang lain yang mungkin telah Anda coba) :)
Björn Pollex

1
Saya punya pertanyaan. Mengapa Anda mengatakan bahwa k-means berkinerja buruk? Saya telah memberikan Matriks Anda ke k-means dan melakukan pengelompokan yang sempurna. Apakah Anda tidak memberikan nilai k (jumlah cluster) ke k-means?

3
@ user12023 Saya pikir Anda salah paham pertanyaannya. Matriks ini bukan serangkaian titik - ini adalah jarak berpasangan di antara mereka. Anda tidak dapat menghitung centroid kumpulan poin ketika Anda hanya jarak di antara mereka (dan bukan koordinat sebenarnya), setidaknya tidak dengan cara yang jelas.
Stumpy Joe Pete

7
k-means tidak mendukung matriks jarak . Itu tidak pernah menggunakan jarak point-to-point. Jadi saya hanya bisa berasumsi itu harus menafsirkan ulang matriks Anda sebagai vektor , dan berlari pada vektor-vektor ini ... mungkin sama terjadi pada algoritma lain yang Anda coba: mereka mengharapkan data mentah , dan Anda melewati matriks jarak.
Anony-Mousse

Jawaban:


38

Ada sejumlah opsi.

k-medoids clustering

Pertama, Anda bisa mencoba mempartisi medoids (pam) daripada menggunakan k-means clustering. Yang ini lebih kuat, dan bisa memberikan hasil yang lebih baik. Van der Laan mengerjakan ulang algoritma. Jika Anda akan mengimplementasikannya sendiri, artikelnya layak dibaca.

Ada algoritma pengelompokan k-medoid tertentu untuk kumpulan data besar. Algoritma ini disebut Clara dalam R, dan dijelaskan dalam bab 3 dari Finding Groups in Data: Pengantar Analisis Cluster. oleh Kaufman, L dan Rousseeuw, PJ (1990).

pengelompokan hierarkis

Alih-alih UPGMA, Anda bisa mencoba beberapa opsi pengelompokan hierarkis lainnya. Pertama-tama, saat Anda menggunakan pengelompokan hierarkis, pastikan Anda mendefinisikan metode pemartisian dengan benar. Metode partisi ini pada dasarnya adalah bagaimana jarak antara pengamatan dan kelompok dihitung. Saya kebanyakan menggunakan metode Ward atau tautan lengkap, tetapi opsi lain mungkin menjadi pilihan bagi Anda.

Tidak tahu apakah Anda sudah mencobanya, tetapi metode tautan tunggal atau bergabung dengan tetangga sering kali lebih disukai daripada UPGMA dalam aplikasi filogenetik. Jika Anda belum mencobanya, Anda bisa mencobanya juga, karena sering memberikan hasil yang sangat baik.


Di R Anda bisa melihat pada paket cluster . Semua algoritma yang dijelaskan diimplementasikan di sana. Lihat? Pam,? Clara,? Hclust, ... Periksa juga implementasi algoritma yang berbeda dalam? Kmeans. Terkadang memilih algoritma lain dapat meningkatkan pengelompokan secara substansial.


EDIT: Pikirkan saja sesuatu: Jika Anda bekerja dengan grafik dan node dan sejenisnya, Anda harus melihat pada algoritma pengelompokan markov juga. Yang digunakan misalnya dalam pengelompokan urutan berdasarkan kesamaan ledakan, dan berkinerja sangat baik. Itu dapat melakukan pengelompokan untuk Anda, atau memberi Anda beberapa ide tentang bagaimana menyelesaikan masalah penelitian yang Anda fokuskan. Tanpa tahu apa-apa tentang hal itu, saya kira hasilnya pasti layak untuk dilihat. Jika saya dapat mengatakannya, saya masih menganggap metode Stijn van Dongen ini salah satu hasil terbaik dalam pengelompokan yang pernah saya temui.

http://www.micans.org/mcl/


22

Salah satu cara untuk menyoroti cluster pada matriks jarak Anda adalah dengan penskalaan multidimensi . Saat memproyeksikan individu (di sini apa yang Anda sebut simpul Anda) dalam ruang 2D, ia memberikan solusi yang sebanding dengan PCA. Ini tidak diawasi, sehingga Anda tidak akan dapat menentukan apriori jumlah cluster, tapi saya pikir mungkin membantu untuk meringkas jarak atau kemiripan matriks yang diberikan dengan cepat.

Inilah yang akan Anda dapatkan dengan data Anda:

tmp <- matrix(c(0,20,20,20,40,60,60,60,100,120,120,120,
                20,0,20,20,60,80,80,80,120,140,140,140,
                20,20,0,20,60,80,80,80,120,140,140,140,
                20,20,20,0,60,80,80,80,120,140,140,140,
                40,60,60,60,0,20,20,20,60,80,80,80,
                60,80,80,80,20,0,20,20,40,60,60,60,
                60,80,80,80,20,20,0,20,60,80,80,80,
                60,80,80,80,20,20,20,0,60,80,80,80,
                100,120,120,120,60,40,60,60,0,20,20,20,
                120,140,140,140,80,60,80,80,20,0,20,20,
                120,140,140,140,80,60,80,80,20,20,0,20,
                120,140,140,140,80,60,80,80,20,20,20,0),
              nr=12, dimnames=list(LETTERS[1:12], LETTERS[1:12]))
d <- as.dist(tmp)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
     rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")

mds

Saya menambahkan jittering kecil pada koordinat x dan y untuk memungkinkan membedakan kasus. Ganti tmpdengan 1-tmpjika Anda lebih suka bekerja dengan perbedaan, tetapi ini pada dasarnya menghasilkan gambar yang sama. Namun, berikut adalah solusi pengelompokan hierarkis, dengan kriteria aglomerasi tunggal :

plot(hclust(dist(1-tmp), method="single"))

hc

Anda dapat lebih mempertajam pemilihan cluster berdasarkan dendrogram, atau metode yang lebih kuat, lihat misalnya pertanyaan terkait ini: Apa kriteria berhenti untuk pengelompokan hierarki aglomeratif yang digunakan dalam praktik?


2

Spectral Clustering [1] membutuhkan matriks afinitas, clustering didefinisikan oleh fungsi eigen pertama dari dekomposisiK

L=D1/2AD1/2

Dengan menjadi matriks afinitas data dan menjadi matriks diagonal yang didefinisikan sebagai (edit: maaf karena tidak jelas, tetapi Anda dapat menghasilkan matriks afinitas dari matriks jarak asalkan Anda tahu semaksimal mungkin) / jarak yang wajar dengan , meskipun ada skema lain juga)ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

Dengan menjadi eigendecomposition dari , dengan eigenfunctions ditumpuk sebagai kolom, hanya menjaga vektor eigen terbesar di , kita mendefinisikan baris dinormalisasi matriksXLKX

Yij=Xij(j(Xij)2)1/2

Setiap baris adalah titik dalam dan dapat dikelompokkan dengan algoritma pengelompokan biasa (seperti K-means).YRk

Lihatlah jawaban saya di sini untuk melihat contoh: https://stackoverflow.com/a/37933688/2874779


[1] Ng, AY, Jordan, MI, & Weiss, Y. (2002). Tentang pengelompokan spektral: Analisis dan algoritme. Kemajuan dalam sistem pemrosesan informasi saraf, 2, 849-856. Hal.2


2

Apa yang Anda lakukan adalah mencoba mengelompokkan simpul-simpul sebuah grafik, atau jaringan, yang berdekatan satu sama lain. Ada seluruh bidang penelitian yang didedikasikan untuk masalah ini yang kadang-kadang disebut deteksi komunitas dalam jaringan . Melihat masalah Anda dari sudut pandang ini mungkin dapat mengklarifikasi hal-hal.

Anda akan menemukan banyak algoritma yang didedikasikan untuk masalah ini dan bahkan beberapa dari mereka didasarkan pada ide yang sama dengan yang Anda miliki, yaitu mengukur jarak antara node dengan jalan acak.

Masalahnya sering dirumuskan sebagai optimasi modularitas [1] di mana modularitas suatu clustering mengukur seberapa baik clustering memisahkan jaringan dalam kelompok-kelompok yang terhubung secara padat (yaitu kelompok-kelompok di mana simpul-simpul itu berdekatan satu sama lain).

Sebenarnya, Anda dapat menunjukkan bahwa modularitas sama dengan probabilitas bahwa walker acak tetap, setelah satu langkah, dalam kelompok yang sama daripada awalnya dikurangi probabilitas yang sama untuk dua walker acak independen [2].

Jika Anda mengizinkan lebih banyak langkah dari walker acak, Anda mencari pengelompokan yang lebih kasar dari jaringan. Oleh karena itu, jumlah langkah jalan acak memainkan peran parameter resolusi yang memungkinkan untuk memulihkan hierarki cluster. Dalam hal ini, kuantitas yang menyatakan kecenderungan walker acak untuk tetap berada di cluster awal mereka setelah langkah t disebut stabilitas Markov dari partisi pada waktu t [2] dan itu setara dengan modularitas ketika t = 1 .

Karena itu Anda dapat memecahkan masalah Anda dengan menemukan pengelompokan grafik Anda yang mengoptimalkan stabilitas pada waktu t tertentu , di mana t adalah parameter resolusi ( t lebih besar akan memberi Anda kelompok yang lebih besar). Salah satu metode yang paling banyak digunakan untuk mengoptimalkan stabilitas (atau modularitas dengan parameter resolusi) adalah Algoritma Louvain [3]. Anda dapat menemukan implementasi di sini: https://github.com/michaelschaub/generalizedLouvain .

[1] Newman, MEJ & Girvan, M. Menemukan dan mengevaluasi struktur komunitas dalam jaringan. Phys Pendeta E 69, 026113 (2004).

[2] Delvenne, J.-C., Yaliraki, SN & Barahona, M. Stabilitas komunitas grafik lintas skala waktu. Proc Natl. Acad. Sci. 107, 12755-12760 (2010).

[3] Blondel, VD, Guillaume, J.-L., Lambiotte, R. & Lefebvre, E. Terungkapnya komunitas dengan cepat dalam jaringan besar. J. Stat. Mech. Teori Exp. 2008, P10008 (2008).


1

Yah, adalah mungkin untuk melakukan pengelompokan K-means pada matriks kesamaan yang diberikan, pada awalnya Anda perlu memusatkan matriks dan kemudian mengambil nilai eigen dari matriks. Langkah terakhir dan yang paling penting adalah mengalikan dua set vektor eigen pertama ke akar kuadrat diagonal dari nilai eigen untuk mendapatkan vektor dan kemudian melanjutkan dengan K-means. Di bawah kode ini menunjukkan bagaimana melakukannya. Anda dapat mengubah matriks kesamaan. fpdist adalah matriks kesamaan.

mds.tau <- function(H)
{
  n <- nrow(H)
   P <- diag(n) - 1/n
   return(-0.5 * P %*% H %*% P)
  }
  B<-mds.tau(fpdist)
  eig <- eigen(B, symmetric = TRUE)
  v <- eig$values[1:2]
#convert negative values to 0.
v[v < 0] <- 0
X <- eig$vectors[, 1:2] %*% diag(sqrt(v))
library(vegan)
km <- kmeans(X,centers= 5, iter.max=1000, nstart=10000) .
#embedding using MDS
cmd<-cmdscale(fpdist)

0

Sebelum Anda mencoba menjalankan pengelompokan pada matriks Anda dapat mencoba melakukan salah satu teknik analisis faktor, dan tetap hanya variabel yang paling penting untuk menghitung matriks jarak. Hal lain yang dapat Anda lakukan adalah mencoba menggunakan metode fuzzy yang cenderung bekerja lebih baik (setidaknya dalam pengalaman saya) dalam kasus-kasus seperti ini, coba Cmeans pertama, medoids Fuzzy K, dan Khususnya GKCmeans.


0

Co-clustering adalah salah satu jawaban yang saya kira. Tapi saya tidak ahli di sini. Co-clustring bukan metode yang baru lahir, jadi Anda dapat menemukan beberapa algos di R, wiki menunjukkan konsep tersebut dengan cara yang baik. Metode lain yang tidak disebutkan adalah partisi grafik (tapi saya melihat grafik tidak akan jarang, partisi grafik akan berguna jika matriks Anda akan didominasi oleh nilai-nilai yang berarti = jarak maksimum = tidak ada kesamaan antara node).


0

Lihat ke dalam PROPAGASI AFFINITAS, Teknik ini mengambil input matriks kesamaan dan menghasilkan jumlah cluster yang optimal bersama dengan contoh yang representatif untuk setiap cluster.


2
Bisakah Anda memperluas ini dan menjelaskan bagaimana metode ini membantu dalam kasus ini?
Andy


0

Anda juga dapat menggunakan algoritma Kruskal untuk menemukan pohon rentang minimum, tetapi berakhir segera setelah Anda mendapatkan tiga kelompok. Saya mencoba cara ini dan menghasilkan kluster yang Anda sebutkan: {ABCD}, {EFGH} dan {IJKL}.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.