Phân cụm với một ma trận khoảng cách


52

Tôi có một ma trận (đối xứng) Mđại diện cho khoảng cách giữa mỗi cặp nút. Ví dụ,

    ABCDEFGHIJKL
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
C 20 20 0 20 60 80 80 80 120 140 140 140
D 20 20 20 0 60 80 80 80 120 140 140 140
E 40 60 60 60 0 20 20 20 60 80 80 80
F 60 80 80 80 20 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
Tôi 100 120 120 120 60 40 60 60 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

Có phương pháp nào để trích xuất các cụm từ M(nếu cần, số lượng cụm có thể được cố định), sao cho mỗi cụm chứa các nút có khoảng cách nhỏ giữa chúng. Trong ví dụ này, các cụm sẽ là (A, B, C, D), (E, F, G, H)(I, J, K, L).

Tôi đã thử UPGMA và k-means nhưng các cụm kết quả rất tệ.

Khoảng cách là các bước trung bình mà một người đi bộ ngẫu nhiên sẽ thực hiện để đi từ nút này Asang nút B( != A) và quay lại nút A. Nó được đảm bảo rằng đó M^1/2là một số liệu. Để chạy k-means, tôi không sử dụng centroid. Tôi xác định khoảng cách giữa ncụm nút clà khoảng cách trung bình giữa nvà tất cả các nút trong c.

Cảm ơn rất nhiều :)


1
Bạn nên xem xét thêm thông tin mà bạn đã thử UPGMA (và những thông tin khác mà bạn có thể đã thử) :)
Bjorn Pollex

1
Tôi có một câu hỏi. Tại sao bạn nói rằng các phương tiện k thực hiện kém? Tôi đã chuyển Ma trận của bạn sang phương tiện k và nó đã thực hiện phân cụm hoàn hảo. Bạn đã không chuyển giá trị của k (số cụm) cho k-mean?

3
@ user12023 Tôi nghĩ bạn đã hiểu nhầm câu hỏi. Ma trận không phải là một chuỗi các điểm - đó là khoảng cách theo cặp giữa chúng. Bạn không thể tính trọng tâm của một tập hợp các điểm khi bạn chỉ khoảng cách giữa chúng (và không phải tọa độ thực của chúng), ít nhất là không theo bất kỳ cách rõ ràng nào.
Stumpy Joe Pete

7
k-nghĩa là không hỗ trợ ma trận khoảng cách . Nó không bao giờ sử dụng khoảng cách điểm-điểm. Vì vậy, tôi chỉ có thể giả sử rằng nó phải diễn giải lại ma trận của bạn dưới dạng vectơ và chạy trên các vectơ này ... có thể điều tương tự cũng xảy ra với các thuật toán khác mà bạn đã thử: chúng mong đợi dữ liệu thô và bạn đã vượt qua ma trận khoảng cách.
Anony-Mousse

Câu trả lời:


38

Có một số tùy chọn.

k-medoids phân cụm

Trước tiên, bạn có thể thử phân vùng xung quanh medoid (pam) thay vì sử dụng phân cụm k-nghĩa. Điều này là mạnh mẽ hơn, và có thể cho kết quả tốt hơn. Van der Laan làm lại thuật toán. Nếu bạn sẽ tự thực hiện nó, bài viết của anh ấy đáng để đọc.

Có một thuật toán phân cụm k-medoid cụ thể cho các bộ dữ liệu lớn. Thuật toán được gọi là Clara in R và được mô tả trong chương 3 của Tìm nhóm trong dữ liệu: Giới thiệu về phân tích cụm. bởi Kaufman, L và Rousseeuw, PJ (1990).

phân cụm

Thay vì UPGMA, bạn có thể thử một số tùy chọn phân cụm khác. Trước hết, khi bạn sử dụng phân cụm theo phân cấp, hãy chắc chắn rằng bạn xác định đúng phương pháp phân vùng. Phương pháp phân vùng này về cơ bản là cách tính khoảng cách giữa các quan sát và cụm. Tôi chủ yếu sử dụng phương pháp của Ward hoặc liên kết hoàn chỉnh, nhưng các tùy chọn khác có thể là lựa chọn cho bạn.

Không biết bạn đã thử chưa, nhưng phương pháp liên kết đơn hoặc tham gia hàng xóm thường được ưu tiên hơn UPGMA trong các ứng dụng phát sinh gen. Nếu bạn chưa thử, bạn cũng có thể thử, vì nó thường cho kết quả rất tốt.


