当前位置: 首页 > article >正文

层次聚类(Hierarchical Clustering)详解

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:机器学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:k-均值聚类(k-Means Clustering)详解

文章目录

    • 引言
    • 一、基本原理
      • 1. 聚类类型
        • 自底向上聚类(Agglomerative Clustering)
        • 自顶向下聚类(Divisive Clustering)
      • 2. 距离度量
      • 3. 聚类合并策略
      • 4. 树形图(Dendrogram)
      • 5. 关键优势与局限性
        • 优势
        • 局限性
    • 二、实现步骤
      • 1. 数据准备
      • 2. 计算距离矩阵
      • 3. 初始化聚类
      • 4. 合并聚类
      • 5. 重复合并过程
      • 6. 生成树形图(Dendrogram)
      • 7. 结果分析与解释
      • 8. 应用与扩展
    • 三、应用场景
      • 1. 生物信息学
      • 2. 市场细分
      • 3. 图像处理
      • 4. 社交网络分析
    • 总结

在这里插入图片描述

引言

  在当今数据驱动的时代,数据分析已成为各个领域不可或缺的一部分。随着数据量的激增,如何有效地从复杂的数据集中提取有价值的信息成为了研究者和从业者面临的重要挑战。聚类分析作为一种无监督学习方法,能够将数据集中的对象根据其特征进行分组,从而揭示数据的潜在结构和模式。在众多聚类方法中,层次聚类(Hierarchical Clustering)因其直观性和灵活性而备受青睐。

  层次聚类通过构建树状结构(树形图)来展示数据之间的层次关系,使得用户可以直观地理解数据的分布和聚类的过程。无论是在生物信息学中分析基因表达数据,还是在市场研究中识别客户群体,层次聚类都展现了其广泛的应用潜力和强大的分析能力。本文将深入探讨层次聚类的基本原理、数学模型、实现步骤以及应用场景,旨在为读者提供全面的理解和实用的指导。通过对层次聚类的深入分析,读者将能够更好地掌握这一重要的数据分析工具,并在实际应用中灵活运用。

一、基本原理

  层次聚类(Hierarchical Clustering)是一种将数据对象组织成层次结构的聚类方法。其基本原理是通过逐步合并或分割数据点,形成一个树状结构(树形图),以便于理解和分析数据之间的关系。层次聚类的核心在于如何定义和计算数据点之间的相似性或距离,以及如何根据这些距离进行聚类。

1. 聚类类型

层次聚类主要分为两种类型:

自底向上聚类(Agglomerative Clustering)

自底向上聚类是最常用的层次聚类方法。其基本步骤如下:

  • 初始化:将每个数据点视为一个独立的聚类。
  • 计算距离:计算所有聚类之间的距离,通常使用欧几里得距离或曼哈顿距离。
  • 合并聚类:找到距离最小的两个聚类,将它们合并为一个新的聚类。
  • 更新距离矩阵:根据合并后的新聚类,更新距离矩阵。
  • 重复:重复上述步骤,直到所有数据点合并为一个聚类,或达到预设的聚类数。

这种方法的优点在于其简单易懂,适用于小规模数据集,但在处理大规模数据时计算复杂度较高。

自顶向下聚类(Divisive Clustering)

自顶向下聚类相对较少使用,其基本步骤如下:

  • 初始化:将所有数据点视为一个整体聚类。
  • 分割聚类:根据某种标准(如距离或相似性)将当前聚类分割成两个或多个子聚类。
  • 重复:对每个子聚类重复分割过程,直到每个数据点都成为一个独立的聚类。

自顶向下聚类的优点在于可以更好地处理大规模数据集,但其实现相对复杂。

2. 距离度量

