Де вирізати дендрограму?


60

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


Я також цікавився цією проблемою, але (на жаль) ще не знайшов жодної переконливої ​​відповіді. Я думаю, що рішення немає. Існують такі пакети R / BioC hopack(та інші), які можуть оцінити кількість кластерів, але це не відповідає на ваше запитання.
suncoolsu

У pvclustпакеті Rє функції, які дають завантажене p-значення для кластерів дендрограми, що дозволяє ідентифікувати групи: is.titech.ac.jp/~shimo/prog/pvclust
Ben

Відповіді:


45

Однозначної відповіді немає, оскільки кластерний аналіз, по суті, є дослідницьким підходом; інтерпретація отриманої ієрархічної структури залежить від контексту і часто кілька рішень однаково хороші з теоретичної точки зору.

У відповідному запитанні було дано декілька підказок: Які критерії зупинки агломераційної ієрархічної кластеризації використовуються на практиці? Я, як правило, використовую візуальні критерії, наприклад, силуетні графіки та деякі чисельні критерії, такі як індекс дійсності Данна, гамма Губерта, коефіцієнт G2 / G3 або скорегований індекс Ранда. В основному ми хочемо знати, наскільки добре оригінальна матриця відстані наближена в просторі кластера, тому міра кофенетичної кореляції також корисна. Я також використовую k-засоби з декількома початковими значеннями та статистикою розриву ( дзеркало ) для визначення кількості кластерів, що мінімізують всередині SS. Відповідність ієрархічної кластеризації Ward дає уявлення про стабільність кластерного рішення (Можна використовуватиmatchClasses()в пакеті e1071 для цього).

У кластері перегляду завдань CRAN ви знайдете корисні ресурси , зокрема pvclust , fpc , clv . Також варто спробувати пакет clValid ( описаний у Журналі статистичного програмного забезпечення ).

Тепер, якщо ваші кластери з часом змінюються, це трохи складніше; чому вибирати перший кластер-рішення, а не інший? Чи очікуєте ви, що деякі люди переходять з одного кластеру в інший в результаті базового процесу, що розвивається з часом?

Є деякі заходи, які намагаються відповідати кластерам, які мають максимальне абсолютне або відносне перекриття, як вам було запропоновано у попередньому запитанні. Подивіться на порівняння кластерів - огляд Вагнера та Вагнера.


12

Відповіді насправді немає. Це десь між 1 і N.

Однак ви можете думати про це з точки зору прибутку.

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

Повідомлення (реклама або лист, скажімо), що розроблено для кожної людини, матиме найвищу швидкість відповіді. Загальне повідомлення з урахуванням середнього значення матиме найнижчу швидкість відповіді. Скажімо, три повідомлення, пристосовані до трьох сегментів, будуть десь посередині. Це сторона доходу.

Повідомлення, пристосоване до кожної людини, матиме найвищу вартість. Загальне повідомлення з урахуванням середнього значення матиме найменші витрати. Три повідомлення, пристосовані до трьох сегментів, будуть десь посередині.

Скажімо, оплата автору написання користувальницького повідомлення коштує 1000, два коштує 2000 і так далі.

Скажімо, використовуючи одне повідомлення, ваш дохід становитиме 5000. Якщо ви сегментували своїх клієнтів на 2 сегменти та писали спеціально розроблені повідомлення до кожного сегменту, швидкість відповіді буде вище. Скажімо, зараз дохід становить 7500. З трьома сегментами дещо вищий рівень відповідей, а ваші доходи - 9000. Ще один сегмент, і ви на 9500.

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

Segments  Revenue  Cost  Profit
1         5000     1000  4000
2         7500     2000  5500
3         9000     3000  6000
4         9500     4000  5500

Це цікава перспектива!
AndyF

5

Можливо, одним із найпростіших методів було б графічне зображення, у якому вісь x - це кількість груп, а вісь y - будь-яка метрика оцінки як відстань чи подібність. На цій ділянці зазвичай можна спостерігати дві диференційовані області, будучи значенням осі x у «коліні» лінії «оптимальним» числом кластера.

Також є деякі статистичні дані, які можуть допомогти виконувати це завдання: гамма Губерта, псевдо-t², псевдо-F або критерії кубічної кластеризації (CCC) серед інших.


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


3

В ієрархічній кластеризації кількість вихідних розділів - це не тільки горизонтальні надрізи, але й не горизонтальні надрізи, що визначають остаточну кластеризацію. Таким чином, це можна розглядати як третій критерій, окрім метрики 1. відстань та критерій 2. Зв'язок . http://en.wikipedia.org/wiki/Hierarchical_clustering

Критерій, який ви згадали, - це 3-й вид, який є своєрідним обмеженням оптимізації для набору розділів в ієрархії. Це формально представлено у цій роботі та наведено приклади сегментації!

http://www.esiee.fr/~kiranr/ClimbingECCV2012_Preprint.pdf


1

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

# Init
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()

# Load data
from sklearn.datasets import load_diabetes

# Clustering
from scipy.cluster.hierarchy import dendrogram, fcluster, leaves_list
from scipy.spatial import distance
from fastcluster import linkage # You can use SciPy one too

%matplotlib inline

# Dataset
A_data = load_diabetes().data
DF_diabetes = pd.DataFrame(A_data, columns = ["attr_%d" % j for j in range(A_data.shape[1])])

# Absolute value of correlation matrix, then subtract from 1 for disimilarity
DF_dism = 1 - np.abs(DF_diabetes.corr())

# Compute average linkage
A_dist = distance.squareform(DF_dism.as_matrix())
Z = linkage(A_dist,method="average")

# Dendrogram
D = dendrogram(Z=Z, labels=DF_dism.index, color_threshold=0.7, leaf_font_size=12, leaf_rotation=45)

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

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