С 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](https://i.stack.imgur.com/YB5oI.png)
Если мы хотим получить три кластера, мы можем сделать:
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](https://i.stack.imgur.com/pCgGp.png)
Тогда это работает:
scipy.cluster.hierarchy.fcluster(Z,5,'maxclust')