Trong R bạn có thể xem cụm gói . Tất cả các thuật toán được mô tả được thực hiện ở đó. Xem? Pam ,? Clara ,? Hclust, ... Kiểm tra cả cách triển khai khác nhau của thuật toán trong? Kmeans. Đôi khi, chọn một thuật toán khác có thể cải thiện đáng kể việc phân cụm.


EDIT: Chỉ cần nghĩ về một cái gì đó: Nếu bạn làm việc với các biểu đồ và nút và các lượt thích, bạn cũng nên xem thuật toán phân cụm markov. Đó là một ví dụ được sử dụng trong các nhóm trình tự dựa trên sự tương tự vụ nổ, và thực hiện rất tốt. Nó có thể thực hiện phân cụm cho bạn hoặc cung cấp cho bạn một số ý tưởng về cách giải quyết vấn đề nghiên cứu mà bạn đang tập trung vào. Thực tế không biết gì về nó, tôi đoán kết quả của anh ấy chắc chắn đáng xem xét. Nếu tôi có thể nói như vậy, tôi vẫn coi phương pháp này của Stijn van Dongen là một trong những kết quả đẹp nhất trong việc phân cụm mà tôi từng gặp.

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


22

Một cách để làm nổi bật các cụm trên ma trận khoảng cách của bạn là bằng cách chia tỷ lệ đa chiều . Khi chiếu các cá nhân (ở đây bạn gọi các nút của mình) trong không gian 2D, nó cung cấp một giải pháp tương đương với PCA. Điều này không được giám sát, do đó bạn sẽ không thể chỉ định số lượng cụm, nhưng tôi nghĩ nó có thể giúp tóm tắt nhanh chóng một ma trận khoảng cách hoặc ma trận tương tự.

Đây là những gì bạn sẽ nhận được với dữ liệu của bạn:

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

Tôi đã thêm một biến động nhỏ trên tọa độ x và y để cho phép phân biệt các trường hợp. Thay thế tmpbằng 1-tmpnếu bạn thích làm việc với sự khác biệt, nhưng điều này mang lại cơ bản giống như hình ảnh. Tuy nhiên, đây là giải pháp phân cụm theo cấp bậc, với các tiêu chí tích tụ đơn :

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

hc

Bạn có thể tinh chỉnh thêm việc lựa chọn các cụm dựa trên dendrogram, hoặc các phương thức mạnh hơn, xem ví dụ câu hỏi liên quan này: Tiêu chí dừng nào cho phân cụm phân cấp kết tụ được sử dụng trong thực tế?


2

K

L=D1/2AD1/2

ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

Với là sự xuất hiện của , với các hàm riêng được xếp chồng lên nhau thành các cột, chỉ giữ các hàm riêng lớn nhất trong , chúng tôi xác định ma trận chuẩn hóa hàngXLKX

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

Mỗi hàng của là một điểm trong và có thể được phân cụm bằng thuật toán phân cụm thông thường (như K-nghĩa).YRk

Nhìn vào câu trả lời của tôi ở đây để xem một ví dụ: https://stackoverflow.com/a/37933688/2874779


[1] Ng, AY, Jordan, MI, & Weiss, Y. (2002). Về phân cụm phổ: Phân tích và một thuật toán. Những tiến bộ trong hệ thống xử lý thông tin thần kinh, 2, 849-856. PG.2


2

Những gì bạn đang làm là cố gắng phân cụm các nút của biểu đồ hoặc mạng, gần nhau. Có cả một lĩnh vực nghiên cứu dành riêng cho vấn đề này đôi khi được gọi là phát hiện cộng đồng trong các mạng . Nhìn vào vấn đề của bạn từ quan điểm này có thể có thể làm rõ mọi thứ.

Bạn sẽ tìm thấy nhiều thuật toán dành riêng cho vấn đề này và trên thực tế, một số thuật toán dựa trên cùng một ý tưởng mà bạn đã có, đó là đo khoảng cách giữa các nút với các bước đi ngẫu nhiên.

Vấn đề thường được coi là tối ưu hóa mô đun [1] trong đó tính mô đun của phân cụm đo lường mức độ phân cụm của mạng trong các cụm được kết nối dày đặc (nghĩa là các cụm có các nút gần nhau).

Trên thực tế, bạn có thể chỉ ra rằng tính mô đun bằng với xác suất một người đi bộ ngẫu nhiên ở lại, sau một bước, trong cùng một cụm so với ban đầu trừ đi xác suất giống nhau cho hai người đi bộ ngẫu nhiên độc lập [2].

