【机器学习】深入无监督学习分裂型层次聚类的原理、算法结构与数学基础全方位解读,深度揭示其如何在数据空间中构建层次化聚类结构

 🌟个人主页:落叶

 🌟当前专栏: 机器学习专栏


目录

引言

分裂型层次聚类(Divisive Hierarchical Clustering)

1. 基本原理

2. 分裂型层次聚类的算法步骤

Step 1: 初始化

Step 2: 选择分裂的簇

Step 3: 执行分裂操作

Step 4: 计算分裂后的效果

Step 5: 递归进行分裂

Step 6: 构建树形结构

 分裂型层次聚类数学描述与公式

3. 优缺点

优点:

缺点:

5. 示例

 4.分裂型层次聚类 Python 代码实现

代码解析

主要步骤:

示例输出

总结


引言

分裂型层次聚类(Divisive Hierarchical Clustering,简称DHC)是一种自上而下的聚类方法,它通过从一个包含所有数据点的大簇开始,逐步将其分裂成更小的簇,直到每个簇只包含一个数据点或满足某个停止条件为止。与自下而上的凝聚型层次聚类(Agglomerative Hierarchical Clustering)不同,分裂型层次聚类的过程是逐步分裂而非逐步合并。

好的,让我们更加深入和详细地探讨 分裂型层次聚类(Divisive Hierarchical Clustering),包括算法的每一步、公式的推导过程,以及如何具体实施分裂型聚类的数学框架。

分裂型层次聚类(Divisive Hierarchical Clustering)

分裂型层次聚类是一种自上而下的聚类方法,其基本思想是从一个包含所有数据点的簇开始,逐步将该簇划分为更小的子簇,直到每个子簇包含一个数据点为止。每次分裂时,选择一个簇进行分裂,直到达到停止条件。

1. 基本原理

分裂型层次聚类的核心思路是自上而下的聚类过程:

  1. 初始化:将所有数据点放在一个簇中,即把整个数据集视为一个簇。
  2. 选择分裂点:在每一轮分裂时,选择一个簇并将其分裂为两个子簇。分裂的标准可以基于某些度量(如最小化误差平方和,SSE)。
  3. 分裂操作:通过某种方法(如K-means聚类、主成分分析等)将选择的簇分成两个子簇。
  4. 递归分裂:对每一个新的簇重复执行分裂操作,直到满足停止条件(如簇的大小小于某个阈值)。

2. 分裂型层次聚类的算法步骤

分裂型层次聚类算法可以通过以下步骤描述:C_k^{(2)}

Step 1: 初始化

  • 将所有数据点视为一个单一的簇 C0C_0(包含所有数据点)。

Step 2: 选择分裂的簇

  • 选择一个簇 CkC_k(通常选择数据量较大的簇)进行分裂。

Step 3: 执行分裂操作

  • K-means:对簇 C_k 应用 K-means 算法,将其分成两个簇 C_k^{(1)}C_k^{(2)}

    K-means算法目标是最小化以下误差平方和(SSE):

    \text{SSE} = \sum_{i=1}^{N_k} \| x_i - \mu_1 \|^2 + \sum_{i=1}^{M_k} \| x_i - \mu_2 \|^2

    其中:

    • N_kM_k 分别是簇 C_k^{(1)}C_k^{(2)}中数据点的数量。
    • \mu_1 和 μ2\mu_2 分别是 mu_2 和 Ck(2)C_k^{(2)} 的均值。
  • 其他分裂方法可能包括基于**主成分分析(PCA)高斯混合模型(GMM)**来选择分裂方式。

Step 4: 计算分裂后的效果

  • 通过计算簇间的距离或相似度来评估当前分裂的质量。常用的距离度量包括欧几里得距离、曼哈顿距离等。

    欧几里得距离

    d(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}

    其中 x 和 y 是两个数据点,n 是数据的维度。

Step 5: 递归进行分裂

  • 对每一个新的子簇 C_k^{(1)}C_k^{(2)} 继续进行分裂操作,直到每个簇只有一个数据点,或直到满足某个终止条件(如簇内的数据点数小于阈值)。

