层次聚类算法的实现(代码片段)

ZHW_AI课题组 ZHW_AI课题组     2023-02-19     167

关键词:

目录

1.作者介绍

杨金花,女,西安工程大学电子信息学院,21级硕士研究生
研究方向:基于学习方法的运动目标检测
电子邮件:2902551510@qq.com

孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:2425613875@qq.com

2.层次聚类算法介绍

2.1 层次聚类算法原理

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

2.2 层次聚类算法步骤

假设有6个样本点A,B,C,D,E,F,对于层次聚类来说,步骤如下:
(1)假设每个样本点都为一个簇类,计算每个簇类间的相似度,得到相似矩阵;
(2)寻找各个类之间最近的两个类,即若B和C的相似度最高,合并簇类B和C为一个簇类。现在我们还有五个簇类,分别为A,BC,D,E,F;
(3)更新簇类间的相似矩阵,若簇类BC和D的相似度最高,合并簇类BC和D为一个簇类。现在我们还有四个簇类,分别为A,BCD,E,F;
(4)更新簇类间的相似矩阵,若簇类E和F的相似度最高,合并簇类E和F为一个簇类。现在我们还有3个簇类,分别为A,BCD,EF。
(5)重复第四步,簇类BCD和簇类EF的相似度最高,合并该两个簇类,现在我们还有2个簇类,分别为A,BCDEF。
(6)最后合并簇类A和BCDEF为一个簇类,层次聚类算法结束。
层次聚类实现过程如图2所示。

2.3 层次聚类算法分类

自顶向下的层次聚类算法(Divisive):
Divisive 层次聚类:又称自顶向下(top-down)的层次聚类,最开始所有的对象均属于一个cluster,每次按一定的准则将某个cluster 划分为多个cluster,如此往复,直至每个对象均属于某一个cluster。实现过程示意图如下。

自底向上的层次聚类算法(Agglomerative):
Agglomerative 层次聚类:又称自底向上(bottom-up)的层次聚类,每一个对象最开始都是一个cluster,每次按一定的准则将最相近的两个cluster合并生成一个新的cluster,如此往复,直至最终所有的对象都属于一个cluster。

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

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()

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()

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()

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

4.参考链接

博客参考链接:
https://cloud.tencent.com/developer/article/1800586

birch聚类算法的实现(代码片段)

...m2.BIRCH聚类算法介绍2.1BIRCH聚类算法介绍BIRCH的全称是利用层次方法的平衡迭代规约和聚类(BalancedIterativeReducingandClusteringUsingHierarchies),它是用层次方法来聚类和规约数据。BIRCH算法利用了一个树结构来帮助我们快速... 查看详情

birch聚类算法的实现(代码片段)

...m2.BIRCH聚类算法介绍2.1BIRCH聚类算法介绍BIRCH的全称是利用层次方法的平衡迭代规约和聚类(BalancedIterativeReducingandClusteringUsingHierarchies),它是用层次方法来聚类和规约数据。BIRCH算法利用了一个树结构来帮助我们快速... 查看详情

python中的层次聚类,详细讲解(代码片段)

层次聚类是流行的无监督学习算法之一。层次聚类所做的就是找到数据集中具有相似属性的元素,并将它们组合在一个集群中。最后,我们得到一个单一的大集群,其主要元素是数据点的集群或其他集群的集群。关于... 查看详情

第二节:层次聚类算法之birch算法(代码片段)

注意:文章中部分内容来自刘建平博客,多谢多谢:刘建平:BIRCH聚类算法原理文章目录一:BIRCH算法概述(1)聚类特征CF(2)聚类特征树(3)聚类特征树的生成A:生成规则B:... 查看详情

一文读懂层次聚类(python代码)(代码片段)

大家好,我是东哥。本篇想和大家介绍下层次聚类,先通过一个简单的例子介绍它的基本理论,然后再用一个实战案例Python代码实现聚类效果。首先要说,聚类属于机器学习的无监督学习,而且也分很多种方法,比如大家熟知的... 查看详情

birch聚类算法的实现(代码片段)

