层次聚类算法的实现

层次聚类算法的实现目录 1 作者介绍 2 层次聚类算法介绍 2 1 层次聚类算法原理 2 2 层次聚类算法步骤 2 3 层次聚类算法分类 3 层次聚类算法实现 代码如下 3 1 相关包导入 3 2 生成测试数据集 3 3 层次聚类实现 amp 画出树状图 3 4 获取聚类结果 3 5 对比不同方法聚类效果 4 参考链接 1 作者介绍杨金花 女 西安工程大学电子信息学院 21 级研究生研究方向 基于学习方法的运动目标检测电子邮件 com2 层次聚类算法介绍 2 1 层次聚类算法原理聚类就是对大量未知标注的数据集

1.作者介绍

2.层次聚类算法介绍

2.1 层次聚类算法原理

 聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小。 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。算法流程展示如图所示。 

在这里插入图片描述

2.2 层次聚类算法步骤

图2. 层次聚类实现过程示例图

2.3 层次聚类算法分类

图3. Divisive实现过程示例图

图4. Divisive实现过程示例图

3.层次聚类算法实现(代码如下)

3.1 相关包导入

from scipy.cluster.hierarchy import linkage #导入linage函数用于层次聚类 from scipy.cluster.hierarchy import dendrogram #dendrogram函数用于将聚类结果绘制成树状图 from scipy.cluster.hierarchy import fcluster #fcluster函数用于提取出聚类的结果 from sklearn.datasets import make_blobs #make_blobs用于生成聚类算法的测试数据 from sklearn.cluster import AgglomerativeClustering #自底向上层次聚类算法 import matplotlib.pyplot as plt #导入matplotlib绘图工具包 

3.2 生成测试数据集

#生成测试数据 centers = [[1, 1], [-1, -1], [1, -1]] X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0) plt.figure(figsize=(10, 8)) plt.scatter(X[:, 0], X[:, 1], c='b') plt.show() #from scipy.cluster.hierarchy import linkage 

图5. 测试数据可视化展示

3.3 层次聚类实现&画出树状图

#层次聚类实现 #from scipy.cluster.hierarchy import dendrogram Z = linkage(X, method='ward', metric='euclidean') print(Z.shape) print(Z[: 5]) #画出树状图 #from scipy.cluster.hierarchy import fcluster plt.figure(figsize=(10, 8)) dendrogram(Z, truncate_mode='lastp', p=20, show_leaf_counts=False, leaf_rotation=90, leaf_font_size=15, show_contracted=True) plt.show() 

图6. 树状图可视化展示

3.4 获取聚类结果

#根据临界距离返回聚类结果 d = 15 labels_1 = fcluster(Z, t=d, criterion='distance') print(labels_1[: 100]) # 打印聚类结果 print(len(set(labels_1))) # 看看在该临界距离下有几个 cluster #根据聚类数目返回聚类结果 k = 3 labels_2 = fcluster(Z, t=k, criterion='maxclust') print(labels_2[: 100]) list(labels_1) == list(labels_2) # 看看两种不同维度下得到的聚类结果是否一致 #聚类的结果可视化,相同的类的样本点用同一种颜色表示 plt.figure(figsize=(10, 8)) plt.scatter(X[:, 0], X[:, 1], c=labels_2, cmap='prism') plt.show() 

图7. 聚类结果可视化展示

3.5完整代码

from scipy.cluster.hierarchy import linkage #导入linage函数用于层次聚类 from scipy.cluster.hierarchy import dendrogram #dendrogram函数用于将聚类结果绘制成树状图 from scipy.cluster.hierarchy import fcluster #fcluster函数用于提取出聚类的结果 from sklearn.datasets import make_blobs #make_blobs用于生成聚类算法的测试数据 from sklearn.cluster import AgglomerativeClustering #自底向上层次聚类算法 import matplotlib.pyplot as plt #导入matplotlib绘图工具包 #生成测试数据 centers = [[1, 1], [-1, -1], [1, -1]] X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0) plt.figure(figsize=(10, 8)) plt.scatter(X[:, 0], X[:, 1], c='b') plt.show() #from scipy.cluster.hierarchy import linkage #层次聚类实现 #from scipy.cluster.hierarchy import dendrogram Z = linkage(X, method='ward', metric='euclidean') print(Z.shape) print(Z[: 5]) #画出树状图 #from scipy.cluster.hierarchy import fcluster plt.figure(figsize=(10, 8)) dendrogram(Z, truncate_mode='lastp', p=20, show_leaf_counts=False, leaf_rotation=90, leaf_font_size=15, show_contracted=True) plt.show() # 根据临界距离返回聚类结果 d = 15 labels_1 = fcluster(Z, t=d, criterion='distance') print(labels_1[: 100]) # 打印聚类结果 print(len(set(labels_1))) # 看看在该临界距离下有几个 cluster # 根据聚类数目返回聚类结果 k = 3 labels_2 = fcluster(Z, t=k, criterion='maxclust') print(labels_2[: 100]) list(labels_1) == list(labels_2) # 看看两种不同维度下得到的聚类结果是否一致 # 聚类的结果可视化,相同的类的样本点用同一种颜色表示 plt.figure(figsize=(10, 8)) plt.scatter(X[:, 0], X[:, 1], c=labels_2, cmap='prism') plt.show() 

