การทำคลัสเตอร์ด้วยเมทริกซ์ระยะทาง


52

ฉันมีเมทริกซ์ (สมมาตร) Mที่แสดงถึงระยะห่างระหว่างแต่ละคู่ของโหนด ตัวอย่างเช่น,

    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
I 100 120 120 120 60 40 60 60 0 20 20 20
J 120 140 140 140 80 80 80 80 20 0 20 20
K 120 140 140 140 80 80 80 80 20 20 0 0 20
L 120 140 140 140 80 80 80 80 20 20 20 0 0

มีวิธีการใดที่จะดึงกลุ่มจากM(ถ้าจำเป็นจำนวนของคลัสเตอร์ที่สามารถแก้ไขได้) เช่นว่าแต่ละคลัสเตอร์มีโหนดที่มีระยะทางเล็ก ๆ ระหว่างพวกเขา ในตัวอย่างกลุ่มจะเป็น(A, B, C, D), และ(E, F, G, H)(I, J, K, L)

ฉันได้ลอง UPGMA และk-means แล้ว แต่ผลลัพธ์ที่ได้นั้นแย่มาก

ระยะทางเฉลี่ยขั้นตอนการสุ่มวอล์คเกอร์จะใช้เวลาที่จะไปจากโหนดAไปยังโหนดB( != A) Aและกลับไปที่โหนด มันรับประกันว่าM^1/2เป็นตัวชี้วัด ในการรันkหมายถึงฉันไม่ได้ใช้เซนทรอยด์ ฉันกำหนดระยะห่างระหว่างโหนดnคลัสเตอร์cเป็นระยะทางเฉลี่ยระหว่างและโหนดทั้งหมดในnc

ขอบคุณมาก :)


1
คุณควรพิจารณาเพิ่มข้อมูลที่คุณได้ลองใช้ UPGMA แล้ว (และอื่น ๆ ที่คุณอาจลอง) :)
Björn Pollex

1
ฉันมีคำถาม. ทำไมคุณถึงพูดว่า k-mean ทำงานได้ไม่ดี? ฉันส่งเมทริกซ์ของคุณไปยัง k-mean แล้วและมันได้ทำการจัดกลุ่มที่สมบูรณ์แบบ คุณไม่ส่งผ่านค่าของ k (จำนวนกลุ่ม) ไปยัง k-mean หรือไม่

3
@ user12023 ฉันคิดว่าคุณเข้าใจผิดคำถาม เมทริกซ์ไม่ใช่ชุดของจุด - มันคือระยะทางคู่กันระหว่างพวกมัน คุณไม่สามารถคำนวณเซนทรอยด์ของการสะสมคะแนนเมื่อคุณมีระยะห่างระหว่างพวกเขา (และไม่ใช่พิกัดจริง) อย่างน้อยก็ไม่ชัดเจน
Stumpy Joe Pete

7
ไม่สนับสนุน matrixes มันไม่เคยใช้ระยะทางจากจุดหนึ่งไปยังอีกจุดหนึ่ง ดังนั้นฉันคิดได้เพียงว่ามันต้องตีความเมทริกซ์ของคุณใหม่เป็นเวกเตอร์และวิ่งบนเวกเตอร์เหล่านี้ ... อาจเกิดขึ้นเหมือนกันสำหรับอัลกอริธึมอื่น ๆ ที่คุณพยายาม: พวกมันคาดหวังข้อมูลดิบและคุณผ่านเมทริกซ์ระยะทาง
Anony-Mousse

คำตอบ:


38

มีตัวเลือกมากมาย

การจัดกลุ่ม k-medoids

ขั้นแรกคุณสามารถลองแบ่งพาร์ติชันบริเวณใกล้เคียงกับ medoids (pam) แทนที่จะใช้การจัดกลุ่ม k-mean อันนี้แข็งแกร่งกว่าและสามารถให้ผลลัพธ์ที่ดีกว่า Van der Laan ได้ทำใหม่อัลกอริทึม หากคุณกำลังจะใช้มันด้วยตัวเองบทความของเขามีค่าอ่าน

มีอัลกอริทึมการจัดกลุ่ม k-medoids เฉพาะสำหรับชุดข้อมูลขนาดใหญ่ อัลกอริทึมเรียกว่า Clara ใน R และอธิบายไว้ในบทที่ 3 ของการ ค้นหากลุ่มในข้อมูล: คำแนะนำสำหรับการวิเคราะห์กลุ่ม โดย Kaufman, L และ Rousseeuw, PJ (1990)

