层次聚类构建层次结构的簇

news2025/2/1 3:56:09

层次聚类(Hierarchical Clustering)可以通过自定义函数来完成。层次聚类可以分为两种方法:凝聚型(Agglomerative)和分裂型(Divisive)。这里主要介绍一种常用的凝聚型方法,它是自底向上的方法,逐步合并最近的簇,直到达到预定的簇数量或者所有数据点合并成一个簇。

可以使用距离度量来衡量不同簇之间的相似性(例如欧氏距离),并通过最短距离来决定哪些簇合并。最终,我们将通过构建一个层次结构树(Dendrogram)来表示这种簇的合并过程。

层次聚类的步骤:

  1. 初始化:将每个数据点视为一个单独的簇。
  2. 计算距离矩阵:计算各簇之间的距离。
  3. 合并簇:选择最相似(最小距离)的簇进行合并。
  4. 更新距离矩阵:合并簇后重新计算距离矩阵。
  5. 重复步骤 3 和 4,直到只剩下一个簇或达到预定的簇数量。

例子代码:

import torch
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import dendrogram, linkage


# 计算簇之间的距离(欧氏距离)
def compute_distance_matrix(X):
    return squareform(pdist(X, 'euclidean'))


# 凝聚型层次聚类
def agglomerative_clustering(X, num_clusters=1):
    # 初始每个点为一个簇
    clusters = [[i] for i in range(X.shape[0])]

    # 计算初始距离矩阵
    dist_matrix = compute_distance_matrix(X)

    # 逐步合并簇直到达到预定的簇数
    while len(clusters) > num_clusters:
        # 找到距离最小的簇对
        min_dist_idx = np.unravel_index(np.argmin(dist_matrix + np.eye(len(dist_matrix)) * np.inf), dist_matrix.shape)
        i, j = min_dist_idx

        # 合并这两个簇
        new_cluster = clusters[i] + clusters[j]

        # 删除旧簇
        if i > j:
            clusters.pop(i)
            clusters.pop(j)
        else:
            clusters.pop(j)
            clusters.pop(i)

        # 更新距离矩阵
        # 计算新簇与所有其他簇的距离
        new_distances = []
        for k in range(len(dist_matrix)):
            if k != i and k != j:
                dist_i = dist_matrix[k][i] if k < i else dist_matrix[k][i - 1]
                dist_j = dist_matrix[k][j] if k < j else dist_matrix[k][j - 1]
                new_distances.append(min(dist_i, dist_j))

        new_distances = np.array(new_distances)

        # 生成新的距离矩阵
        dist_matrix = np.delete(dist_matrix, [i, j], axis=0)
        dist_matrix = np.delete(dist_matrix, [i, j], axis=1)

        # 在 dist_matrix 的末尾添加新簇的距离
        dist_matrix = np.vstack([dist_matrix, new_distances])  # 添加新行
        new_distances = np.append(new_distances, 0)  # 为了和列对齐,添加最后一列
        dist_matrix = np.column_stack([dist_matrix, new_distances])  # 添加新列

        # 打印当前簇的数量
        print(f'当前簇数量:{len(clusters)}')
        print(f'簇结构:{clusters}')

    return clusters


# 生成更多的示例数据:50个二维数据点
np.random.seed(42)
X_np = np.random.rand(50, 2) * 10  # 50个数据点,数据范围在[0, 10]

# 聚类成5个簇
num_clusters = 5
clusters = agglomerative_clustering(X_np, num_clusters=num_clusters)

# 将每个数据点分配到对应的簇
labels = np.zeros(X_np.shape[0])
for idx, cluster in enumerate(clusters):
    for i in cluster:
        labels[i] = idx

# 可视化结果
plt.figure(figsize=(8, 6))

# 按照簇分配颜色
for cluster_idx in range(num_clusters):
    cluster_points = X_np[labels == cluster_idx]  # 使用 NumPy 数组进行索引
    plt.scatter(cluster_points[:, 0], cluster_points[:, 1], label=f"Cluster {cluster_idx + 1}")

plt.title(f'Agglomerative Clustering with {num_clusters} Clusters')
plt.xlabel('X1')
plt.ylabel('X2')
plt.legend()
plt.show()

# 画出层次聚类树状图
linked = linkage(X_np, 'ward')

plt.figure(figsize=(10, 7))
dendrogram(linked)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践

引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…

渲染流程概述

渲染流程包括 CPU应用程序端渲染逻辑 和 GPU渲染管线 一、CPU应用程序端渲染逻辑 剔除操作对物体进行渲染排序打包数据调用Shader SetPassCall 和 Drawcall 1.剔除操作 视椎体剔除 &#xff08;给物体一个包围盒&#xff0c;利用包围盒和摄像机的视椎体进行碰撞检测&#xf…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类&#xff0c; auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误&#xff1a; end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…

2025年01月28日Github流行趋势

