层次聚类算法 Python!

源节点: 1055669

这篇文章是作为 数据科学博客马拉松

介绍

在本文中,我们将介绍一种不同的 K 均值聚类方法,称为层次聚类。 与 K 均值或 K 模式相比,层次聚类对于聚类机制的工作方式具有不同的底层算法。 层次聚类使用凝聚或分裂技术,而 K 均值使用质心和欧几里德距离的组合来形成聚类。 树状图可用于可视化层次聚类中的聚类,这有助于通过有意义的分类法更好地解释结果。 在制作树状图时,我们不必指定簇的数量。

这里我们使用 Python 来解释 Hierarchical Clustering Model。 我们的数据集中有 200 个商场客户的数据。 每个客户的 customerID、类型、年龄、年收入和支出分数都包含在数据框中。 每个客户的消费分数计算的金额基于几个标准,例如他们的收入、他们每周访问商场的次数以及他们一年中花费的金额。 这个分数范围从 1 到 100。因为我们不知道答案,所以业务问题变成了集群问题。 我们不知道数据的最终类别。 因此,我们的目标是发现一些以前未知的客户群。

但首先,我们研究层次聚类中的一些重要术语。

层次聚类中的重要术语

联动方法

如果有 (a) 原始观测 a[0],…,a[|a|1] 在集群 (a) 和 (b) 原始对象 b[0],…,b[|b|1] 在集群 ( b),那么我们必须计算两个簇 (a) 和 (b) 之间的距离,以便将它们组合起来 (b)。 假设有一个点 (d) 尚未分配给任何集群。 我们需要弄清楚集群 (a) 与集群 (d) 的距离以及集群 (b) 与集群 (d) 的距离。

聚类现在通常包含多个点,因此需要使用不同的方法来计算距离矩阵。 计算簇之间的距离或点到簇的距离的方法是由链接决定的。 以下是一些最常用的联动机制:

单联动 — 为每对聚类计算最相似成员之间的距离,然后根据最短距离合并聚类。

平均联动 — 计算一个集群的所有成员与另一集群的所有成员之间的距离。 之后,这些距离的平均值用于确定哪些集群将合并。

完全联动 — 对于每对聚类,计算最不相似成员之间的距离,然后根据最短距离合并聚类。

中位联动 — 我们使用中值距离而不是平均距离,其方式与平均链接类似。

病房联动 — 使用方差分析方法确定聚类之间的距离。

质心连杆 — 每个聚类的质心是通过对分配给聚类的所有点进行平均来计算的,然后使用该质心计算聚类之间的距离。

距离计算

存在多种计算两个或多个集群之间距离的方法,其中欧几里得距离是最流行的。 其他距离度量,例如 Minkowski、City Block、Hamming、Jaccard 和 Chebyshev,也可以与层次聚类一起使用。 不同的距离度量对层次聚类有影响,如图 2 所示。

距离计算

树状图

特征空间中对象之间的关系由树状图表示。 在特征空间中,它用于显示每对顺序合并的对象之间的距离。 在决定数据集的适当数量的集群之前,树状图经常用于检查层次集群。 树状图距离是两个簇组合时的距离。 树状图距离决定了两个或多个簇是不相交的还是可以连接在一起形成一个簇。

例如:

现在我们研究使用 Python 来演示层次聚类模型的示例。 我们有 200 个商场客户的数据 数据集. 每个客户的 customerID、类型、年龄、年收入和支出分数都包含在数据框中。 每个客户的消费分数计算的金额基于几个标准,例如他们的收入、他们每周访问商场的次数以及他们一年花费的钱。 这个分数范围从 1 到 100。因为我们不知道答案,所以业务问题变成了集群问题。

#1 导入库
将 numpy 作为 np 导入 matplotlib.pyplot 作为 plt 将 pandas 作为 pd 导入
#2 通过 pandas 导入 Mall_Customers 数据集
dataset = pd.read_csv('Mall_Customers.csv') X = dataset.iloc[:, [3,4]].values

层次聚类的这一新步骤还需要确定最佳聚类数。 这次我们不打算使用肘部方法。 我们将使用树状图。