การทำคลัสเตอร์แบบลำดับชั้น

แทนที่จะเป็น UPGMA คุณสามารถลองใช้ตัวเลือกการจัดกลุ่มแบบลำดับชั้นอื่น ๆ ได้ ก่อนอื่นเมื่อคุณใช้การทำคลัสเตอร์แบบลำดับชั้นต้องแน่ใจว่าคุณกำหนดวิธีการแบ่งพาร์ติชันอย่างถูกต้อง วิธีการแบ่งเป็นวิธีการคำนวณระยะห่างระหว่างการสังเกตและกลุ่ม ฉันส่วนใหญ่ใช้วิธีการของ Ward หรือการเชื่อมโยงที่สมบูรณ์ แต่ตัวเลือกอื่นอาจเป็นตัวเลือกสำหรับคุณ

ไม่ทราบว่าคุณลองหรือยัง แต่วิธีการเชื่อมโยงเดียวหรือการเข้าร่วมเพื่อนบ้านมักเป็นที่ต้องการเหนือ UPGMA ในแอปพลิเคชันสายวิวัฒนาการ หากคุณยังไม่ได้ลองคุณก็สามารถถ่ายภาพได้เช่นกันเพราะมักให้ผลลัพธ์ที่ดีอย่างน่าทึ่ง


ในการวิจัยคุณสามารถดูที่แพคเกจคลัสเตอร์ อัลกอริธึมที่อธิบายทั้งหมดถูกนำไปใช้ที่นั่น ดู "pam," clara, "hclust, ... ตรวจสอบการใช้อัลกอริทึมที่แตกต่างกันใน" kmeans บางครั้งการเลือกอัลกอริทึมอื่นสามารถปรับปรุงการจัดกลุ่มอย่างมาก


แก้ไข: แค่คิดเกี่ยวกับบางสิ่ง: ถ้าคุณทำงานกับกราฟและโหนดและสิ่งที่ชอบคุณควรดูอัลกอริทึมการจัดกลุ่มมาร์คอฟเช่นกัน ตัวอย่างนั้นถูกใช้ในการจัดกลุ่มลำดับตามความคล้ายคลึงกันของการระเบิดและทำงานได้ดีอย่างไม่น่าเชื่อ สามารถทำคลัสเตอร์ให้คุณหรือให้แนวคิดเกี่ยวกับวิธีการแก้ปัญหาการวิจัยที่คุณเน้น ในความเป็นจริงฉันไม่รู้ว่าผลลัพธ์ของเขาคุ้มค่าที่จะดู ถ้าฉันจะพูดแบบนั้นฉันยังคงพิจารณาวิธีการของ Stijn van Dongen หนึ่งในผลลัพธ์ที่ดีที่สุดในการจัดกลุ่มที่ฉันเคยพบมา

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


22

วิธีหนึ่งที่จะเน้นคลัสเตอร์บนเมทริกซ์ระยะทางของคุณจะโดยวิธีการของการปรับหลายมิติ เมื่อฉายภาพบุคคล (นี่คือสิ่งที่คุณเรียกว่าโหนดของคุณ) ในพื้นที่ 2 มิติมันให้โซลูชันที่เทียบเท่ากับ PCA สิ่งนี้ไม่ได้รับการดูแลดังนั้นคุณจะไม่สามารถระบุจำนวนคลัสเตอร์ได้ แต่ฉันคิดว่ามันอาจช่วยในการสรุประยะทางหรือเมทริกซ์ความคล้ายคลึงที่ให้ได้อย่างรวดเร็ว

นี่คือสิ่งที่คุณจะได้รับจากข้อมูลของคุณ:

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

ฉันได้เพิ่ม jittering เล็กน้อยบนพิกัด x และ y เพื่อให้สามารถแยกเคส แทนที่tmpด้วย1-tmpหากคุณต้องการทำงานกับความแตกต่าง แต่สิ่งนี้ให้ภาพที่เหมือนกัน อย่างไรก็ตามนี่คือวิธีการแก้ปัญหาการจัดกลุ่มแบบลำดับชั้นด้วยเกณฑ์การรวมตัวเดี่ยว :

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

HC

