改进此问题我试图理解如何操作层次集群,但是文档太。。。技术?。。。我不明白它是怎么工作的。有什么教程可以帮助我开始,一步一步地解释 一些简单的任务? 假设我有以下数据集:
a = np.array([[0, 0 ], [1, 0 ], [0, 1 ], [1, 1 ], [0.5, 0 ], [0, 0.5], [0.5, 0.5], [2, 2 ], [2, 3 ], [3, 2 ], [3, 3 ]])
我可以很容易地进行层次聚类并绘制树状图:
z = linkage(a) d = dendrogram(z)
现在,如何恢复特定群集?假设在树状图中有元素“[0,1,2,4,5,6]”的那个? 我怎样才能得到这些元素的值呢?
分层凝聚聚类(HAC)有三个步骤:
metric
method
Doing
z = linkage(a)
将完成前两步。因为您没有指定任何参数 它使用标准值
metric = 'euclidean'
method = 'single'
“将给你一个粘合的链接” “a”的聚类。这种聚类是解决方案的一种层次结构。从 通过这种层次结构,您可以获得有关数据结构的一些信息。什么 您现在可以做的是: 检查哪个“metric”是合适的,例如“cityblock”或“chebychev”将不同地量化数据(“cityblock”、“euclidean”和“chebychev”对应于“L1”、“L2”和“L\u inf”norm) 检查“methdos”的不同属性/行为(例如“single”、“complete”和“average”) 检查如何确定集群的数量,例如通过阅读wiki上的相关内容 计算找到的解(聚类)的指数,例如轮廓系数(通过该系数,您可以获得关于点/观测值与聚类所指定的聚类的匹配程度的反馈)。不同的索引使用不同的标准来限定聚类。 这是一个开始
import numpy as np import scipy.cluster.hierarchy as hac import matplotlib.pyplot as plt a = np.array([[0.1, 2.5], [1.5, .4 ], [0.3, 1 ], [1 , .8 ], [0.5, 0 ], [0 , 0.5], [0.5, 0.5], [2.7, 2 ], [2.2, 3.1], [3 , 2 ], [3.2, 1.3]]) fig, axes23 = plt.subplots(2, 3) for method, axes in zip(['single', 'complete'], axes23): z = hac.linkage(a, method=method) # Plotting axes[0].plot(range(1, len(z)+1), z[::-1, 2]) knee = np.diff(z[::-1, 2], 2) axes[0].plot(range(2, len(z)), knee) num_clust1 = knee.argmax() + 2 knee[knee.argmax()] = 0 num_clust2 = knee.argmax() + 2 axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], 'possible\n<- knee point') part1 = hac.fcluster(z, num_clust1, 'maxclust') part2 = hac.fcluster(z, num_clust2, 'maxclust') clr = ['#2200CC' ,'#D9007E' ,'#FF6600' ,'#FFCC00' ,'#ACE600' ,'#0099CC' , '#8900CC' ,'#FF0000' ,'#FF9900' ,'#FFFF00' ,'#00CC01' ,'#0055CC'] for part, ax in zip([part1, part2], axes[1:]): for cluster in set(part): ax.scatter(a[part == cluster, 0], a[part == cluster, 1], color=clr[cluster]) m = '\n(method: {})'.format(method) plt.setp(axes[0], title='Screeplot{}'.format(m), xlabel='partition', ylabel='{}\ncluster distance'.format(m)) plt.setp(axes[1], title='{} Clusters'.format(num_clust1)) plt.setp(axes[2], title='{} Clusters'.format(num_clust2)) plt.tight_layout() plt.show()