Python学习3-层次聚类
目录
0.层次聚类的概念
0.1 聚合层次聚类
0.2 分裂层次聚类
1.凝聚层次聚类算法步骤
1.1 算法过程
1.2算法案例
0.层次聚类的概念
层次聚类和k-means一样都是很常用的聚类方法。层次聚类是对群体的划分,最终将样本划分为树状的结构。他的基本思路是每个样本先自成一类,然后按照某种规则进行合并,直到只有一类或者某一类的样本只有一个点。层次聚类又分为自底而上的聚合层次聚类和自顶而下的分裂层次聚类。
参考链接:
关于层次聚类算法的python实现 - 简书 (jianshu.com)https://www.jianshu.com/p/916aab25cda7
0.1 聚合层次聚类
每一个点初始为1类,得到N(样本点个数)类,计算每一类之间的距离,计算方法有很多,具体可以参考距离的计算方法。聚合层次聚类方法的终止条件是所有样本点都处于同一类了,或者两类之间的距离超过设置的某个阈值。大多数层次聚类都是聚合层次聚类。
0.2 分裂层次聚类
和聚合层次聚类是反着的,属于自上而下的一种聚类方法。刚开始的时候所有的样本点都位于同一类,然后一步步划分,终止条件是所有的样本点都位于单独的一类,或者两类之间的距离超过设置的某个阈值。
下面这个图可以比较好的说明这个过程:
层次聚类的两种方法
1.凝聚层次聚类算法步骤
1.1 算法过程
参考链接:
(2条消息) 层次聚类算法的原理及python实现_听了个听儿-CSDN博客_层次聚类pythonhttps://blog.csdn.net/u012328476/article/details/78978113层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。合并过程如下:
我们可以获得一个N*N的距离矩阵 X,其中X[i,j]表示i和j的距离,称为数据点与数据点之间的距离。记每一个数据点为,将距离最小的数据点进行合并,得到一个组合数据点,记为 G
数据点与组合数据点之间的距离: 当计算G 和的距离时,需要计算和G中每一个点的距离。
组合数据点与组合数据点之间的距离:主要有Single Linkage,Complete Linkage和Average Linkage、Ward linkage 四种。这四种算法介绍如下:
1.Single Linkage
Single Linkage的计算方法是将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
2. Complete Linkage
Complete Linkage的计算方法与Single Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。
3. Average Linkage
Average Linkage的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
1)N个样本单独成类,G1(0)、G2(0)、G3(0)、……、GN(0),0代表初始状态。
2)更新距离矩阵D(n),找出D(n)中最小值,把对应的两类合并为1类。
3)更新距离矩阵D(n+1),重复步骤2-3。
当两类之间的最小距离小于给定的阈值或者所有样本都单独成类的时候,结束算法。
4.Ward linkage
参考链接
凝聚法层次聚类之ward linkage method - stardsd - 博客园 (cnblogs.com)https://www.cnblogs.com/sddai/p/7662780.html#:~:text=ward%27s%20method%E6%98%AF%E5%88%86%E5%B1%82%E8%81%9A%E7%B1%BB%E5%87%9D%E8%81%9A%E6%B3%95%E7%9A%84%E4%B8%80%E7%A7%8D%E5%B8%B8%E8%A7%81%E7%9A%84%E5%BA%A6%E9%87%8Fcluster%E4%B9%8B%E9%97%B4%E8%B7%9D%E7%A6%BB%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%85%B6%E5%9F%BA%E6%9C%AC%E8%BF%87%E7%A8%8B%E6%98%AF%E8%BF%99%E6%A0%B7%E7%9A%84%EF%BC%88%E5%8F%82%E8%80%83%EF%BC%9A%20http%3A%2F%2Fblog.sciencenet.cn%2Fblog-2827057-921772.html,%EF%BC%89%20%E8%BF%99%E4%B8%AA%E6%96%B9%E6%B3%95%E5%85%B6%E5%AE%9E%E6%95%88%E7%8E%87%E6%AF%94%E8%BE%83%E4%BD%8E%EF%BC%8C%E7%89%B9%E5%88%AB%E6%98%AF%E7%AE%97cluster%E7%9A%84ESS%E5%80%BC%E8%BF%98%E8%A6%81%E5%85%88%E6%B1%82%E5%9D%87%E5%80%BC%E7%82%B9%EF%BC%8C%E7%84%B6%E5%90%8E%E7%AE%97%E8%B7%9D%E7%A6%BB%E7%9A%84%E5%B9%B3%E6%96%B9%E5%86%8D%E6%B1%82%E5%92%8C%EF%BC%8C%E4%B8%8D%E8%BF%87%E6%9C%89%E4%B8%80%E4%B8%AA%E5%BF%AB%E9%80%9F%E7%9A%84%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95%E5%8F%ABLance-Williams%20Algorithm%E5%8F%AF%E4%BB%A5%E5%A4%A7%E5%A4%A7%E7%AE%80%E5%8C%96ward%20method%E7%9A%84%E8%AE%A1%E7%AE%97%E3%80%82Ward是离差平方和,首先输入的是一个距离矩阵,知道每两个点之间的距离。然后初始化是每个点做为一个cluster,假设总共N组,此时每个组内的ESS都是0,ESS的公式,ESS就是【方差×n】如下,ward method是要求每次合并后ESS的增量最小
1.2算法案例
参考链接
原理+代码|详解层次聚类及Python实现 - 云+社区 - 腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1756976
使用一份公开的城市经济数据集,参数如下:
- AREA:城市名称
- Gross:总体经济情况指数
- Avg:平均经济情况指数
import matplotlib.pyplot as plt
import pandas as pd
import scipy.cluster.hierarchy as schplt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 设置中文字体的支持
plt.rcParams['axes.unicode_minus'] = False # 使坐标轴刻度表签正常显示正负号,解决保存图像是负号'-'显示为方块的问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 图中文字体设置为黑体
plt.rcParams['axes.unicode_minus'] = False # 负值显示df = pd.read_csv('城市经济.csv', encoding='GBK', engine='python')#解决中文乱码
name = df['AREA'].values.reshape(df['AREA'].values.shape[0], 1)#提取数据并转置
datax = df['Gross'].values.reshape(df['Gross'].values.shape[0], 1)
datay = df['Avg'].values.reshape(df['Avg'].values.shape[0], 1)fig1 = plt.figure(figsize=(6, 6)) # 新建画布
ax = fig1.add_subplot(1, 1, 1)
ax.scatter(datax, datay, marker='*', color='c', label='3', s=30) # 绘制散点图
ax.set_title("分布点图")
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none') # 将右边 上边的两条边颜色设置为空 其实就相当于抹掉这两条边
ax.spines['bottom'].set_position(('data', 0)) # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines['left'].set_position(('data', 0))
# 为点添加标签
for i in range(10):ax.text(datax[i], datay[i], df['AREA'].values[i], fontsize=12, color="r", style="italic")
plt.show()
plt.close()
# 生成点与点之间的距离矩阵, 这里用的欧氏距离: euclidean
# X:根据什么来聚类,这里结合总体情况 Gross 与平均情况 Avg 两者
disMat = sch.distance.pdist(X=df[['Gross', 'Avg']], metric='euclidean')
# 进行层次聚类: 计算距离的方法使用 ward 法
Z = sch.linkage(disMat, method='ward')
# 将层级聚类结果以树状图表示出来并保存
# 需要手动添加标签。
# P = sch.dendrogram(Z, labels=name)
P = sch.dendrogram(Z, labels=df.AREA.tolist())
plt.savefig('层次聚类.png')
Python学习3-层次聚类相关推荐
- Python机器学习——Agglomerative层次聚类
层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法. 其原理是:最初 ...
- python的scipy层次聚类参数详解
详解python中层次聚类的fcluster函数 调用实例: import scipy import scipy.cluster.hierarchy as sch from scipy.cluster ...
- 【Python机器学习】层次聚类AGNES、二分K-Means算法的讲解及实战演示(图文解释 附源码)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 层次聚类 在聚类算法中,有一类研究执行过程的算法,它们以其他聚类算法为基础,通过不同的运用方式试图达到提高效率,避免局部最优等目的,这类算法主要有 ...
- Python中的层次聚类,详细讲解
层次聚类是流行的无监督学习算法之一.层次聚类所做的就是找到数据集中具有相似属性的元素,并将它们组合在一个集群中.最后,我们得到一个单一的大集群,其主要元素是数据点的集群或其他集群的集群. 关于机器学习 ...
- Python学习 | 2021-11-05 Scipy聚类色彩提取
目录 一.聚类分析 1.聚类 2.Scipy中的聚类算法(K-Means) 3.聚类示例 完整代码: 运行结果: 函数使用: 二.图像色彩聚类 操作步骤: 完整代码: 运行结果: 三.合并至Flask ...
- python原理及代码_原理+代码|详解层次聚类及Python实现
前言 聚类分析是研究分类问题的分析方法,是洞察用户偏好和做用户画像的利器之一.聚类分析的方法非常多,能够理解经典又最基础的聚类方法 -- 层次聚类法(系统聚类) 的基本原理并将代码用于实际的业务案例是 ...
- python层次聚类法画图_Python实现简单层次聚类算法以及可视化
本文实例为大家分享了Python实现简单层次聚类算法,以及可视化,供大家参考,具体内容如下 基本的算法思路就是:把当前组间距离最小的两组合并成一组. 算法的差异在算法如何确定组件的距离,一般有最大距离 ...
- 原理+代码|详解层次聚类及Python实现/层次树怎么看/如何从层次树中查看聚类过程(附源数据)
前言 聚类分析是研究分类问题的分析方法,是洞察用户偏好和做用户画像的利器之一.聚类分析的方法非常多,能够理解经典又最基础的聚类方法 -- 层次聚类法(系统聚类) 的基本原理并将代码用于实际的业务案例是 ...
- 层次聚类python实现_Python机器学习——Agglomerative层次聚类
层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法. 其原理是:最初将每个 ...
- python 密度聚类 使用_使用python+sklearn实现硬币图像上的结构化Ward层次聚类演示...
注意:单击此处https://urlify.cn/EFRn6b下载完整的示例代码,或通过Binder在浏览器中运行此示例使用Ward层次聚类计算二维图像的分割,由于聚类在空间上受到了限制,所以每个分割 ...
最新文章
- 谈谈SaaS创业和企业服务的常识
- 小程序websocket java_微信小程序websocket java获取不到data
- robotframework使用RequestsLibrary进行http接口测试
- STM32之ADC实例(基于DMA方式)
- 根据文字计算Label的尺寸
- python声明_【瞎折腾-03】在Python里面写类型“声明”
- 【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件
- android bench内存测试,华为p10内存测试软件(androbench) v5.0.1 免费版
- register_globals(全局变量注册开关)
- 任务计划命令 linux,linux执行一次性任务计划at命令
- 百度在线解析站不限速下载
- 一年代码功能点的创新性怎么写_技术创新管理--作业--答案
- 产业链人士:苹果明年将推出OLED屏iPad
- hadoop第一个例子
- (纯代码)图片移动放大缩小:
- Fiddler V5中文版
- 由QQ魔法卡看腾讯的运作模式
- MaxScript批量修改材质、贴图名称
- 构建Android Push Notification Service服务端及客户端
- 一名爱折腾人士的Apps for iPhone分享