Step 6: 构建树形结构

  • 每次分裂会生成一个新节点,这些节点将会构成一个树形层次结构(如一棵二叉树)。根节点表示整个数据集,叶节点表示单个数据点。

 分裂型层次聚类数学描述与公式

  1. 簇内误差平方和(SSE)

    对于簇 C_k,它的SSE是数据点到簇中心(均值)的距离的平方和:

    \text{SSE}(C_k) = \sum_{i \in C_k} \| x_i - \mu_k \|^2

    其中:

    •  x_i 是簇 C_k中的一个数据点。
    • \mu_k 是簇 C_k 的均值(中心点)。
  2. 分裂操作

    使用 K-means 算法来分裂簇 C_k。K-means 目标是最小化每个簇的 SSE,总体SSE最小化目标为:

    \text{SSE}_{\text{total}} = \sum_{k=1}^{K} \text{SSE}(C_k)

    其中 KK 是簇的数量。每次分裂操作都会选择一种方法(如 K-means)来最小化当前簇的 SSE,从而实现最优的分裂。

  3. 簇间距离

    分裂型层次聚类有时还会考虑簇间的相似度或距离来指导分裂,常用的度量包括:

    • 最小距离法(Single Linkage):簇间的距离是两个簇中最小距离的点对之间的距离。
    • 最大距离法(Complete Linkage):簇间的距离是两个簇中最远点对之间的距离。
    • 平均距离法(Average Linkage):簇间的距离是两个簇内所有点对的平均距离。

3. 优缺点

优点:
  • 直观的层次结构:分裂型层次聚类自然生成树形结构,能够很好地展示数据的层次关系。
  • 不需要预设簇的数量:与 K-means 等方法不同,分裂型层次聚类不需要预设簇数,用户可以根据树状图的层次决定聚类数量。
  • 适合具有层次结构的数据:如果数据本身存在较明显的层次结构,分裂型层次聚类能够很好地捕捉这种结构。
缺点:
  • 计算复杂度较高:每次分裂时都需要计算簇内数据点的距离,这在数据量大时计算代价较高,特别是在簇数较多时。
  • 对噪声敏感:如果数据中包含大量噪声点,分裂型层次聚类可能会错误地进行分裂,导致不合理的聚类结果。

5. 示例

假设我们有一个二维数据集:

{(1,2),(1,3),(10,10),(10,11)}\{(1, 2), (1, 3), (10, 10), (10, 11)\}

  1. 初始簇:将所有点视为一个簇 C0={(1,2),(1,3),(10,10),(10,11)}C_0 = \{(1, 2), (1, 3), (10, 10), (10, 11)\}。

  2. 第一步分裂

    • 使用 K-means 对簇 C0C_0 进行分裂,分裂为两个簇:
      • 簇1:{(1, 2), (1, 3)}
      • 簇2:{(10, 10), (10, 11)}
  3. 递归分裂

    • 对簇1进行分裂,数据点之间距离很近,无法再分裂。
    • 对簇2进行分裂,同样,数据点之间距离很近,无法继续分裂。

最终得到的聚类结果为两个簇:

  • 簇1:{(1, 2), (1, 3)}
  • 簇2:{(10, 10), (10, 11)}

下面是一个简单的分裂型层次聚类算法的 Python 代码实现。该实现基于 K-means 聚类算法来分裂每个簇,并递归地进行分裂,直到每个簇包含一个数据点为止。


 4.分裂型层次聚类 Python 代码实现

 在这个实现中,我们使用了 scikit-learn 库中的 KMeans 聚类算法。你需要安装 scikit-learn 库来运行以下代码。

pip install scikit-learn

  Python 代码实现

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 计算簇内误差平方和 (SSE)
def compute_sse(X, labels, centers):
    sse = 0
    for i in range(len(centers)):
        cluster_points = X[labels == i]
        sse += np.sum((cluster_points - centers[i]) ** 2)
    return sse

# K-means 分裂操作
def split_cluster(X, cluster):
    kmeans = KMeans(n_clusters=2, random_state=42).fit(X[cluster])
    labels = kmeans.labels_
    centers = kmeans.cluster_centers_
    sse = compute_sse(X[cluster], labels, centers)
    return labels, centers, sse

