Кластеризація за допомогою матриці відстаней


52

У мене є (симетрична) матриця, Mяка представляє відстань між кожною парою вузлів. Наприклад,

    ABCDEFGHIJKL
А 0 20 20 20 40 60 60 60 100 120 120 120
В 20 0 20 20 60 80 80 80 120 120 140 140 140
C 20 20 0 20 60 80 80 80 120 120 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 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 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

Чи є спосіб вилучення кластерів 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як середню відстань між nусіма вузлами в c.

Дуже дякую :)


1
Вам слід розглянути можливість додавання інформації, що ви вже пробували UPGMA (та інших, які ви, можливо, пробували) :)
Björn Pollex

1
У мене є питання. Чому ви сказали, що k-засоби спрацьовують погано? Я передав вашу Матрицю до k-засобів, і це зробило ідеальну кластеризацію. Ви не передали значення k (кількість кластерів) k-значень?

3
@ user12023 Я думаю, що ви неправильно зрозуміли питання. Матриця - це не ряд точок - це попарні відстані між ними. Ви не можете обчислити центроїд набору точок, якщо будете лише відстані між ними (а не їх фактичні координати), принаймні, не явно.
Stumpy Joe Pete

7
k-засоби не підтримують матриць відстані . Він ніколи не використовує відстань від точки до точки. Тож я можу лише припустити, що він, мабуть, переосмислив вашу матрицю як вектори , і побіг на цих векторах ... можливо, те ж саме сталося і з іншими алгоритмами, які ви намагалися: вони очікували необроблених даних , і ви пройшли матрицю відстані.
Аноні-Мус

Відповіді:


38

Існує ряд варіантів.

к-скупчення медоїдів

По-перше, ви можете спробувати розділити навколо медоїдів (пам), а не використовувати кластеризацію k-засобів. Цей більш надійний і може дати кращі результати. Ван дер Лаан переробив алгоритм. Якщо ви збираєтесь реалізувати це самостійно, його статтю варто прочитати.

Існує специфічний алгоритм кластеризації k-медоїдів для великих наборів даних. Алгоритм називається Клара в R і описаний у розділі 3 Пошук груп у даних: Вступ до кластерного аналізу. автор: Кауфман, L та Rousseeuw, PJ (1990).

ієрархічна кластеризація

Замість UPGMA ви можете спробувати деякі інші параметри ієрархічної кластеризації. Перш за все, коли ви використовуєте ієрархічну кластеризацію, не забудьте правильно визначити метод розподілу. Цей метод розподілу по суті полягає в тому, як обчислюються відстані між спостереженнями та кластерами. Я здебільшого використовую метод Уорда або повний зв'язок, але для вас можуть обратись інші варіанти.

Не знаєте, чи ви ще пробували, але метод єдиного зв’язку або приєднання сусіда часто віддають перевагу вище UPGMA у філогенетичних програмах. Якщо ви ще не пробували цього, ви можете також сфотографувати, оскільки це часто дає надзвичайно хороші результати.


У R ви можете подивитися на кластер пакетів . Усі описані алгоритми реалізовані там. Дивіться? Pam,? Clara,? Hclust, ... Перевірте також різну реалізацію алгоритму в? Kmeans. Іноді вибір іншого алгоритму може значно покращити кластеризацію.


EDIT: Подумайте лише про щось: Якщо ви працюєте з графіками та вузлами та подібними ознаками, слід також ознайомитися з алгоритмом кластеризації markov. Цей використовується, наприклад, для групування послідовностей, заснованих на вибухових подібностях, і працює надзвичайно добре. Це може зробити кластеризацію для вас або дати вам кілька ідей щодо вирішення дослідницької проблеми, на яку ви зосереджуєтесь. Не знаючи нічого про це насправді, я думаю, його результати, безумовно, варто переглянути. Якщо я можу так сказати, я все-таки вважаю цей метод Штійна ван Донгена одним із найкращих результатів у кластеризації, з якими я коли-небудь стикався.

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


22

Один із способів виділити кластери на вашій дистанційній матриці - шляхом багатовимірного масштабування . Під час проектування осіб (тут ви називаєте свої вузли) у 2D-просторі, він пропонує порівнянне рішення для 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")

мдс

Я додав невелике тремтіння на координатах x і y, щоб дозволити розрізняти випадки. Замініть tmp, 1-tmpякщо ви хочете працювати з різницями, але це дає по суті та ж картина. Однак ось рішення ієрархічної кластеризації з єдиними критеріями агломерації:

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

hc

Ви можете додатково уточнити вибір кластерів на основі дендрограми або більш надійних методів, див., Наприклад, це пов'язане питання: Які критерії зупинки для агломераційного ієрархічного кластеризації застосовуються на практиці?


2

Спектральна кластеризація [1] вимагає матриці спорідненості, кластеризація визначається першими власними функціями розкладанняK

L=D1/2AD1/2