距离度量是层次聚类的关键,决定了数据点之间的相似性。常用的距离度量包括:

  • 欧几里得距离:适用于连续数值型数据,计算公式为:
    d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} d(x,y)=i=1n(xiyi)2

  • 曼哈顿距离:适用于离散数据,计算公式为:
    d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^{n}|x_i - y_i| d(x,y)=i=1nxiyi

  • 余弦相似度:适用于文本数据,计算两个向量之间的夹角,公式为:
    cosine ( x , y ) = x ⋅ y ∥ x ∥ ∥ y ∥ \text{cosine}(x, y) = \frac{x \cdot y}{\|x\| \|y\|} cosine(x,y)=x∥∥yxy

选择合适的距离度量对聚类结果有重要影响。

3. 聚类合并策略

在自底向上的层次聚类中,合并策略决定了如何计算聚类之间的距离。常见的合并策略包括:

  • 单链接(Single Linkage):聚类之间的距离为两个聚类中最近的两个点之间的距离。此策略可能导致“链式效应”,使得聚类结果呈现出长条形状。

  • 全链接(Complete Linkage):聚类之间的距离为两个聚类中最远的两个点之间的距离。此策略倾向于形成紧凑的聚类。

  • 平均链接(Average Linkage):聚类之间的距离为所有点对的平均距离,综合考虑了聚类内部的所有点。

  • Ward法:通过最小化聚类内的方差来选择合并的聚类,通常能够产生更均匀的聚类结果。

4. 树形图(Dendrogram)

树形图是层次聚类的可视化工具,展示了聚类的合并或分割过程。树形图的横轴表示数据点,纵轴表示距离或相似性。通过观察树形图,用户可以选择合适的聚类数,并直观理解数据的层次结构。

5. 关键优势与局限性

优势
  • 直观性:层次聚类通过树形图展示数据的层次关系,便于理解和分析。
  • 无需预设聚类数:与其他聚类方法不同,层次聚类不需要事先指定聚类数。
局限性
  • 计算复杂度高:在处理大规模数据集时,计算距离矩阵和更新聚类的过程可能非常耗时。
  • 对噪声敏感:层次聚类对异常值和噪声数据较为敏感,可能影响聚类结果。

二、实现步骤

  层次聚类的实现过程可以分为几个关键步骤。以下是详细的实现步骤,帮助您理解如何将层次聚类应用于实际数据集。

1. 数据准备

在进行层次聚类之前,首先需要准备好数据集。数据集可以是数值型、类别型或混合型数据。数据准备的步骤包括:

  • 数据收集:获取所需的数据,确保数据的质量和完整性。
  • 数据清洗:处理缺失值、异常值和噪声数据,以提高聚类的准确性。
  • 数据标准化:对于不同量纲的数据,通常需要进行标准化处理,以消除量纲的影响。常用的标准化方法包括 Z-score 标准化和 Min-Max 归一化。

2. 计算距离矩阵

距离矩阵是层次聚类的基础,表示数据集中每对数据点之间的距离。计算距离矩阵的步骤如下:

  • 选择距离度量:根据数据的特性选择合适的距离度量(如欧几里得距离、曼哈顿距离或余弦相似度)。
  • 计算距离:使用所选的距离度量计算每对数据点之间的距离,形成一个对称的距离矩阵。对于 n n n 个数据点,距离矩阵的大小为 n × n n \times n n×n

3. 初始化聚类

在层次聚类的初始阶段,每个数据点被视为一个独立的聚类。此时,聚类的数量等于数据点的数量。

4. 合并聚类

根据距离矩阵和选择的合并策略,逐步合并聚类。具体步骤如下:

  • 查找最近的聚类:在距离矩阵中找到距离最小的两个聚类。
  • 合并聚类:将这两个聚类合并为一个新的聚类。
  • 更新距离矩阵:根据合并后的新聚类,更新距离矩阵。更新方式取决于所选的合并策略:
    • 单链接:新聚类与其他聚类的距离为新聚类中最近的点与其他聚类中点的距离。
    • 全链接:新聚类与其他聚类的距离为新聚类中最远的点与其他聚类中点的距离。
    • 平均链接:新聚类与其他聚类的距离为新聚类中所有点与其他聚类中所有点的平均距离。
    • Ward法:新聚类与其他聚类的距离为合并后聚类内部的方差变化。