คุณอาจปรับแต่งการเลือกกลุ่มเพิ่มเติมตาม dendrogram หรือวิธีที่มีประสิทธิภาพยิ่งขึ้นดูคำถามที่เกี่ยวข้องเช่นนี้: เกณฑ์การหยุดสำหรับการจัดกลุ่มลำดับชั้นแบบ agglomerative ใช้ในทางปฏิบัติอย่างไร


2

K

L=D1/2AD1/2

ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

ด้วยเป็น eigendecomposition ของ , กับ eigenfunctions ซ้อนกันเป็นคอลัมน์, การรักษาเฉพาะeigenvectorใหญ่ที่สุดใน , เรากำหนดเมทริกซ์แถวมาตรฐานL K XXLKX

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

แต่ละแถวของคือจุดในและสามารถทำคลัสเตอร์ด้วยอัลกอริทึมการจัดกลุ่มแบบธรรมดา (เช่น K-mean)R kYRk

ดูคำตอบของฉันที่นี่เพื่อดูตัวอย่าง: https://stackoverflow.com/a/37933688/2874779


[1] Ng, AY, จอร์แดน, MI, & Weiss, Y. (2002) ในการจัดกลุ่มสเปกตรัม: การวิเคราะห์และอัลกอริทึม ความก้าวหน้าในระบบประมวลผลข้อมูลประสาท, 2, 849-856 Pg.2


2

สิ่งที่คุณกำลังทำคือพยายามจัดกลุ่มโหนดของกราฟหรือเครือข่ายเข้าด้วยกันซึ่งอยู่ใกล้กัน มีเขตข้อมูลทั้งหมดของการวิจัยที่ทุ่มเทให้กับปัญหานี้ซึ่งบางครั้งเรียกว่าการตรวจสอบของชุมชนในเครือข่าย การมองปัญหาของคุณจากมุมมองนี้อาจทำให้สิ่งต่าง ๆ ชัดเจนขึ้น

คุณจะพบอัลกอริธึมมากมายที่ทุ่มเทให้กับปัญหานี้และในความเป็นจริงบางอย่างนั้นขึ้นอยู่กับแนวคิดเดียวกับที่คุณมีซึ่งก็คือการวัดระยะทางระหว่างโหนดที่มีการเดินสุ่ม

ปัญหามักเกิดจากการเพิ่มประสิทธิภาพแบบแยกส่วน [1] โดยที่ความเป็นโมดูลของการจัดกลุ่มวัดว่าการจัดกลุ่มแยกเครือข่ายในคลัสเตอร์ที่เชื่อมต่อหนาแน่น (เช่นคลัสเตอร์ที่โหนดอยู่ใกล้กัน)

ที่จริงแล้วคุณสามารถแสดงให้เห็นว่าแบบจำลองนั้นมีค่าเท่ากับความน่าจะเป็นที่วอล์คเกอร์แบบสุ่มอยู่ในขั้นตอนเดียวในกลุ่มเดียวกันมากกว่าตอนแรกลบความน่าจะเป็นแบบเดียวกันสำหรับสองวอล์คเกอร์อิสระ [2]

หากคุณอนุญาตให้มีขั้นตอนเพิ่มเติมของการเดินแบบสุ่มคุณกำลังมองหาการรวมกลุ่มที่หยาบกว่าของเครือข่าย จำนวนขั้นตอนของการเดินแบบสุ่มเล่นดังนั้นบทบาทของพารามิเตอร์การแก้ปัญหาที่อนุญาตให้กู้คืนลำดับชั้นของกลุ่ม ในกรณีนี้ปริมาณที่แสดงออกถึงแนวโน้มของการเดินแบบสุ่มที่จะเข้าพักในคลัสเตอร์แรกของพวกเขาหลังจากที่เสื้อขั้นตอนที่เรียกว่าความมั่นคงของมาร์คอฟพาร์ทิชันที่เวลา t [2] และมันจะเทียบเท่ากับต้นแบบเมื่อt = 1

ดังนั้นคุณสามารถแก้ปัญหาของคุณโดยค้นหาการจัดกลุ่มของกราฟที่ปรับความเสถียรให้เหมาะสมที่สุดในเวลาที่กำหนดtโดยที่tคือพารามิเตอร์การแก้ปัญหา (ใหญ่กว่าtจะให้คลัสเตอร์ใหญ่ขึ้น) หนึ่งในวิธีที่ใช้มากที่สุดเพื่อเพิ่มเสถียรภาพ (หรือโมดูลที่มีความละเอียด) คือLouvain Algorithm [3] คุณสามารถค้นหาการดำเนินงานที่นี่: https://github.com/michaelschaub/generalizedLouvain