Якщо є матрицею спорідненості даних, а - діагональною матрицею, визначеною як (редагувати: вибачте за неясність, але ви можете генерувати матрицю афінності з матриці відстані за умови, що ви знаєте максимально можливий / розумна відстань як , хоча існують і інші схеми)ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

Якщо являє собою eigendecomposition , з власними функціями, складеними як стовпці, зберігаючи лише найбільші власні вектори в , ми визначаємо нормовану матрицю рядківXLKX

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

Кожен рядок є точкою і може бути кластеризований за допомогою звичайного алгоритму кластеризації (наприклад, K-засоби).YRk

Подивіться мою відповідь тут, щоб побачити приклад: https://stackoverflow.com/a/37933688/2874779


[1] Ng, AY, Jordan, MI, & Weiss, Y. (2002). Про спектральну кластеризацію: аналіз та алгоритм. Успіхи в нейронних системах обробки інформації, 2, 849-856. Сг.2


2

Те, що ви робите, - намагаєтеся об'єднати між собою вузли графіка чи мережі, близькі один до одного. Існує ціла область досліджень, присвячена цій проблемі, яку іноді називають виявленням спільноти в мережах . Дивлячись на вашу проблему з цієї точки зору, можливо, можна прояснити речі.

Ви знайдете багато алгоритмів, присвячених цій проблемі, і фактично деякі з них базуються на тій самій ідеї, що і у вас, яка полягає в вимірюванні відстаней між вузлами випадковими прогулянками.

Проблема часто формулюється як оптимізація модульності [1], де модульність кластеризації визначає, наскільки добре кластеризація розділяє мережу в щільно пов'язаних кластерах (тобто кластери, де вузли близькі один одному).

Власне, ви можете показати, що модульність дорівнює ймовірності того, що випадковий ходок залишається після одного кроку в тих же кластерах, ніж спочатку мінус однакова ймовірність для двох незалежних випадкових ходунків [2].

Якщо ви дозволите більше кроків випадкових ходунків, ви шукаєте більш грусте кластеризація мережі. Отже, кількість кроків випадкової прогулянки грає роль параметра роздільної здатності, який дозволяє відновити ієрархію кластерів. У цьому випадку величина, що виражає схильність випадкових ходунків залишатися у своєму початковому кластері після t кроків, називається марковською стійкістю перегородки в момент t [2] і вона еквівалентна модульності, коли t = 1 .

Таким чином, ви можете вирішити свою проблему, знайшовши кластеризацію вашого графіка, яка оптимізує стабільність в даний момент часу t , де t - параметр роздільної здатності (більший t дасть вам більший кластер). Одним з найбільш використовуваних методів оптимізації стійкості (або модульності з параметром роздільної здатності) є алгоритм Лувена [3]. Ви можете знайти реалізацію тут: https://github.com/michaelschaub/generalizedLouvain .

[1] Ньюмен, MEJ та Гірван, М. Пошук та оцінка структури спільноти в мережах. Фіз. Випуск E 69, 026113 (2004).

[2] Delvenne, J.-C., Yaliraki, SN & Barahona, M. Стабільність графських спільнот за масштабами часу. Зб. Natl. Акад. Наук. 107, 12755–12760 (2010).

[3] Блондель, В. Д., Гійом, Дж. Л., Ламбіоти, Р. і Лефевр, Е. Швидке розгортання громад у великих мережах. Дж. Стат. Мех. Теорія 2008, P10008 (2008).


1

Що ж, можна виконати кластеризацію K-засобів на заданій матриці подібності, спочатку потрібно відцентрувати матрицю, а потім взяти власні значення матриці. Останній і найважливіший крок - множення перших двох наборів власних векторів на квадратний корінь діагоналей власних значень, щоб отримати вектори, а потім рухатися далі за допомогою 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, Fuzzy K-медоїди та спеціально GKCmeans.


0

Спільне кластеризація - одна з моїх відповідей. Але я тут не експерт. Ко-кластування не є новонародженим методом, тому ви можете знайти кілька альгів у R, wiki показує, що поняття хороші. Інший метод, який не застосовується, - це розподіл графів (але я бачу, що графік не буде рідким, розділення графіків було б корисним, якщо у вашій матриці будуть домінувати значення, що означають = максимальна відстань = немає подібності між вузлами).


0

Подивіться на ПРОФЕСІЙНІСТЬ АФФІНІТНОСТІ. Ця методика приймає матрицю подібності та створює оптимальне число кластерів разом з репрезентативним прикладом для кожного кластеру.


2
Чи можете ви розширити це і пояснити, як цей метод допомагає в цьому випадку?
Енді

0

Спочатку перетворіть матрицю відстані в матрицю координат через https://math.stackexchange.com/a/423898, тоді ви зможете легко ефективно використовувати будь-який існуючий алгоритм кластеризації.


0

Ви також можете скористатися алгоритмом Kruskal для пошуку мінімальних осередків дерев, але закінчуючи, як тільки ви отримаєте три кластери. Я спробував цей спосіб, і він створює кластери, про які ви згадали: {ABCD}, {EFGH} і {IJKL}.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.