Разделение кластеров после использования SLINK в Python / R - PullRequest
1 голос
/ 01 февраля 2020

По результатам исследований, только иерархическая кластеризация с одним звеном может получить оптимальные кластеры. Это также известно как SLINK. Библиотеки изначально опубликованы на C ++, а теперь на Python / R.

До сих пор, следуя инструкциям в документации, мне удалось придумать:

import pandas as pd
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist

## generating random numbers from 20 to 90, and storing them in a dataframe. This is a 1-dimensional data
np.random.seed(1)
df = pd.DataFrame(np.random.randint(20,90,size=(100,1)), columns = list('A'))
df = df.sort_values(by=['A'])
df = df.values
df[:,0].sort()

## getting condensed distance matrix
d = pdist(df_final, metric='euclidean')

## running the SLINK algorithm
Z = linkage(d, 'single')

Я понимаю, что Z - это «иерархическая кластеризация, закодированная как матрица связи» (как написано в документации), но мне интересно, как мне go вернуться к исходному набору данных и отличить guish кластер, рассчитанный по этому результату ?

Я мог бы достичь результата кластеризации с помощью кластеризации Scikit-Learn, но я думаю, что алгоритмы кластеризации Scikit-Learn не оптимальны, и поэтому я обратился к этому алгоритму SLINK. Буду очень признателен, если кто-нибудь сможет мне помочь с этим.

1 Ответ

1 голос
/ 02 февраля 2020

С scipy.cluster.hierarchy.linkage вы получаете информацию о том, как кластеры формируются при каждой итерации.

Обычно эта информация не так полезна, поэтому сначала мы рассмотрим кластеризацию:

import scipy as scipy
import matplotlib.pyplot as plt
plt.figure()
dn =scipy.cluster.hierarchy.dendrogram(Z)

enter image description here

Если мы хотим получить три кластера, мы можем сделать:

labels = scipy.cluster.hierarchy.fcluster(Z,3,'maxclust')

Если вы хотите получить его по расстоянию между точками данных:

scipy.cluster.hierarchy.fcluster(Z,2,'distance')

Это дает примерно тот же результат, что и вызов 3-х кластеров, потому что это не так много способов вырезать этот пример набора данных.

Если вы посмотрите пример, который у вас есть, следующий момент вы можете срез это на высоте ~ 1,5, что составляет 16 кластеров. Поэтому, если вы попытаетесь сделать scipy.cluster.hierarchy.fcluster (Z, 5, 'maxclust'), вы получите те же результаты, что и для 3 кластеров. Если у вас есть более распространенный набор данных, он будет работать:

np.random.seed(111)
df = np.random.normal(0,1,(50,3))

## getting condensed distance matrix
d = pdist(df, metric='euclidean')
Z = linkage(d, 'single')
dn = scipy.cluster.hierarchy.dendrogram(Z,above_threshold_color='black',color_threshold=1.1)

enter image description here

Тогда это работает:

scipy.cluster.hierarchy.fcluster(Z,5,'maxclust')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...