最强聚类模型,层次聚类 !!_层次聚类的优缺点
itomcoil 2025-08-21 03:16 2 浏览
哈喽,我是小白~
咱们今天聊聊层次聚类,这种聚类方法在后面的使用,也是非常频繁的~
首先,聚类很好理解, 聚类(Clustering)就是把一堆“东西”自动分组 。
这些“东西”可以是人、物品、图像、文本、客户等等。
分组是 让相似的归在一组,不相似的分开 。
核心干货,文末领取
层次聚类
层次聚类就是: 一步一步地合并(或拆分)小组,最后形成一个“层次结构” ,像一棵树一样。
有两种方式:
自底向上(常见) :一开始每个点都是一个小组,然后 两两合并最像的组 ,一直合并,直到只剩一个大组。 自顶向下(不常用) :一开始是一个大组,不断拆分。
类比解释
假设有 6 个小朋友,他们身高如下(单位:cm):
你不知道他们属于哪个年级,但你怀疑:他们应该可以分成“低年级”和“高年级”。
怎么做层次聚类?
第一步:先把他们看成 6 个独立的组:
A B C D E F
第二步:找“最像”的两个小朋友(距离最小的)
他们的“相似度”可以用“身高差”来表示:
最小的是 AB 和 DE,都是距离 2。
我们先合并 AB,变成一个新组(叫 AB),然后重新计算“组与其他人”的距离。
第三步:继续合并(演示部分)
现在的组是:
[AB] C D E F
我们假设用“组的平均值”代表组的身高:
再计算距离:
现在是:
[AB] C [DE] F
继续:
我们可以任选一个合并,比如 AB 和 C → ABC,平均身高 = (100+102+105)/3 = 102.3
最后也会合并 DE 和 F → DEF,平均身高 = (160+162+165)/3 ≈ 162.3
最终变成:
[ABC] [DEF]
你看到没有?我们 成功把6个小朋友分成了两组:一个是100多身高,一个是160多身高的!
公式解析
我们有一个数据集 ,其中每个数据点 是一个 -维向量。
聚类的目标是把这 个样本划分成 个组(簇,cluster),使得:
这种“相似”通常用 距离函数 衡量。
核心思想:从每个点一个簇开始(共有 个簇),找出两个“最近”的簇,合并成一个新簇;重复,直到只剩一个簇(或满足停止条件)
这个过程会生成一个 嵌套的层级结构(树) ,称为 树状图 。
常用的距离度量公式
数据点之间的距离(欧几里得距离):
对于两个点 和 :
也可以用曼哈顿距离、余弦相似度等。
簇之间的距离计算
层次聚类中,两个簇之间的“距离”可以有不同的定义方式。
最重要最常见的是 4种经典的 Linkage 方法 :
1. 单链接(Single Linkage)
定义两个簇 之间的距离为:
也就是两个簇中 最近的两个点 之间的距离。
2. 全链接(Complete Linkage)
定义两个簇 之间的距离为:
两个簇中 最远的两个点 之间的距离。
3. 平均链接(Average Linkage)
两个簇中 所有点对的平均距离 。
4. 重心法(Centroid Linkage)
先计算簇的 重心(中心) ,再比较两个重心之间的距离:
设 是簇 的重心:
那么:
推导例子
让我们再用前面的数据:
欧几里得距离为:
初始簇:
使用单链接(Single Linkage)
计算最小距离:
最小是 ,合并成
现在:
再计算所有距离,使用 single linkage:
再继续……直到你达到目标簇数。
完整案例
基于上面的小朋友身高示例,生成一个稍微复杂的合成数据集,模拟两类人群(儿童与成年人)在四个维度(身高 Height、体重 Weight、年龄 Age、收入 Income)上的分布,使用平均链接的层次聚类方法进行分析~
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
from scipy.spatial.distance import pdist, squareform
from sklearn.metrics import silhouette_samples, silhouette_score
# 1. 生成合成数据:基于“小朋友”和“成年人”两个簇
np.random.seed(42)
# “小朋友”簇
children_height = np.random.normal(120, 5, 25)
children_weight = children_height * 0.45 + np.random.normal(0, 3, 25)
children_age = np.random.normal(10, 2, 25)
children_income = np.random.normal(50, 10, 25)
# “成年人”簇
adult_height = np.random.normal(170, 5, 25)
adult_weight = adult_height * 0.5 + np.random.normal(0, 5, 25)
adult_age = np.random.normal(35, 5, 25)
adult_income = np.random.normal(200, 50, 25)
# 合并到 DataFrame
data = pd.DataFrame({
'Height': np.concatenate([children_height, adult_height]),
'Weight': np.concatenate([children_weight, adult_weight]),
'Age': np.concatenate([children_age, adult_age]),
'Income': np.concatenate([children_income, adult_income])
})
# 2. 计算欧氏距离矩阵
dist_matrix = pdist(data.values, metric='euclidean')
# 3. 进行层次聚类(平均链接)
Z = linkage(dist_matrix, method='average')
# 4. 绘制树状图(Dendrogram)
plt.figure(figsize=(10, 5))
dendrogram(Z, leaf_rotation=90)
plt.title('Figure 1: Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.tight_layout()
# 5. 绘制距离矩阵热图
plt.figure(figsize=(8, 6))
dm = squareform(dist_matrix)
plt.imshow(dm, aspect='auto', origin='lower')
plt.title('Figure 2: Distance Matrix Heatmap')
plt.xlabel('Sample Index')
plt.ylabel('Sample Index')
plt.colorbar(label='Euclidean Distance')
plt.tight_layout()
# 6. 根据距离阈值截断,获取簇标签
max_d = 30 # 根据树状图设定
clusters = fcluster(Z, max_d, criterion='distance')
# 7. 绘制 Height vs Weight 散点图,标记簇
plt.figure(figsize=(8, 6))
plt.scatter(data['Height'], data['Weight'], c=clusters)
plt.title('Figure 3: Height vs Weight Clustering')
plt.xlabel('Height (cm)')
plt.ylabel('Weight (kg)')
plt.tight_layout()
# 8. 轮廓系数(Silhouette)分析
sil_score = silhouette_score(data.values, clusters)
sil_samples = silhouette_samples(data.values, clusters)
plt.figure(figsize=(8, 6))
y_lower = 10
for i in np.unique(clusters):
ith_silhouette = sil_samples[clusters == i]
ith_silhouette.sort()
y_upper = y_lower + len(ith_silhouette)
plt.fill_betweenx(np.arange(y_lower, y_upper),
0, ith_silhouette)
plt.text(-0.05, y_lower + 0.5 * len(ith_silhouette), str(i))
y_lower = y_upper + 10
plt.title(f'Figure 4: Silhouette Plot (Score = {sil_score:.2f})')
plt.xlabel('Silhouette Coefficient Values')
plt.ylabel('Cluster Label')
plt.tight_layout()
# 9. 各簇特征分布箱线图
data['Cluster'] = clusters
plt.figure(figsize=(10, 8))
data.boxplot(by='Cluster', layout=(2, 2))
plt.suptitle('Figure 5: Feature Distribution by Cluster')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
# 显示所有图形
plt.show()
Figure 1 – Dendrogram(树状图)
可以清晰看到:
此图告诉我们左右两侧分别代表两大类群体——高度、体重、年龄、收入都近似的儿童簇与成年人簇。
Figure 2 – Distance Matrix Heatmap(距离矩阵热图)
热图以视觉形式强化:跨两大簇的距离远超簇内距离,聚类分界明显。
Figure 3 – Height vs Weight Clustering(身高-体重散点图)
二维投影依旧能显著区分簇的分布,并验证 平均链接 在主要特征上表现优秀。
Figure 4 – Silhouette Plot(轮廓系数图)
该图量化了簇的内部凝聚力与群间分离度,平均 0.67 属于比较理想的聚类结果。
Figure 5 – Feature Distribution by Cluster(按簇分组特征箱线图)
四个子图分别展示 Age、Height、Income、Weight 在不同簇(1/2)下的箱线分布
箱线图直观展现每个特征在两簇间的中位数、四分位距与异常值情况。
- 上一篇:python决策树用于分类和回归问题实际应用案例
- 已经是最后一篇了
相关推荐
- 最强聚类模型,层次聚类 !!_层次聚类的优缺点
-
哈喽,我是小白~咱们今天聊聊层次聚类,这种聚类方法在后面的使用,也是非常频繁的~首先,聚类很好理解,聚类(Clustering)就是把一堆“东西”自动分组。这些“东西”可以是人、...
- python决策树用于分类和回归问题实际应用案例
-
决策树(DecisionTrees)通过树状结构进行决策,在每个节点上根据特征进行分支。用于分类和回归问题。实际应用案例:预测一个顾客是否会流失。决策树是一种基于树状结构的机器学习算法,用于解决分类...
- Python教程(四十五):推荐系统-个性化推荐算法
-
今日目标o理解推荐系统的基本概念和类型o掌握协同过滤算法(用户和物品)o学会基于内容的推荐方法o了解矩阵分解和深度学习推荐o掌握推荐系统评估和优化技术推荐系统概述推荐系统是信息过滤系统,用于...
- 简单学Python——NumPy库7——排序和去重
-
NumPy数组排序主要用sort方法,sort方法只能将数值按升充排列(可以用[::-1]的切片方式实现降序排序),并且不改变原数组。例如:importnumpyasnpa=np.array(...
- PyTorch实战:TorchVision目标检测模型微调完
-
PyTorch实战:TorchVision目标检测模型微调完整教程一、什么是微调(Finetuning)?微调(Finetuning)是指在已经预训练好的模型基础上,使用自己的数据对模型进行进一步训练...
- C4.5算法解释_简述c4.5算法的基本思想
-
C4.5算法是ID3算法的改进版,它在特征选择上采用了信息增益比来解决ID3算法对取值较多的特征有偏好的问题。C4.5算法也是一种用于决策树构建的算法,它同样基于信息熵的概念。C4.5算法的步骤如下:...
- Python中的数据聚类及可视化分析实践
-
探索如何通过聚类分析揭露糖尿病预测数据集的特征!我们将运用Python的强力工具,深入挖掘数据,以直观的可视化揭示不同特征间的关系。一同探索聚类分析在糖尿病预测中的实践!所有这些可视化都可以通过数据操...
- 用Python来统计大乐透号码的概率分布
-
用Python来统计大乐透号码的概率分布,可以按照以下步骤进行:导入所需的库:使用Python中的numpy库生成数字序列,使用matplotlib库生成概率分布图。读取大乐透历史数据:从网络上找到大...
- python:支持向量机监督学习算法用于二分类和多分类问题示例
-
监督学习-支持向量机(SVM)支持向量机(SupportVectorMachine,简称SVM)是一种常用的监督学习算法,用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的...
- 25个例子学会Pandas Groupby 操作
-
groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,那么可以...
- 数据挖掘流程_数据挖掘流程主要有哪些步骤
-
数据挖掘流程1.了解需求,确认目标说一下几点思考方法:做什么?目的是什么?目标是什么?为什么要做?有什么价值和意义?如何去做?完整解决方案是什么?2.获取数据pandas读取数据pd.read.c...
- 使用Python寻找图像最常见的颜色_python 以图找图
-
如果我们知道图像或对象最常见的是哪种颜色,那么可以解决图像处理中的几个用例,例如在农业领域,我们可能需要确定水果的成熟度。我们可以简单地检查一下水果的颜色是否在预定的范围内,看看它是成熟的,腐烂的,还...
- 财务预算分析全网最佳实践:从每月分析到每天分析
-
原文链接如下:「链接」掌握本文的方法,你就掌握了企业预算精细化分析的能力,全网首发。数据模拟稍微有点问题,不要在意数据细节,先看下最终效果。在编制财务预算或业务预算的过程中,通常预算的所有数据都是按月...
- 常用数据工具去重方法_数据去重公式
-
在数据处理中,去除重复数据是确保数据质量和分析准确性的关键步骤。特别是在处理多列数据时,保留唯一值组合能够有效清理数据集,避免冗余信息对分析结果的干扰。不同的工具和编程语言提供了多种方法来实现多列去重...
- Python教程(四十):PyTorch深度学习-动态计算图
-
今日目标o理解PyTorch的基本概念和动态计算图o掌握PyTorch张量操作和自动求导o学会构建神经网络模型o了解PyTorch的高级特性o掌握模型训练和部署PyTorch概述PyTorc...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)