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

川川菜鸟 川川菜鸟     2022-12-02     759

关键词:

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

关于机器学习,这个专栏写了比较系统的实战和原理:机器学习入门到大神 本文单独介绍一个层次聚类。

文章目录

一、聚类流程与基本原理

系统聚类法(hierarchical clustering method),又叫分层聚类法,是目前最常用的聚类分析方法。其基本步骤如下:假设样本中有n个样品,那么就先将这n个样品看作n类,也就是一个样品一个类,然后将性质最接近的两类合并为一个新的类,这样就得到n-1个类,接着从中再找出最接近的两个类,让其进行合并,这样就变为n-2个类,让此过程持续进行下去,最后所有的样品都归为一类,把上述过程绘制成一张图,这个图就称为聚类图,从图中再决定分为多少类。如下所示:

样点之间的相似度是根据距离来实现的,比如最短距离法、最长距离法、重心法、类平均法以及ward法。

最短距离法 :从两个类中找出距离最短的两个样品点。如下:

最长距离法 :同理如下:

类平均法: 就是取两个类之间所有点的距离的平均值

重心法 :名如其法,如下

离差平方和法 :离差平方和法又叫Ward法,此方法查找聚合偏差。例如,如果我们有两个集群,我们可以假装将它们合并为一个集群,然后估计结果集群的质心。之后,我们找到新质心的所有点的平方偏差之和。对于不同的合并,我们将获得其他变化。因此,我们选择合并最小的距离作为我们的距离。

二、实现层次聚类

数据下载:

https://wwp.lanzouv.com/i5Ru70d8yaof

如下:

2.1 导入相关库

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

2.2 读取数据

ourData = pd.read_csv('Mall_Customers.csv') 
ourData.head()

如下:

我们将使用该数据集在Annual Income (k$)和Spending Score (1-100)列上实现我们的层次聚类模型。所以我们需要从我们的数据集中提取这两个特征:

newData = ourData.iloc[:, [3, 4]].values
newData 

如下:

可以看到数据不一致,我们必须对数据进行缩放,以使各种特征具有可比性;否则,我们最终会得到一个劣质的模型。原因是层次聚类,就像机器学习中的许多其他算法一样,是基于距离的(欧几里得距离)。

2.3 确定最佳集群数

在尝试对我们的数据进行聚类之前,我们需要知道我们的数据可以最佳地聚类到多少个集群。所以让我们首先在我们的数据集上实现一个树状图来实现这个目标:

import scipy.cluster.hierarchy as sch # 导入层次聚类算法
dendrogram = sch.dendrogram(sch.linkage(newData , method = 'ward')) # 使用树状图找到最佳聚类数
plt.title('Dendrogram') # 标题
plt.xlabel('Customers') # 横标签
plt.ylabel('Euclidean distances') # 纵标签
plt.show() 

树状图,如下所示:

看上面的树状图,可以确定最佳聚类数;假设地,推断整个树状图中的所有水平线,然后找到不与这些假设线相交的最长垂直线。

越过那条最长的线,建立一个分界线。我们可以对数据进行最佳聚类的聚类数等于已建立的阈值所跨越的欧几里德距离(垂直线)的计数。

在我们刚刚获得的树状图中,没有延伸的水平线交叉的最长垂直线位于绿色部分。第三条线位于欧几里得距离 (110 - 250) 之间。将我们的阈值设为 150,获得的最佳聚类数为 5。知道我们的数据应该聚集到的最佳数量;我们现在可以训练我们的聚类模型来实现这个目标。

2.4 层次聚类模型训练

from sklearn.cluster import AgglomerativeClustering 
# n_clusters为集群数,affinity指定用于计算距离的度量,linkage参数中的ward为离差平方和法
Agg_hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward')
y_hc = Agg_hc.fit_predict(newData) # 训练数据

上面的代码训练了我们的模型,我们现在可以继续并可视化数据是如何聚集的:

plt.scatter(newData[y_hc == 0, 0], newData[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1') # cluster 1
plt.scatter(newData[y_hc == 1, 0], newData[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2') # cluster 2
plt.scatter(newData[y_hc == 2, 0], newData[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3') # cluster 3
plt.scatter(newData[y_hc == 3, 0], newData[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')  #  cluster 4
plt.scatter(newData[y_hc == 4, 0], newData[y_hc == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #  cluster 5

plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()

如下:

关于层次聚类,我们需要了解的最后一个细节是它的时间和空间复杂是比较高的,因此不是解决大型数据集聚类问题的合适解决方案。

三、本文福利

评论区抽取点赞数量前三名的粉丝,每人送一本数据分析书。转发给同学,给你的评论点赞吧。星期天结束,到时候主动把收件信息发给我,记得加我微信。

这是一本很教材式的书籍,参与编写的有很多的老师,我最近才买到,总体感觉还不错,只送三本哈,其余同学需要自己购买。一些实拍如下:



留下你的评论,转发让朋友同学给你点赞吧,前期送过几十本书籍了哟。(我的联系方式可以点击本文最下方的卡片,添加我的微信,星期天的时候你的评论被点赞数量在前三就可以获得书籍一本)。

2023年美赛c题wordle预测问题三四建模及python代码详细讲解(代码片段)

...关链接(1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解(2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解(3)2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解(4)2023... 查看详情

2023年美赛c题wordle预测问题三四建模及python代码详细讲解(代码片段)

...关链接(1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解(2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解(3)2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解(4)2023... 查看详情

数学建模暑期集训20:层次聚类法matlab+python(代码片段)

本专栏第二篇文章介绍过层次聚类法数学建模学习笔记(二)层次聚类法matlab代码如下:clc;clear;Y=[0.0800.1432.0000.2500.5000.2860.1432.0002.000inf];Z=linkage(Y,'average')dendrogram(Z)然而,当数据量大于30个时&# 查看详情

基于它们在python中的合并顺序的层次聚类标签

】基于它们在python中的合并顺序的层次聚类标签【英文标题】:Hierarchicalclusteringlabelbasedontheirmergingorderinpython【发布时间】:2021-10-2620:14:52【问题描述】:可以说,我有这种类型的层次聚类,如下图所示。要获得聚类标签,我需... 查看详情

python基础(十三):集合的详细讲解(代码片段)

文章目录集合的详细讲解一、创建集合二、集合常见操作方法1、增加数据2、删除数据3、查找数据集合的详细讲解一、创建集合创建集合使用或set(),但是如果要创建空集合只能使用set(),因为用来创建空字典。s1=10,20,... 查看详情

机器学习:python实现聚类算法之总结(代码片段)

...以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作用,而重点是放在如何使用... 查看详情

python的lambda表达式详细讲解(代码片段)

前言:作者:神的孩子在歌唱大家好,我叫智Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函数。Lambda表达式可以... 查看详情

r语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色在树状图dendrogram中为不同的层次聚类簇配置不同的色彩(代码片段)

R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色、在树状图dendrogram中为不同的层次聚类簇配置不同的色彩#层次聚类树状图dendrogramlabs=paste("sta_",1:50,sep="")#newlabelsrownames(USArrests)<-labs#setnewrownameshc<-hclust(dist(USArrests... 查看详情

python基础:列表的详细讲解(代码片段)

文章目录列表的详细讲解一、列表的应用场景二、列表的格式三、列表的常用操作1、查找2、增加3、删除4、修改5、复制四、列表的循环遍历1、while2、for五、列表嵌套六、总结列表的详细讲解一、列表的应用场景思考:有⼀... 查看详情

使用scipy进行层次聚类和k-means聚类(代码片段)

scipycluster库简介scipy.cluster是scipy下的一个做聚类的package,共包含了两类聚类方法: 1.矢量量化(scipy.cluster.vq):支持vectorquantization和k-means聚类方法 2.层次聚类(scipy.cluster.hierarchy):支持hierarchicalclustering和agglomerative 查看详情

使用python从混淆矩阵进行层次聚类

】使用python从混淆矩阵进行层次聚类【英文标题】:Hierarchicalclusteringfromconfusionmatrixwithpython【发布时间】:2013-09-1704:46:23【问题描述】:使用下面的answer,我尝试编写基于混淆矩阵的层次类聚类。混淆矩阵用于评估分类问题的结... 查看详情

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

目录1.作者介绍2.层次聚类算法介绍2.1层次聚类算法原理2.2层次聚类算法步骤2.3层次聚类算法分类3.层次聚类算法实现(代码如下)3.1相关包导入3.2生成测试数据集3.3层次聚类实现&画出树状图3.4获取聚类结果3.5完整代码... 查看详情

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

目录1.作者介绍2.层次聚类算法介绍2.1层次聚类算法原理2.2层次聚类算法步骤2.3层次聚类算法分类3.层次聚类算法实现(代码如下)3.1相关包导入3.2生成测试数据集3.3层次聚类实现&画出树状图3.4获取聚类结果3.5完整代码... 查看详情

Python scipy/numpy中相关性的层次聚类?

】Pythonscipy/numpy中相关性的层次聚类?【英文标题】:hierarchicalclusteringoncorrelationsinPythonscipy/numpy?【发布时间】:2011-02-2320:59:55【问题描述】:如何在scipy/numpy中的相关矩阵上运行层次聚类?我有一个100行乘9列的矩阵,我想通过9... 查看详情

详细讲解spring中的@bean注解(代码片段)

点击关注公众号,实用技术文章及时了解来源:blog.csdn.net/weixin_42140261/article/details/104864333随着SpringBoot的流行,我们现在更多采用基于注解式的配置从而替换掉了基于XML的配置,所以本篇文章我们主要探讨基于注... 查看详情

在python中层次聚类的每一步打印所有聚类和样本

】在python中层次聚类的每一步打印所有聚类和样本【英文标题】:Printallclustersandsamplesateachstepofhierarchicalclusteringinpython【发布时间】:2021-03-1002:04:07【问题描述】:我使用Scipy库来执行层次聚类并创建树状图。这是简单的代码和... 查看详情

python,opencv中的k均值聚类——k-meanscluster(代码片段)

Python,OpenCV中的K均值聚类1.效果图2.原理2.1什么是K均值聚类?2.2K均值聚类过程2.3cv2.kmeans(z,2,None,criteria,10,flags)3.源码3.1抽样生成点后聚类3.2单特征聚类、多特征聚类、颜色量化参考这篇博客将介绍什么是K-Means聚类以及如... 查看详情

python进阶可能是全网最详细的defaultdict讲解(代码片段)

1什么是defaultdict从名字上可以看出defaultdict也是一个dict,即键值对。在讲什么是defaultdict之前,我们先看看dict的常规用法。#也可以写成dict=dic=dict()dic['a']=1dic['b']=2print(dic['a'])print(di 查看详情