# 分裂型层次聚类主函数
def divisive_hierarchical_clustering(X, min_cluster_size=1):
    clusters = [np.arange(len(X))]  # 初始簇包含所有数据点
    tree = []  # 保存分裂的层次结构
    while len(clusters) > 0:
        # 从簇列表中选择一个簇进行分裂
        current_cluster = clusters.pop(0)
        
        # 如果簇的大小小于最小簇大小,则停止分裂
        if len(current_cluster) <= min_cluster_size:
            continue

        # 对当前簇进行 K-means 分裂
        labels, centers, sse = split_cluster(X, current_cluster)
        
        # 将分裂结果添加到层次树中
        tree.append((current_cluster, labels, centers))

        # 根据分裂结果生成两个新的子簇
        cluster1 = current_cluster[labels == 0]
        cluster2 = current_cluster[labels == 1]

        # 将子簇加入待分裂簇的列表
        clusters.append(cluster1)
        clusters.append(cluster2)

    return tree

# 绘制数据点及其聚类结果
def plot_clusters(X, tree):
    for i, (cluster, labels, centers) in enumerate(tree):
        plt.figure(figsize=(6, 6))
        plt.scatter(X[:, 0], X[:, 1], c='gray', alpha=0.5, label="All Data Points")
        plt.scatter(X[cluster, 0], X[cluster, 1], c=labels, cmap='viridis', label=f'Cluster {i + 1}')
        plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x', s=200, label='Centroids')
        plt.legend()
        plt.title(f"Cluster {i + 1} with K-means split")
        plt.show()

# 示例数据生成
from sklearn.datasets import make_blobs

# 生成随机数据
X, _ = make_blobs(n_samples=100, centers=3, random_state=42)

# 调用分裂型层次聚类算法
tree = divisive_hierarchical_clustering(X, min_cluster_size=5)

# 绘制每一步的聚类结果
plot_clusters(X, tree)

代码解析

  1. compute_sse:计算给定簇内的误差平方和(SSE),用来衡量聚类质量。
  2. split_cluster:对一个簇应用 K-means 算法,将其分裂成两个子簇。返回每个子簇的标签、质心和SSE。
  3. divisive_hierarchical_clustering:实现了分裂型层次聚类的核心功能。首先将所有数据点作为一个大簇进行分裂,接着通过递归方法将簇分裂成更小的簇,直到每个簇的大小小于指定的最小簇大小(min_cluster_size)。
  4. plot_clusters:绘制每一步的聚类结果,展示不同层次分裂的效果。

主要步骤:

  • 初始时,所有数据点都属于一个簇。
  • 递归地对每个簇进行 K-means 分裂,直到簇内的数据点数小于 min_cluster_size
  • 在每次分裂后,保存每个簇的结果和分裂过程。

示例输出

在执行代码时,程序将会生成数据点并通过分裂型层次聚类进行分裂,最后绘制出每一步分裂后的聚类效果。每一张图展示了数据点如何在每一轮分裂过程中被分配到不同的簇中,同时标出每个簇的质心。

总结

这个代码展示了如何通过 K-means 聚类方法实现 分裂型层次聚类。每次分裂都是基于当前簇的质心,通过最小化误差平方和(SSE)来划分成两个子簇。你可以通过调整 min_cluster_size 参数来控制分裂的停止条件,进而决定最终聚类的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox can‘t enable the AMD-V extension

个人博客地址&#xff1a;VirtualBox cant enable the AMD-V extension | 一张假钞的真实世界 最近一次完成Deepin的系统更新后&#xff0c;进入VirtualBox创建的虚拟机&#xff08;Widows10&#xff09;时&#xff0c;出现以下错误&#xff1a; 根据网址“https://askubuntu.…

[JavaScript] 数组与对象详解

文章目录 数组&#xff08;Array&#xff09;什么是数组数组的常用操作**访问数组元素****修改数组元素****数组的长度****添加和删除元素** 常用数组方法map():filter():reduce():**其他实用方法** 对象&#xff08;Object&#xff09;什么是对象对象的基本操作**访问属性****…

