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

层次聚类(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.rhkb.cn/news/9496.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS从入门到精通 第十四章(队列集)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 &#xff08;1&#xff09;一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者&#xff1a;本人是一名县级融媒体中心的工程师&#xff0c;多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展&#xff0c;文字转语音&#xff08;Te…

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐&#xff01; 接之前wiki 35、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;五&#xff09; 已经分析完了第一个测试项&#xff0c;输入输出端口测试&#xff0c;接下来分析下环境变量测试&#xff0c;也比较…

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…

Base64详解

文章目录 Base64详解一、引言二、Base64编码原理1、Base64的基本概念2、编码过程2.1、分组与填充2.2、二进制转换2.3、字符映射 三、Base64解码原理四、使用示例1、Java实现Base64编码2、Java实现Base64解码 五、总结 Base64详解 一、引言 Base64是一种常见的编码方式&#xf…

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

消息队列篇--通信协议篇--应用层协议和传输层协议理解

在网络通信中&#xff0c;传输层协议和应用层协议是OSI模型中的两个不同层次的协议&#xff0c;它们各自承担着不同的职责。 下文中&#xff0c;我们以TCP/UDP&#xff08;传输层协议&#xff09;和HTTP/SMTP&#xff08;应用层协议&#xff09;为例进行详细解释。 1、传输层协…

团体程序设计天梯赛-练习集——L1-025 正整数A+B

一年之际在于春&#xff0c;新年的第一天&#xff0c;大家敲代码了吗&#xff1f;哈哈 前言 这道题分值是15分&#xff0c;值这个分&#xff0c;有一小点运算&#xff0c;难度不大&#xff0c;虽然说做出来了&#xff0c;但是有两个小疑点。 L1-025 正整数AB 题的目标很简单…

登录授权流程

发起一个网络请求需要&#xff1a;1.请求地址 2.请求方式 3.请求参数 在检查中找到request method&#xff0c;在postman中设置同样的请求方式将登录的url接口复制到postman中&#xff08;json类型数据&#xff09;在payload中选择view parsed&#xff0c;将其填入Body-raw中 …

护眼好帮手:Windows显示器调节工具

在长时间使用电脑的过程中&#xff0c;显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐&#xff0c;而且在低亮度下容易导致色彩失真。因此&#xff0c;今天我想为大家介绍一款适用于Windows系统的护眼工具&#xff0c;它可以帮助你轻松调节显…

51单片机开发:独立键盘实验

实验目的&#xff1a;按下键盘1时&#xff0c;点亮LED灯1。 键盘原理图如下图所示&#xff0c;可见&#xff0c;由于接GND&#xff0c;当键盘按下时&#xff0c;P3相应的端口为低电平。 键盘按下时会出现抖动&#xff0c;时间通常为5-10ms&#xff0c;代码中通过延时函数delay…

数字化转型-工具变量(2024.1更新)-社科数据

数字化转型-工具变量&#xff08;2024.1更新&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028604https://download.csdn.net/download/paofuluolijiang/90028604 https://download.csdn.net/download/paofuluolijiang/90028604 数字化转型是企…

Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程

一、问题描述 在使用 Maven 管理项目依赖时&#xff0c;遇到了一个棘手的问题。具体表现为&#xff1a;在 pom.xml 文件中导入了所需的依赖&#xff0c;并且在 IDE 中导入语句没有显示为红色&#xff08;表示 IDE 没有提示依赖缺失&#xff09;&#xff0c;但是在实际使用这些依…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代&#xff0c;语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践&#xff0c;详细探讨这一过程中的技术细节、操作步骤以及实践价值。 一、实验背景与目标 …

AI大模型开发原理篇-2:语言模型雏形之词袋模型

基本概念 词袋模型&#xff08;Bag of Words&#xff0c;简称 BOW&#xff09;是自然语言处理和信息检索等领域中一种简单而常用的文本表示方法&#xff0c;它将文本看作是一组单词的集合&#xff0c;并忽略文本中的语法、词序等信息&#xff0c;仅关注每个词的出现频率。 文本…

创作三载·福启新章2025

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言机缘收获日常憧憬 总结 前言 在2022年01月26日&#xff0c;我踏上了技术创作的征…

论文阅读(十四):贝叶斯网络在全基因组DNA甲基化研究中的应用

1.论文链接&#xff1a;Bayesian Networks in the Study of Genome-wide DNA Methylation 摘要&#xff1a; 本章探讨了贝叶斯网络在基因组规模的脱氧核糖核酸&#xff08;DNA&#xff09;甲基化研究中的应用。它首先描述了DNA甲基化的基因组规模注释的不同实验方法。详细介绍…