#3 使用树状图找到最佳聚类数。 # 我们要做的第一件事是导入 scipy 库。 scipy 是一个开源的# Python 库,其中包含进行层次聚类和构建树状图的工具。 # 只导入需要的工具。 将 scipy.cluster.hierarchy 导入为 sch 
#让我们创建一个树状图变量#链接实际上是层次聚类的算法本身,然后在#linkage中我们必须指定我们应用和参与哪些数据。 这是 X 数据集 dendrogram = sch.dendrogram(sch.linkage(X, method = "ward")) plt.title('Dendrogram') plt.xlabel('Customers') plt.ylabel('Euclidean distances') plt.节目()

Ward 方法是一种尝试减少每个集群内的方差的方法。 这和我们使用 K-means 最小化 wcss 来绘制肘部方法图时几乎相同; 唯一的区别是,我们正在最小化集群内的变体,而不是 wcss。 在每个集群中,这就是方差。 树状图如下所示。

树状图

客户在 x 轴上表示,集群之间的欧几里德距离在 y 轴上表示。 我们如何根据这张图计算出最佳的集群数量? 我们想在不跨越任何水平线的情况下找到最长的垂直距离,也就是上图中的红框线。 让我们数一数图表上的线条,并计算出有多少个集群是最好的。 对于此数据集,簇数将为 5。

#4 将层次聚类拟合到 Mall_Customes 数据集 # 层次聚类有两种算法:Agglomerative Hierarchical Clustering 和 # Divisive Hierarchical Clustering。 我们为我们的算法类选择欧几里得距离和 ward 方法 from sklearn.cluster import AgglomerativeClustering hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', links ='ward') # 让我们尝试将层次聚类算法拟合到数据集 X同时创建# clusters 向量,告诉每个客户该客户属于哪个集群。 y_hc=hc.fit_predict(X)
#5 可视化集群。 此代码类似于 k-means 可视化代码。 #我们只将y_kmeans向量名替换为y_hc进行层次聚类 plt.scatter(X[y_hc==0, 0], X[y_hc==0, 1], s=100, c='red', label = 'Cluster 1') plt.scatter(X[y_hc==1, 0], X[y_hc==1, 1], s=100, c='blue', label ='Cluster 2') plt.scatter( X[y_hc==2, 0], X[y_hc==2, 1], s=100, c='green', label ='Cluster 3') plt.scatter(X[y_hc==3, 0] , X[y_hc==3, 1], s=100, c='cyan', label ='Cluster 4') plt.scatter(X[y_hc==4, 0], X[y_hc==4, 1 ], s=100, c='magenta', label ='Cluster 5') plt.title('Clusters of Customers (Hierarchical Clustering Model)') plt.xlabel('Annual Income(k$)') plt.ylabel ('消费分数(1-100') plt.show()
集群 | 层次聚类
Cluster1(红色),Cluster2(蓝色),Cluster3(绿色),Cluster4(青色),Cluster5(洋红色)

这些集群可以被认为是商场的客户群。

这就是标准层次聚类模型的全部内容。 数据集以及所有代码都可以在 Github 部分中找到。

结论

在任何聚类练习中,确定聚类的数量都是一个耗时的过程。 因为业务的商业方面更关心从这些组中提取意义,所以在二维中可视化集群并查看它们是否不同是至关重要的。 PCA 或因子分析可用于实现这一目标。 这是向各个利益相关者展示最终结果的常用方法,使每个人都更容易消费输出。

的EndNote

谢谢你的阅读!
我希望你喜欢这篇文章并增加你的知识。
请随时与我联系 on 电邮
未提及的内容或想分享您的想法? 请随时在下面发表评论,我会尽快回复您。

关于作者

哈迪库马尔·M·达杜克
数据分析师 | 数字数据分析专家 | 数据科学学习者
与我联系 LinkedIn
与我联系 Github上

本文中显示的媒体不归 Analytics Vidhya 所有,由作者自行决定使用。

来源:https://www.analyticsvidhya.com/blog/2021/08/hierarchical-clustering-algorithm-python/

时间戳记:

更多来自 分析维迪亚