“模板”格式化发布新创诗(为《诗意 2 0 2 5》贡献力量)

预置MarkDown&Html文本&#xff0c;脚本读取f-string模板完成录入嵌套。 (笔记模板由python脚本于2025-01-22 19:19:58创建&#xff0c;本篇笔记适合喜欢分享的达人的coder翻阅) 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不…

论文速读|Multi-Modal Disordered Representation Learning Network for TBPS.AAAI24

论文地址&#xff1a;Multi-Modal Disordered Representation Learning Network for Description-Based Person Search 代码地址&#xff1a;未开源&#xff08;2025.01.22&#xff09; bib引用&#xff1a; inproceedings{yang2024multi,title{Multi-Modal Disordered Repres…

计算机视觉算法实战——实体物体跟踪

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​ ​ 1. 领域介绍✨✨ 实体物体跟踪&#xff08;Object Tracking&#xff09;是计算机视觉领域中的一个重要研究方向&#x…

C++17 新特性深入解析:constexpr 扩展、if constexpr 和 constexpr lambda

C17 不仅增强了现有特性&#xff0c;还引入了一些全新的编程工具&#xff0c;极大地提升了代码的效率和表达力。在这篇文章中&#xff0c;我们将深入探讨 C17 中与 constexpr 相关的三个重要特性&#xff1a;constexpr 的扩展用法、if constexpr 和 constexpr lambda。这些特性…

IVR:交互式语音应答系统解析及其应用

引言 IVR&#xff08;Interactive Voice Response&#xff09;&#xff0c;即交互式语音应答系统&#xff0c;是一种功能强大的电话自动服务系统。它通过语音识别和按键反馈&#xff0c;使用户与系统之间实现实时交互&#xff0c;为用户提供自助服务、咨询、报告、投诉等多种功…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…

【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项

文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 一、SD卡 速读 SD卡&#xff0c;全称Secure Digital M…

大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》

摘要 预训练的大语言模型&#xff08;LLMs&#xff09;近年来在自主网页自动化方面实现了更好的泛化能力和样本效率。然而&#xff0c;在真实世界的网站上&#xff0c;其性能仍然受到以下问题的影响&#xff1a;(1) 开放领域的复杂性&#xff0c;(2) 有限的上下文长度&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序&#x1f388;3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一&#xff0c;每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法&#xff0c;排序后的数据更易于处理和查找。在计算机发展…

【Elasticsearch】腾讯云安装Elasticsearch

Elasticsearch 认识Elasticsearch安装Elasticsearch安装Kibana安装IK分词器分词器的作用是什么&#xff1f;IK分词器有几种模式&#xff1f;IK分词器如何拓展词条&#xff1f;如何停用词条&#xff1f; 认识Elasticsearch Elasticsearch的官方网站如下 Elasticsearch官网 Ela…

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …

python创建一个httpServer网页上传文件到httpServer

一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…

一个软件分发和下载的网站源码,带多套模板

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程 代码下载&#xff1a;百度网盘

前端面试题-问答篇-5万字!

1. 请描述CSS中的层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;规则&#xff0c;以及它们在实际开发中的应用。 在CSS中&#xff0c;层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;是两个关键的规则&#x…

面试:Hadoop,块,HDFS的优缺点,HDFS的读写流程

Hadoop CDH会简化Hadoop的安装 Hue主要用于数据分析和处理&#xff0c;而CM(Cloudera Manager)则主要用于集群的管理和运维。 HDFS HDFS的块 块是 HDFS 系统当中的最小存储单位, 在hadoop2.0和3.0中默认128MB 在HDFS上的文件会被拆分成多个块&#xff0c;每个块作为独立的单…

Stable Diffusion 3.5 模型在 Linux 上的部署指南

文章目录 前言-参考资料如下一. ComfyUI安装二.模型下载2.1 安装GGUF和T5 xxl编码模型2.2 安装ComfyUI辅助插件2.3 启动ComfyUI2.4 基础ComfyUI和SD3.5配置2.5 demo 前言-参考资料如下 ComfyUI WIKI教程 sd3.5 github 尝试过sd集成ollama&#xff0c;但是sd在ollama上无法良好…