5. 重复合并过程

重复步骤4,直到满足停止条件。停止条件可以是:

  • 所有数据点合并为一个聚类。
  • 达到预设的聚类数。
  • 聚类之间的距离超过某个阈值。

6. 生成树形图(Dendrogram)

在完成聚类后,可以生成树形图以可视化聚类过程。树形图展示了聚类的合并顺序和每次合并时的距离。生成树形图的步骤如下:

  • 绘制树形图:使用可视化工具(如Matplotlib、Seaborn等)绘制树形图,横轴表示数据点,纵轴表示合并时的距离。
  • 选择聚类数:通过观察树形图,选择合适的聚类数。通常可以通过寻找树形图中的“切割点”来确定聚类数。

7. 结果分析与解释

最后,对聚类结果进行分析和解释。可以通过以下方式进行:

  • 聚类特征分析:分析每个聚类的特征,了解不同聚类之间的差异。
  • 可视化聚类结果:使用散点图、热图等可视化工具展示聚类结果,帮助理解数据的分布。
  • 评估聚类效果:使用轮廓系数(Silhouette Coefficient)、Davies-Bouldin指数等指标评估聚类效果。

8. 应用与扩展

层次聚类的结果可以用于后续的分析和决策。根据聚类结果,可以进行市场细分、客户分析、异常检测等应用。同时,层次聚类也可以与其他机器学习方法结合,提升数据分析的深度和广度。

三、应用场景

  层次聚类(Hierarchical Clustering)因其直观性和灵活性,广泛应用于多个领域。

1. 生物信息学

在生物信息学中,层次聚类常用于基因表达数据分析,以识别相似的基因或样本。通过聚类分析,研究人员可以发现基因之间的相互关系,进而理解生物过程。

项目代码示例

以下是使用Python和scikit-learn库进行基因表达数据层次聚类的示例代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# 生成示例基因表达数据
data = np.random.rand(10, 5)  # 10个样本,5个基因
genes = [f'Gene{i}' for i in range(1, 6)]
samples = [f'Sample{i}' for i in range(1, 11)]
df = pd.DataFrame(data, index=samples, columns=genes)

# 计算层次聚类
linked = linkage(df, method='ward')