目录1.作者介绍2.BIRCH聚类算法介绍2.1BIRCH聚类算法介绍2.2聚类特征CF与聚类特征树CFTree2.3Birch聚类算法优缺点3.scikit-learn学习Birch聚类3.1Brich类参数4.实验代码与结果展示4.1完整代码4.2实现过程4.3实验结果1.作者介绍冯达,男࿰... 查看详情

聚类算法:凝聚层次聚类

凝聚层次聚类:  所谓凝聚的,指的是该算法初始时,将每个点作为一个簇,每一步合并两个最接近的簇。另外即使到最后,对于噪音点或是离群点也往往还是各占一簇的,除非过度合并。对于这里的“最接近”,有下面... 查看详情

r语言中实现层次聚类模型

大家好!在这篇文章中,我将向你展示如何在R中进行层次聚类。 什么是分层聚类?分层聚类是一种可供选择的方法,它可以自下而上地构建层次结构,并且不需要我们事先指定聚类的数量。该算法的工作原理如下:将每个... 查看详情

机器学习聚类算法(代码片段)

目录1认识聚类算法1.1聚类算法在现实中的应用1.2聚类算法的概念1.3聚类与分类最大的区别1.4小结2聚类算法api初步使用2.1api介绍2.2案例2.2.1流程分析2.2.2代码实现2.3小结3聚类算法实现流程3.1k-means聚类步骤3.2案例练习3.3小结1认识聚... 查看详情

机器学习聚类算法(代码片段)

目录1认识聚类算法1.1聚类算法在现实中的应用1.2聚类算法的概念1.3聚类与分类最大的区别1.4小结2聚类算法api初步使用2.1api介绍2.2案例2.2.1流程分析2.2.2代码实现2.3小结3聚类算法实现流程3.1k-means聚类步骤3.2案例练习3.3小结1认识聚... 查看详情

大数据项目13(python实现聚类算法)(代码片段)

Python实现聚类算法一、k-means聚类算法思想1.分步解析2.代码3.结果一、k-means聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重... 查看详情

史诗级干货长文聚类算法(代码片段)

ClusteringAlgorithm1.聚类算法简介1.1认识聚类算法1.1.1聚类算法在现实中的应用1.1.2聚类算法的概念1.1.3聚类算法与分类算法最大的区别1.2小结2.聚类算法api初步使用2.1api介绍2.2案例2.2.1流程分析2.2.2代码实现2.3小结3.聚类算法实现流程4... 查看详情

聚类算法(k-means聚类算法)(代码片段)

...选中距离平均值最近的点最为簇中心点.3.系统聚类又叫多层次聚类,分类是由高到低(可以想象下二叉树这种结构),越靠后,包含的 查看详情

dbscan聚类算法的实现(代码片段)

DBSCAN聚类算法的实现1.作者介绍2.关于理论方面的知识介绍2.1DBSCAN算法介绍2.2鸢尾花数据集介绍3.实验过程3.1实验代码3.2实现过程3.3实验结果4.参考文献1.作者介绍刘鹏程,男,西安工程大学电子信息学院,202... 查看详情

10种顶流聚类算法实现(附完整代码)(代码片段)

...#xff0c;Datawhale成员来自:海豚科学实验室分享一篇关于聚类的文章:10种聚类算法和Python代码。文末提供jupyternotebook的完整代码获取方式。聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据... 查看详情

java实现dbscan聚类算法(代码片段)

...法,这里找了一些后来选择了较为简单也符合要求的DBScan聚类算法。它是一种基于密度的聚类算法,简单来说就是根据样本的紧密程度和数量将其分成多个集合。这个样本一般来说是一堆坐标点。参数可以为欧式距离和邻域密度... 查看详情

聚类算法k-means原理及实现(代码片段)

学习目标掌握聚类算法实现过程知道K-means算法原理知道聚类算法中的评估模型说明K-means的优缺点了解聚类中的算法优化方式知道特征降维的实现过程应用Kmeans实现聚类任务一、 聚类算法简介1.1认识聚类算法使用不同的聚类准... 查看详情

k-means聚类算法及python代码实现(代码片段)

K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的)1、概述K-means算法是集简单和经典于一身的基于距离的聚类算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类... 查看详情