Підхід та приклад кластеризації графіків у “R”


10

Я шукаю згрупувати / об’єднати вузли в графі, використовуючи кластеризацію граф у 'r'.

Ось надзвичайно іграшка варіація моєї проблеми.

  • Є два "кластери"
  • Існує "міст", що з'єднує кластери

Ось кандидатська мережа:
введіть тут опис зображення

Коли я дивлюсь на відстань з'єднання, "рахунок", якщо ви хочете, то я можу отримати таку матрицю:

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

Думки тут:

  • На щастя або через простоту іграшки, матриця має очевидні патчі, це не відбудеться в (дуже великій) матриці. Якби я рандомізував співвідношення між точкою та рядком, то це було б не так чисто.
  • Можливо, я помилився - тож якщо я маю помилковий друк, дайте мені знати.
  • Счет хмелю тут - найменша кількість стрибків для з'єднання точки рядка i з точкою на колонці j. Самогуб - це все-таки хоп, тому діагональ - це всі.

Тож у цій матриці більша відстань (хмелі) має більшу кількість. Якби я хотів, щоб матриця, що демонструє "підключення" замість відстані, я могла б зробити точку-зворотну, де кожна комірка матриці замінюється своєю мультиплікативною оберненою.

Запитання:

Щоб допомогти мені знайти власний шлях:

  • Які умови зменшення кількості вузлів на графіку шляхом їх поєднання? Це кластеризація, злиття, зміна - які слова я повинен використовувати?
  • Які є перевірені методи? Чи є підручник з цієї теми? Чи можете ви вказати на статті чи веб-сайти?
  • Зараз я спробував заглянути сюди спочатку - це чудове місце "першої перевірки". Я не знайшов того, що шукав. Якщо я пропустив це (не навряд чи), чи можете ви вказати мені відповідь на запитання чи два на цю тему в CV?

Щоб відвести мене куди я йду:

  • Чи є пакет "R", який правильно кластеризує вузли в мережі?
  • Не могли б ви вказати мені на приклад коду для цього?
  • Чи є пакет "R", який буде графічно представляти отриману скорочену мережу?
  • Не могли б ви вказати мені на приклад коду для цього?

Заздалегідь спасибі.


2
Будь ласка, майте на увазі, що запит на (R) пакунки або код тут поза темою. Можливо, ви хочете зробити "знайти" частину більш помітною, а "отримати" частину менше.
gung - Відновіть Моніку

3
Я спробую зробити повну відповідь колись, коли отримаю шанс @gung. Але для швидкої відповіді тут є виявлення спільноти, застосоване до прикладу графа EngrStudent за допомогою igraphпакету R.
Енді Ш

1
IMHO У цьому графіку є лише один кластер. Однак є три кліки, що перетинаються . Я не знаю, чому ви плануєте знищити середню кліку - якщо ви не зможете це формалізувати, вам буде важко знайти алгоритм.
Мав QUIT - Anonymous-Mousse

2
Щодо того, що варто, mcl ( micans.org/mcl ) знаходить два кластери (я не дуже згоден з оцінкою Аноні-Мусса, і я не вважаю підхід моделювання кликів до кластеризації графіків особливо плідним). Це з його єдиним параметром (контролюючи деталізацію), встановленим за замовчуванням. Цей алгоритм (mcl - я його опублікував) використовується досить широко в біоінформатиці, і доступний (високо масштабований) вихідний код. Взаємодія з R легко здійснити за допомогою текстових інтерфейсів.
мікан

2
Прохання про код і пакети тут по суті завжди було поза темою. Прохання про допомогу з наявним кодом (тобто у вас є відтворюваний приклад ) є темою на темі переповнення стека . Якщо ви цього не знали, саме час це навчитися. Думка, що користувачі, які відповідають на запитання R на запитання SO, не мають статистичної експертизи, для мене дивна, але, здається, багато людей вважають, що це; у будь-якому випадку це неправда. Про те, що на ваш Q відповідь поставив відповідь, слід щось тут сказати. OTOH, кажучи, «що це за аналіз, чи може хтось вказати мені на ресурси», тут, безумовно, є темою.
gung - Відновіть Моніку

Відповіді:


9

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

Ось приклад виявлення спільноти в R за допомогою igraphпакета та алгоритму, описаних у Clauset et al. (2004) . Щоб використовувати цей алгоритм, я перетворюю ваш "кількість переходів" у матрицю бінарної суміжності без самостійних циклів. Алгоритм потребує непрямої матриці, яка відповідає вашій ручній діаграмі та наданим вами даним (краї симетричні).

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

введіть тут опис зображення

Я не можу коментувати доцільність згортання таких вузлів для подальшого аналізу, але таке виявлення спільноти, безумовно, корисне для дослідження мережі. Також існує безліч інших алгоритмів виявлення спільноти (а також інших бібліотек для мережевого аналізу в R). Це лише один приклад, який дає змогу отримати бажаний результат для цієї іграшкової проблеми.


1
З огляду на попередні коментарі щодо використання бази даних графіків, вам не потрібно, щоб графік був представлений як матриця суміжності. Таблиця для вузлів і рядок для кожного краю є більш типовим / ефективним форматом, і ви можете перетворити це в igraphмережу.
Енді Ш

1

Якщо ви вже не ввійшли в сховище для вашого вузла та даних про з'єднання, ви можете подивитися на пакет Rneo4j. Але це означає використання neo4j (графічної бази даних, а не RDBMS) для зберігання ваших даних. Я тут не експерт, але я думаю, що цей підхід може бути особливо ефективним, якщо: а) як це запропонував Аноні-Мус, ви не можете цього формалізувати, або б) кількість вузлів і з'єднань особливо велике, або c) ви запускаєте виникнення додаткових запитань щодо вашої мережі.


Я не знав, що таке існує. Акуратно! Це гідний приклад матеріалу? nicolewhite.github.io/RNeo4j/examples
EngrStudent

Як би перейти від даних в neo4j до кластеризації графіків? Чи будуть mcl або igraph працювати з ним?
EngrStudent

2
Після того, як ви перетягнули свої дані з neo4j в R, ви можете використовувати будь-який інший пакет R (наприклад, AndyW пропонує igraph) проти цих даних. Як альтернатива - пакет Rneo4j включає команди для отримання даних, а також дозволяє запустити мову запитів Cypher (аналогічно SQL, але створений на замовлення для нео4j-графіку db). У Cypher ви можете робити складні запити та запускати деякі заздалегідь задані алгоритми (найкоротші шляхи, всі шляхи, всі прості шляхи, Дійкстра тощо). Я тут на своєму обмеженні як у персонажах, так і в змісті - Якщо ви хочете піти цим шляхом (вибачте!), Наступною зупинкою може стати наступний сайт neo4j.
користувач3123116

1

Для майбутніх читачів,

Ось набір функцій із пакетів igraph, а останній - від MCL:

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

Ви можете знайти документацію тут http://igraph.org/r/doc/ і тут https://cran.r-project.org/web/packages/MCL/MCL.pdf

Я вважаю прогулянку особливо корисною


Хоча це може бути пов'язано з питанням, це, здається, не є відповіддю.
Майкл Р. Черник

2
я відповів на два запитання: Чи є пакет "R", який належним чином кластеризує вузли в мережі? Не могли б ви вказати мені на приклад коду для цього? Але так, це не дає відповіді на весь набір питань.
Омар Джаафор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.