项目名称&#xff1a;maybe 项目地址url&#xff1a;https://github.com/maybe-finance/maybe项目语言&#xff1a;Ruby历史star数&#xff1a;37540今日star数&#xff1a;1004项目维护者&#xff1a;zachgoll, apps/dependabot, tmyracle, Shpigford, crnsh项目简介&#xff…

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎&#xff0c;能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中&#xff0c;Ollama是一个非常方便的工具&#xff0c;它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

单片机基础模块学习——超声波传感器

一、超声波原理 左边发射超声波信号&#xff0c;右边接收超声波信号 左边的芯片用来处理超声波发射信号&#xff0c;中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大&#xff0c;然后输入给超声…

使用 OpenResty 构建高效的动态图片水印代理服务20250127

使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代&#xff0c;图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象&#xff0c;动态图片水印功能显得尤为重要。然而&#xff0c;直接在后端服务中集成水印功能&#xff0c;往往会带来代码复杂度增加、…

Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性

作者&#xff1a;来 Elastic Valerio Arvizzigno, Geetha Anne 及 Jeremy Hogan 介绍 Elastic Agent 的新功能&#xff1a;原生输出到 Kafka。借助这一最新功能&#xff0c;Elastic 用户现在可以轻松地将数据路由到 Kafka 集群&#xff0c;从而实现数据流和处理中无与伦比的可扩…

Elasticsearch 性能测试工具 Loadgen 之 002——命令行及参数详解

上一讲&#xff0c;我们讲解了 Loadgen 的极简部署方式、配置文件、快速使用从 0 到 1 方式。 本讲&#xff0c;我们主要解读一下 Loadgen 的丰富的命令行及参数含义。 有同学可能会说&#xff0c;上面不是介绍很清楚了吗&#xff1f;但&#xff0c;咱们还是有必要详细中文解读…

书生大模型实战营3

文章目录 L0——入门岛git基础Git 是什么&#xff1f;Git 中的一些基本概念工作区、暂存区和 Git 仓库区文件状态分支主要功能 Git 平台介绍GitHubGitLabGitee Git 下载配置验证下载 Git配置 Git验证 Git配置 Git常用操作Git简易入门四部曲Git其他指令 闯关任务任务1: 破冰活动…

【玩转全栈】----靓号管理系统实现

先赞后看&#xff0c;养成习惯。。。 目录 数据库设置 基本功能 路由器 靓号显示 靓号添加 靓号编辑 视图函数 额外功能 搜索功能 分页 一般逻辑 动态页码 上下页 首尾页 数据库设置 新建一个数据库&#xff08;或者就用之前部门、用户管理的也行&#xff09;&#xff0c;用Dja…

【Attention】KV Cache

1 什么是KV Cache&#xff1f; 定义&#xff1a;KV Cache 即 Key-Value Cache&#xff0c;是用于加速 Transformer 模型推理长序列过程的一种技术。 核心原理&#xff1a;在 Transformer 的自注意力机制中&#xff0c;将历史输入 token 中的 Key 和 Value 缓存下来&#xff0c…

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除&#xff0c;开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含&#xff1a;程序&…

【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)

祈愿在2025蛇年里&#xff0c; 伟大的祖国风调雨顺、国泰民安、每个人齐心协力&#xff0c;共同经历这百年未有之大变局时代&#xff08;国际政治、AI技术……&#xff09; 祝福亲友同事孩子们平安健康&#xff08;安全、安全、安全&#xff09;、巳巳如意&#xff01; 背景需…

leetcode——二叉树的最大深度(java)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输…

Java创建项目准备工作

新建项目 新建空项目 每一个空项目创建好后都要检查jdk版本 检查SDK和语言级别——Apply——OK 检查当前项目的Maven路径&#xff0c;如果已经配置好全局&#xff0c;就是正确路径不用管 修改项目字符集编码&#xff0c;将所有编码都调整为UTF-8 创建Spingboot工程 创建Spring…

汽车免拆诊断案例 | 2007 款日产天籁车起步加速时偶尔抖动

故障现象  一辆2007款日产天籁车&#xff0c;搭载VQ23发动机&#xff08;气缸编号如图1所示&#xff0c;点火顺序为1-2-3-4-5-6&#xff09;&#xff0c;累计行驶里程约为21万km。车主反映&#xff0c;该车起步加速时偶尔抖动&#xff0c;且行驶中加速无力。 图1 VQ23发动机…

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式&#xff0c;详见下文&#xff1a; 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次&#xff0c;点…

单片机基础模块学习——PCF8591芯片

一、A/D、D/A模块 A——Analog 模拟信号:连续变化的信号(很多传感器原始输出的信号都为此类信号)D——Digital 数字信号:只有高电平和低电平两种变化(单片机芯片、微控制芯片所能处理的都是数字信号) 下面是模拟信号和连续信号的区别 为什么需要进行模拟信号和数字信号之…