[1] Newman, MEJ & Girvan, M. การค้นหาและประเมินโครงสร้างชุมชนในเครือข่าย สรวง Rev. E 69, 026113 (2004)

[2] Delvenne, J.-C. , Yaliraki, SN & Barahona, M. เสถียรภาพของชุมชนกราฟในช่วงเวลา พร Natl Acad วิทย์ 107, 12755–12760 (2010)

[3] Blondel, VD, Guillaume, J.-L. , Lambiotte, R. & Lefebvre, E. การตีแผ่ชุมชนอย่างรวดเร็วในเครือข่ายขนาดใหญ่ J. สถิติ Mech ประสบการณ์ทฤษฎี 2008, P10008 (2008)


1

เป็นไปได้ที่จะทำการจัดกลุ่ม K- หมายถึงการจัดกลุ่มบนเมทริกซ์ความคล้ายคลึงกันที่กำหนดในตอนแรกคุณต้องจัดศูนย์กลางเมทริกซ์แล้วนำค่าลักษณะเฉพาะของเมทริกซ์ ขั้นตอนสุดท้ายและที่สำคัญที่สุดคือการคูณสองชุดแรกของ eigenvector ไปที่สแควร์รูทของเส้นทแยงมุมของค่าลักษณะเฉพาะเพื่อให้ได้เวกเตอร์แล้วเคลื่อนที่ต่อไปด้วยค่าเฉลี่ย K ด้านล่างรหัสแสดงวิธีการใช้งาน คุณสามารถเปลี่ยนเมทริกซ์ความคล้ายคลึงกัน fpdist เป็นเมทริกซ์ความคล้ายคลึงกัน

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

ก่อนที่คุณจะเรียกใช้การจัดกลุ่มบนเมทริกซ์คุณสามารถลองทำหนึ่งในเทคนิคการวิเคราะห์ปัจจัยและเก็บตัวแปรที่สำคัญที่สุดไว้เพื่อคำนวณเมทริกซ์ระยะทาง อีกสิ่งที่คุณสามารถทำได้คือลองใช้วิธีการฟัซซีซึ่งมีแนวโน้มที่จะทำงานได้ดีขึ้น (อย่างน้อยก็ในประสบการณ์ของฉัน) ในกรณีแบบนี้ลองใช้ Cmeans แรก F-K-medoids Fuzzy และ GKCmeans พิเศษ


0

การจัดกลุ่มเป็นคำตอบที่ฉันคิดว่า แต่ฉันไม่เชี่ยวชาญที่นี่ Co-clustring ไม่ใช่วิธีแรกเกิดดังนั้นคุณสามารถค้นหา algos ใน R ได้ wiki แสดงให้เห็นว่าแนวคิดในทางที่ดี อีกวิธีที่ไม่ใช่ menthioned คือการแบ่งกราฟ (แต่ฉันเห็นว่ากราฟจะไม่กระจายการแบ่งกราฟจะมีประโยชน์หากเมทริกซ์ของคุณจะถูกครอบงำด้วยค่าความหมาย = ระยะทางสูงสุด = ไม่มีความคล้ายคลึงกันระหว่างโหนด)


0

มองไปที่ AFFINITY PROPAGATION เทคนิคนี้ใช้ในการป้อนเมทริกซ์ความคล้ายคลึงกันและสร้างจำนวนที่เหมาะสมของกลุ่มพร้อมกับตัวอย่างตัวแทนสำหรับแต่ละคลัสเตอร์


2
คุณช่วยขยายและอธิบายว่าวิธีนี้ช่วยได้อย่างไรในกรณีนี้
Andy

0

ขั้นแรกให้แปลงเมทริกซ์ระยะทางเป็นเมทริกซ์พิกัดผ่านhttps://math.stackexchange.com/a/423898 จากนั้นคุณจะสามารถใช้อัลกอริทึมการจัดกลุ่มที่มีอยู่ได้อย่างง่ายดาย


0

นอกจากนี้คุณยังสามารถใช้อัลกอริทึม Kruskal สำหรับการค้นหาต้นไม้ที่ครอบคลุมน้อยที่สุด แต่จะสิ้นสุดทันทีที่คุณได้รับสามกลุ่ม ฉันลองด้วยวิธีนี้และสร้างกลุ่มที่คุณพูดถึง: {ABCD}, {EFGH} และ {IJKL}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.