4

В статье в Википедии на determining the number of clusters in a dataset указано, что мне не нужно беспокоиться о такой проблеме при использовании иерархической кластеризации. Однако, когда я пытался использовать scikit-learn agglomerative clustering, я вижу, что мне приходится кормить его количеством кластеров в качестве параметра «n_clusters», без которого я получаю жестко установленный по умолчанию два кластера. Как я могу выбрать подходящее количество кластеров для набора данных в этом случае? Является ли статья wiki неправильной?Выбор количества кластеров в иерархической агломерационной кластеризации с помощью scikit

+0

Хороший вопрос. Когда у меня была аналогичная проблема, я закончил использование scipy подпрограмм для иерархической кластеризации, визуализации дерева и затем «вручную» (после просмотра дерева), установив порог разреза. – lanenok

+0

, похоже, относится к https://github.com/scikit-learn/scikit-learn/issues/3796 – yangjie

ответ

3

Википедия просто делает крайнее упрощение, которое не имеет ничего общего с реальной жизнью. Иерархическая кластеризация не позволяет избежать проблемы с числом кластеров. Просто - он строит дерево, охватывающее более все образцы, в котором показано, какие образцы (далее - кластеры) сливаются вместе, чтобы создать более крупный кластер. Это происходит рекурсивно, пока у вас не будет только двух кластеров (поэтому число кластеров по умолчанию равно 2), которые объединены со всем набором данных. Вы остаетесь наедине с «разрезанием» по дереву, чтобы получить фактическую кластеризацию. После того, как вы подходите AgglomerativeClustering вы можете пройти все дерево и проанализировать, какие кластеры держать

import numpy as np 
from sklearn.cluster import AgglomerativeClustering 
import itertools 

X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100]) 
clustering = AgglomerativeClustering() 
clustering.fit(X) 

[{'node_id': next(itertools.count(X.shape[0])), 'left': x[0], 'right':x[1]} for x in clustering.children_] 
0

ELKI (не scikit учиться, но Java) имеет целый ряд передовых методов, которые извлекают кластеры из иерархической кластеризации. Они умнее, чем просто резать дерево на определенной высоте, но они могут создать иерархию кластеров минимального размера, например.

Вы можете проверить, работают ли эти методы для вас.