# 绘制树形图
plt.figure(figsize=(10, 7))
dendrogram(linked, labels=df.index, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.show()

2. 市场细分

在市场研究中,层次聚类可以帮助识别不同的客户群体。通过分析客户的购买行为和偏好,企业可以制定更有针对性的营销策略。

项目代码示例

以下是使用Python进行客户数据层次聚类的示例代码:

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering

# 生成示例客户数据
customer_data = np.random.rand(20, 3)  # 20个客户,3个特征(如年龄、收入、消费频率)
customer_df = pd.DataFrame(customer_data, columns=['Age', 'Income', 'SpendingScore'])

# 数据标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(customer_df)

# 进行层次聚类
hierarchical_clustering = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
customer_df['Cluster'] = hierarchical_clustering.fit_predict(scaled_data)

# 可视化聚类结果
plt.figure(figsize=(10, 7))
sns.scatterplot(data=customer_df, x='Income', y='SpendingScore', hue='Cluster', palette='viridis')
plt.title('Customer Segmentation using Hierarchical Clustering')
plt.xlabel('Income')
plt.ylabel('Spending Score')
plt.legend(title='Cluster')
plt.show()

3. 图像处理

层次聚类在图像处理领域中被广泛应用,尤其是在图像分割中。通过将相似的像素聚集在一起,层次聚类可以有效地将图像分割成不同的区域。

项目代码示例

以下是使用Python进行图像分割的层次聚类示例代码:

from sklearn.cluster import AgglomerativeClustering
from skimage import io
from skimage.color import rgb2lab
from skimage.util import img_as_float

# 读取图像
image = img_as_float(io.imread('example_image.jpg'))  # 替换为您的图像路径
image_reshaped = image.reshape(-1, 3)  # 将图像数据重塑为二维数组

# 转换为Lab颜色空间
image_lab = rgb2lab(image_reshaped)

# 进行层次聚类
hierarchical_clustering = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
labels = hierarchical_clustering.fit_predict(image_lab)

# 将聚类结果重塑为图像
segmented_image = labels.reshape(image.shape[0], image.shape[1])

# 可视化分割结果
plt.figure(figsize=(10, 7))
plt.imshow(segmented_image, cmap='nipy_spectral')
plt.title('Image Segmentation using Hierarchical Clustering')
plt.axis('off')
plt.show()

4. 社交网络分析

在社交网络分析中,层次聚类可以用于识别社交网络中的社区结构。通过分析用户之间的关系,研究人员可以了解社交网络的动态和结构。

项目代码示例

以下是使用Python进行社交网络社区检测的层次聚类示例代码:

import networkx as nx
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt

# 创建示例社交网络
G = nx.erdos_renyi_graph(30, 0.05)  # 30个节点,边的概率为0.05
adjacency_matrix = nx.to_numpy_array(G)

# 进行层次聚类
hierarchical_clustering = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
labels = hierarchical_clustering.fit_predict(adjacency_matrix)

# 可视化社交网络
plt.figure(figsize=(10, 7))
pos = nx.spring_layout(G)
nx.draw(G, pos, node_color=labels, with_labels=True, cmap='viridis')
plt.title('Community Detection in Social Network using Hierarchical Clustering')
plt.show()

总结

  层次聚类作为一种重要的聚类分析方法,以其直观性和灵活性在多个领域得到了广泛应用。通过构建树状结构,层次聚类不仅能够揭示数据之间的层次关系,还能帮助研究者和从业者深入理解数据的内在模式。本文详细探讨了层次聚类的基本原理、实现步骤以及具体的应用场景,并结合项目代码示例展示了其在生物信息学、市场细分、图像处理和社交网络分析等领域的实际应用。

  掌握层次聚类的理论基础和实践技巧,将为数据分析提供强有力的工具,帮助我们在复杂的数据环境中提取有价值的信息。随着数据科学的不断发展,层次聚类的应用前景将更加广阔,期待更多的研究者和从业者能够利用这一方法,推动各自领域的创新与发展。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述


http://www.kler.cn/a/410330.html

相关文章:

  • python学习笔记(12)算法(5)迭代与递归
  • Redis-09 SpringBoot集成Redis
  • Linux关于vim的笔记
  • 跨平台应用开发框架(1)----Qt(组件篇)
  • kafka是如何做到高效读写
  • 若依-一个请求中返回多个表的信息
  • 如何将APK预置到Android系统
  • Java项目实战II基于微信小程序的图书馆自习室座位预约平台(开发文档+数据库+源码)
  • 《硬件架构的艺术》笔记(七):处理字节顺序
  • 基于Java Springboot干洗店预约洗衣系统
  • 正则表达式用于报文中日期时间的编程查找
  • MySQL索引优化与Java应用实践
  • OEM sql monitoring 类似SQL
  • 使用Ansible/SaltStack编写自动化运维脚本
  • 嵌套结构与树结构系列--1.三目运算与二叉树
  • ensp动态路由OSPF实验
  • java笔试练习题笔记(15)
  • 正则表达式灾难:重新认识“KISS原则”的意义
  • Docker 的优势和劣势分别是什么
  • 构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
  • mysql之常用的命令行操作
  • MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结
  • 簡單易懂:如何在Windows系統中修改IP地址?
  • windows实战-wordpress——玄机靶场
  • 在C++上实现反射用法
  • ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案