Python中层次聚类的详细讲解
作者:川川菜鸟 发布时间:2022-07-02 06:07:13
前言
层次聚类是流行的无监督学习算法之一。层次聚类所做的就是找到数据集中具有相似属性的元素,并将它们组合在一个集群中。最后,我们得到一个单一的大集群,其主要元素是数据点的集群或其他集群的集群。
一、聚类流程与基本原理
系统聚类法(hierarchical clustering method),又叫分层聚类法,是目前最常用的聚类分析方法。其基本步骤如下:假设样本中有n个样品,那么就先将这n个样品看作n类,也就是一个样品一个类,然后将性质最接近的两类合并为一个新的类,这样就得到n-1个类,接着从中再找出最接近的两个类,让其进行合并,这样就变为n-2个类,让此过程持续进行下去,最后所有的样品都归为一类,把上述过程绘制成一张图,这个图就称为聚类图,从图中再决定分为多少类。如下所示:
样点之间的相似度是根据距离来实现的,比如最短距离法、最长距离法、重心法、类平均法以及ward法。
最短距离法 :从两个类中找出距离最短的两个样品点。如下:
最长距离法 :同理如下:
类平均法: 就是取两个类之间所有点的距离的平均值
重心法 :名如其法,如下
离差平方和法 :离差平方和法又叫Ward法,此方法查找聚合偏差。例如,如果我们有两个集群,我们可以假装将它们合并为一个集群,然后估计结果集群的质心。之后,我们找到新质心的所有点的平方偏差之和。对于不同的合并,我们将获得其他变化。因此,我们选择合并最小的距离作为我们的距离。
二、实现层次聚类
数据下载:点击这里下载
如下:
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()
如下:
关于层次聚类,我们需要了解的最后一个细节是它的时间和空间复杂是比较高的,因此不是解决大型数据集聚类问题的合适解决方案。
三、总结
来源:https://blog.csdn.net/weixin_46211269/article/details/127175675


猜你喜欢
- 本文实例讲述了Python Django框架模板渲染功能。分享给大家供大家参考,具体如下:项目名/settings.py(项目配置,配置模板
- 功能:返回字符、二进制、文本或图像表达式的一部分语法:SUBSTRING ( expression, start, length ) 1、s
- 先说结论1. oracle: oracle 默认没有排序规则2. mysql2.1 innoDB引擎: 默认查询按照id正序排序2.2 my
- class Node: def __init__(self,dataval=None): self.d
- 本文实例讲述了Python记录详细调用堆栈日志的方法。分享给大家供大家参考。具体实现方法如下:import sysimport osdef
- 感觉这个东西很常用,很多其它js框架里有,但是太大了,用不了太多,自己写了个。需要的朋友可以参考下。下面是html测试代码:<!DOC
- 一. 使用logging模块时用python写代码时,logging模块最基本的几行配置,如下:import logginglogging.
- 微信小程序实现人脸识别,具体应用场景 前端实现人脸信息采集 拍到正面照片 发送给后端该方法暂
- set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。set 语法:class set([it
- 这篇文章主要介绍了Python和Sublime整合过程图示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。gorou
- 1.使用Management Studio Express,用“Windows身份验证”登录,选中SQL服务器名,右击鼠标选择属性,在服务器
- 本文实例讲述了Python封装原理与实现方法。分享给大家供大家参考,具体如下:【封装】 隐藏对象的属性和实现细节,仅对外提供公共访
- Windows上安装mysql-8.0.29-winx64,供大家参考,具体内容如下1.进入官网找到自己所需的安装包:https://dev
- 问题描述现有一个有向赋权图。如下图所示:问题:根据每条边的权值,求出从起点s到其他每个顶点的最短路径和最短路径的长度。说明:不考虑权值为负的
- 本文为大家分享了VMWare linux安装mysql 5.7.13的教程,供大家参考,具体内容如下1、基础环境说明虚拟机:VMWare操作
- 引言最近公司换了电脑,系统也从 win7 升级到 win11,开发环境都重新安装了一遍,然后在 idea 用mvn 执行打包命令 mvn c
- django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 djan
- 大一上学期学习的内容之一,小黑屋比较好玩。1.导入函数库先导入random、time两个函数库的使用来达到随机生成人物、生成人物加载时间的目
- groupby()函数在python的DataFrame中对数据进行分组统计主要使用groupby()函数。1. groupby基本用法1.