3.6 对比不同方法聚类效果

from time import time import numpy as np from sklearn.datasets import make_blobs from scipy.cluster.hierarchy import linkage, fcluster from sklearn.metrics.cluster import adjusted_mutual_info_score import matplotlib.pyplot as plt #生成样本点 centers = [[1, 1], [-1, -1], [1, -1]] X, labels = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0) #可视化聚类结果 def plot_clustering(X, labels, title=None): plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='prism') if title is not None: plt.title(title, size=17) plt.axis('off') plt.tight_layout() #进行 Agglomerative 层次聚类 linkage_method_list = ['single', 'complete', 'average', 'ward'] plt.figure(figsize=(10, 8)) ncols, nrows = 2, int(np.ceil(len(linkage_method_list) / 2)) plt.subplots(nrows=nrows, ncols=ncols) for i, linkage_method in enumerate(linkage_method_list): print('method %s:' % linkage_method) start_time = time() Z = linkage(X, method=linkage_method) labels_pred = fcluster(Z, t=3, criterion='maxclust') print('Adjust mutual information: %.3f' % adjusted_mutual_info_score(labels, labels_pred)) print('time used: %.3f seconds' % (time() - start_time)) plt.subplot(nrows, ncols, i + 1) plot_clustering(X, labels_pred, '%s linkage' % linkage_method) plt.show() 

图8. 不同聚类方法结果展示

AMI评估结果
该量越接近于 1 则说明聚类算法产生的类越接近于真实情况。从右图的AMI量的表现来看,Single-link 方法下的层次聚类结果最差,它几乎将所有的点都聚为一个 cluster,而其他两个 cluster 则都仅包含个别稍微有点偏离中心的样本点,而另外三种聚类方法效果都还可以。结果如下图

图9. AMI评估结果

4.参考链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217355.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:45
下一篇 2026年3月18日 上午9:45


相关推荐

  • Gitlab-CICD最简单明了的入门教程

    Gitlab-CICD最简单明了的入门教程CICD是什么?由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下介绍gitlab的CICD之前,可以先了解CICD是什么我们的开发模式经历了如下的转变:瀑布模型->敏捷开发→DevOps(Development、Operations的组合词,是一组过程、方法与系统的统称)后来随着DevOps的兴起,出现了持续集成(ContinuousIntegration)、持续交付(Co

    2022年6月3日
    213
  • Matlab中弧度转角度、角度转弧度

    Matlab中弧度转角度、角度转弧度Content弧度转角度角度转弧度弧度转角度rad2deg()函数可以用于将弧度转为角度示例:角度转弧度deg2rad()函数可以用于将角度转换为弧度。示例:

    2022年6月15日
    70
  • Furion Scheduler的混合负载管理

    Furion Scheduler的混合负载管理转 http www transwarp cn news detail id 203 多租户场景下实现 Inceptor 中的作业调度是复杂的 不仅要考虑到任务自身的优先级和资源占用情况 而且要结合不同用户 组 角色的权限以及资源配额限制 做细粒度的调度管理 通常会遇到以下几项问题 1 资源被大批处理任务占用 导致小的报表任务一直无法被调度 2 某个用户持续提交任务

    2025年9月21日
    5
  • ppt生成skill:nano-banana-ppt

    ppt生成skill:nano-banana-ppt

    2026年3月14日
    3
  • 使用 SQL Server 的 uniqueidentifier 字段类型[通俗易懂]

    使用 SQL Server 的 uniqueidentifier 字段类型[通俗易懂]SQLServer自2008版起引入了 uniqueidentifier 字段,它存储的是一个UUID,或者叫GUID,内部存储为16个字节。SQLServer可用两个函数来生成 uniqueidentifier,分别是 NEWID() 和 NEWSEQUENTIALID(),后者只能用作字段的默认值。Java也有一个UUID工具类 java.uti.UUID, U…

    2025年10月3日
    7
  • HAL库控制PS2手柄「建议收藏」

    HAL库控制PS2手柄「建议收藏」通过hal库配置SPI,并完成和PS2的通信

    2022年6月12日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号