Ось короткий підсумок про алгоритми виявлення спільноти, які зараз реалізовані в igraph:
edge.betweenness.community
- це ієрархічний процес декомпозиції, при якому ребра видаляються в порядку зменшення оцінок між ребрами (тобто кількість найкоротших шляхів, які проходять через дане ребро). Це мотивовано тим, що ребра, що з'єднують різні групи, з більшою ймовірністю містяться в декількох найкоротших шляхах просто тому, що в багатьох випадках вони є єдиним варіантом переходу від однієї групи до іншої. Цей метод дає хороші результати, але є дуже повільним через обчислювальну складність обчислень ребра між ребрами і тому, що бали між ними потрібно перераховувати після кожного видалення ребра. Ваші графіки з ~ 700 вершин та ~ 3500 ребер знаходяться навколо верхньої межі розміру графіків, які можливо проаналізувати за допомогою цього підходу. Ще одним недоліком є те, щоedge.betweenness.community
будує повну дендрограму і не дає вам жодних вказівок щодо того, де вирізати дендрограму, щоб отримати остаточні групи, тому вам доведеться використовувати інший захід, щоб це вирішити (наприклад, оцінка модульності розділів на кожному рівні дендрограма).
fastgreedy.community
є іншим ієрархічним підходом, але це знизу вгору, а не зверху вниз. Він намагається оптимізувати функцію якості, яка називається модульністю, у жадібний спосіб. Спочатку кожна вершина належить окремому співтовариству, і спільноти об'єднуються ітеративно таким чином, що кожне злиття є локально оптимальним (тобто дає найбільше збільшення поточного значення модульності). Алгоритм зупиняється, коли більше неможливо збільшити модульність, тому він дає вам групування, а також дендрограму. Метод є швидким, і саме цей метод, як правило, пробують як перше наближення, оскільки він не має параметрів для налаштування. Однак, як відомо, страждає обмеження роздільної здатності, тобто спільноти нижче заданого порогу розміру (залежно від кількості вузлів і країв, якщо я добре пам’ятаю) завжди будуть об’єднані з сусідніми громадами.
walktrap.community
- це підхід, заснований на випадкових прогулянках. Загальна ідея полягає в тому, що якщо ви виконуєте випадкові прогулянки по графіку, тоді прогулянки, швидше за все, залишатимуться в межах однієї спільноти, оскільки є лише кілька країв, які ведуть за межі даної спільноти. Walktrap виконує короткі випадкові прогулянки з 3-4-5 кроків (залежно від одного з його параметрів) і використовує результати цих випадкових прогулянок для об'єднання окремих спільнот способом знизу вгору, як fastgreedy.community
. Знову ж таки, ви можете використовувати оцінку модульності, щоб вибрати, де вирізати дендрограму. Це трохи повільніше, ніж швидкий жадібний підхід, але також і трохи точніший (згідно з оригінальною публікацією).
spinglass.community
- це підхід із статистичної фізики, заснований на так званій моделі Поттса. У цій моделі кожна частинка (тобто вершина) може перебувати в одному із c спінових станів, а взаємодії між частинками (тобто ребра графіка) визначають, які пари вершин вважають за краще залишатися в одному і тому ж спіновому стані, а які воліють мати різні стани спіна. Потім модель моделюється для заданої кількості кроків, а спінові стани частинок в кінці визначають спільноти. Наслідки наступні: 1) Зрештою ніколи не буде більше c спільнот, хоча ви можете встановити c на 200, що, ймовірно, буде достатнім для ваших цілей. 2) Може бути менше сврешті-решт, оскільки деякі стани спіну можуть порожніти. 3) Не гарантується, що вузли в повністю віддалених (або відключених) частинах мереж мають різні стани віджиму. Це, швидше за все, буде проблемою лише для відключених графіків, тому я б не хвилювався з цього приводу. Метод не є особливо швидким і не детермінованим (через саме моделювання), але має регульований параметр роздільної здатності, який визначає розміри кластера. Варіант методу singlass також може враховувати негативні посилання (тобто посилання, кінцеві точки яких воліють знаходитися в різних спільнотах).
leading.eigenvector.community
є ієрархічним підходом зверху вниз, який знову оптимізує функцію модульності. На кожному кроці графік розбивається на дві частини таким чином, що саме поділ дає значне збільшення модульності. Розбиття визначається шляхом оцінки ведучого власного вектора так званої матриці модулярності, а також існує умова зупинки, яка заважає подальшому розщепленню тісно пов'язаних груп. Через задіяні розрахунки власних векторів він може не працювати на вироджених графіках, де вирішувач власних векторів ARPACK нестабільний. На нероджених графіках це, швидше за все, дасть вищий показник модульності, ніж швидкий жадібний метод, хоча він трохи повільніший.
label.propagation.community
- це простий підхід, при якому кожному вузлу присвоюється одна з k міток. Потім метод продовжується ітеративно і повторно призначає мітки вузлам таким чином, що кожен вузол синхронно приймає найчастіші мітки своїх сусідів. Метод зупиняється, коли мітка кожного вузла є однією з найпоширеніших міток у його сусідстві. Це дуже швидко, але дає різні результати на основі початкової конфігурації (яка вирішується випадковим чином), тому слід запускати метод велику кількість разів (скажімо, 1000 разів для графіка), а потім побудувати консенсусне маркування, яке може бути нудний.
igraph 0.6 також включатиме найсучасніший алгоритм виявлення спільноти Infomap, який базується на теоретичних принципах інформації; він намагається побудувати групування, яке забезпечує найкоротшу довжину опису для випадкової прогулянки на графіку, де довжина опису вимірюється очікуваною кількістю бітів на вершину, необхідну для кодування шляху випадкової прогулянки.
У всякому разі, я б , ймовірно , піти з fastgreedy.community
або walktrap.community
в першому наближенні , а потім оцінити інші методи , коли з'ясовується, що ці два не підходять для конкретного завдання з якої - то причини.