Nếu bạn cho phép nhiều bước hơn của các máy đi bộ ngẫu nhiên, bạn đang tìm kiếm một cụm thô hơn của mạng. Do đó, số bước của bước đi ngẫu nhiên đóng vai trò của tham số độ phân giải cho phép khôi phục phân cấp các cụm. Trong trường hợp này, đại lượng biểu thị xu hướng của người đi bộ ngẫu nhiên ở lại cụm ban đầu của họ sau các bước t được gọi là độ ổn định Markov của phân vùng tại thời điểm t [2] và nó tương đương với mô đun khi t = 1 .

Do đó bạn có thể giải quyết vấn đề của bạn bằng cách tìm các phân nhóm của đồ thị của bạn tối ưu hóa sự ổn định tại một thời điểm nhất định t , nơi t là tham số độ phân giải (lớn hơn t sẽ cung cấp cho bạn các cụm lớn hơn). Một trong những phương pháp được sử dụng nhiều nhất để tối ưu hóa độ ổn định (hoặc mô đun hóa với tham số độ phân giải) là Thuật toán Louvain [3]. Bạn có thể tìm thấy một triển khai ở đây: https://github.com/michaelschaub/generalizedLouvain .

[1] Newman, MEJ & Girvan, M. Tìm kiếm và đánh giá cấu trúc cộng đồng trong các mạng. Vật lý. Rev E 69, 026113 (2004).

[2] Delvenne, J.-C., Yaliraki, SN & Barahona, M. Tính ổn định của các cộng đồng đồ thị theo thang thời gian. Proc. Natl. Học viện Khoa học. 107, 12755 Từ 12760 (2010).

[3] Blondel, VD, Guillaume, J.-L., Lambiotte, R. & Lefebvre, E. Mở ra nhanh chóng các cộng đồng trong các mạng lớn. J. Stat. Cơ điện tử. Lý thuyết Exp. 2008, P10008 (2008).


1

Chà, có thể thực hiện phân cụm K-nghĩa trên một ma trận tương tự đã cho, lúc đầu bạn cần căn giữa ma trận và sau đó lấy giá trị riêng của ma trận. Bước cuối cùng và quan trọng nhất là nhân hai tập hợp hàm riêng đầu tiên với căn bậc hai đường chéo của các giá trị riêng để lấy các vectơ và sau đó tiếp tục với phương tiện K. Dưới đây mã cho thấy làm thế nào để làm điều đó. Bạn có thể thay đổi ma trận tương tự. fpdist là ma trận tương tự.

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

Trước khi bạn thử chạy phân cụm trên ma trận, bạn có thể thử thực hiện một trong các kỹ thuật phân tích nhân tố và chỉ giữ các biến quan trọng nhất để tính ma trận khoảng cách. Một điều khác bạn có thể làm là thử sử dụng các phương pháp mờ có xu hướng hoạt động tốt hơn (ít nhất là theo kinh nghiệm của tôi) trong trường hợp này, hãy thử Cmeans, Fuzzy K-medoid và GKCmeans đặc biệt.


0

Co-clustering là một trong những câu trả lời tôi nghĩ. Nhưng tôi không phải là chuyên gia ở đây. Co-clustring không phải là phương pháp sơ sinh, vì vậy bạn có thể tìm thấy một số thuật toán trong R, wiki cho thấy các khái niệm theo cách tốt. Một phương pháp khác không được phân bổ là phân vùng biểu đồ (nhưng tôi thấy rằng biểu đồ sẽ không thưa thớt, phân vùng biểu đồ sẽ hữu ích nếu ma trận của bạn sẽ bị chi phối bởi các giá trị có nghĩa là = khoảng cách tối đa = không có sự tương đồng giữa các nút).


0

Nhìn vào SỞ HỮU AFFINITY, Kỹ thuật này lấy đầu vào là ma trận tương tự và tạo ra một số cụm tối ưu cùng với một ví dụ đại diện cho mỗi cụm.


2
Bạn có thể mở rộng về điều này và giải thích phương pháp này giúp ích như thế nào trong trường hợp này?
Andy


0

Bạn cũng có thể sử dụng thuật toán Kruskal để tìm các cây bao trùm tối thiểu, nhưng kết thúc ngay khi bạn nhận được ba cụm. Tôi đã thử theo cách này và nó tạo ra các cụm bạn đã đề cập: {ABCD}, {EFGH} và {IJKL}.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.