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

层次聚类(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.mzph.cn/pingmian/68616.shtml

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

相关文章

mysql的测试方案

1. 测试目标与范围 1.1 性能测试目标 MySQL性能测试旨在评估数据库在不同负载条件下的响应速度、吞吐量和资源利用率&#xff0c;确保其能够满足业务需求。 响应时间&#xff1a;衡量查询和事务处理的延迟&#xff0c;目标是将平均响应时间控制在100毫秒以内&#xff0c;95%的…

JavaScript 进阶(下)

原型 what 首先&#xff0c;构造函数通过原型分配的函数是所有对象所 共享的。 然后&#xff0c;JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象 这个对象可以挂载函数&#xff0c;对象实…

Python数据分析-Python的数据结构、函数和文件(三)

title: ‘Python数据分析:Python的数据结构、函数和文件&#xff08;三&#xff09;’ abbrlink: 22313 date: 2023-08-01 18:55:20 updated: 2023-0803 12:34:39 tags: python数据分析 categories:python数据分析 keywords:python数据分析 cover: …/img/404_icecream_whale.…

Effective Objective-C 2.0 读书笔记—— 消息转发

Effective Objective-C 2.0 读书笔记—— 消息转发 文章目录 Effective Objective-C 2.0 读书笔记—— 消息转发前言消息转发机制概述动态方法解析处理dynamic的属性用于懒加载 消息转发快速消息转发完整消息转发 总结 前言 在前面我学习了关联对象和objc_msgSend的相关内容&a…

Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)

struct STRUCT&#xff08;结构体&#xff09;是一种复合数据类型&#xff0c;它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据&#xff0c;例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…

嵌入式知识点总结 Linux驱动 (二)-uboot bootloader

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.什么是bootloader&#xff1f; 2.Bootloader的两个阶段 3.uboot启动过程中做了哪些事&#xff1f; 4.uboot和内核kernel如何完成参数传递&#xff1f; 5.为什么要给内核传递…

实战技巧:如何快速提高网站的收录比例?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/28.html 快速提高网站的收录比例是网站优化中的重要目标之一。以下是一些实战技巧&#xff0c;可以帮助你实现这一目标&#xff1a; 一、内容优化 高质量原创内容&#xff1a; 确保网站内…

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…

碳化硅MOSFET相对IGBT和超结MOSFET出现价格倒挂预示着什么

碳化硅&#xff08;SiC&#xff09;MOSFET相对于IGBT和超结MOSFET出现价格倒挂&#xff08;即SiC MOSFET单价低于传统硅基器件&#xff09;&#xff0c;这一现象反映了化合物半导体产业的深刻变革&#xff0c;并预示着技术、市场和产业链格局的多重演变。倾佳电子杨茜从技术突破…

openRv1126 AI算法部署实战之——TensorFlow TFLite Pytorch ONNX等模型转换实战

Conda简介 查看当前系统的环境列表 conda env list base为基础环境 py3.6-rknn-1.7.3为模型转换环境&#xff0c;rknn-toolkit版本V1.7.3&#xff0c;python版本3.6 py3.6-tensorflow-2.5.0为tensorflow模型训练环境&#xff0c;tensorflow版本2.5.0&#xff0c;python版本…

人工智能丨基于机器学习的视觉 CV 处理技术

从自动驾驶汽车到面部识别系统&#xff0c;CV无处不在&#xff0c;赋予计算机“看”的能力。无论是图像处理、模式识别&#xff0c;还是视频分析&#xff0c;机器学习都是推动这些技术进步的核心动力。这篇文章将深入探讨基于机器学习的计算机视觉处理技术&#xff0c;包括它的…

理解PLT表和GOT表

1 简介 现代操作系统都是通过库来进行代码复用&#xff0c;降低开发成本提升系统整体效率。而库主要分为两种&#xff0c;一种是静态库&#xff0c;比如windows的.lib文件&#xff0c;macos的.a&#xff0c;linux的.a&#xff0c;另一种是动态库&#xff0c;比如windows的dll文…

【java学习笔记】@Autowired注解 使用方法和作用 | 配合@Component注解使用 | IOC控制反转

原本在类中&#xff0c;要用什么对象&#xff0c;就直接new一个对象。这种原始的方式 是由应用本身去控制实例的。 用了Autowired注解后&#xff0c;就相当于把实例&#xff08;对象&#xff09;的控制权 交给外部容器来统一管理&#xff08;降低耦合&#xff09;。&#xff08…

LabVIEW无线齿轮监测系统

本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机&#xff0c;实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件&#xff0c;可以实现对齿轮箱振动信号的采集、传输和故障识别&#xff0c;集远程采集、数据库存储…

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…

jQuery小游戏(一)

jQuery小游戏&#xff08;一&#xff09; 嘻嘻&#xff0c;今天我们来写个jquery小游戏吧 首先&#xff0c;我们准备一下写小游戏需要准备的佩饰&#xff0c;如果&#xff1a;图片、音乐、搞怪的小表情 这里我准备了一些游戏中需要涉及到的图片 游戏中使用到的方法 eval() 函…

H3CNE-28-VRRP

虚拟网关冗余协议&#xff0c;Virtual Router Redundancy Protocotol 三层网关冗余技术对用户网关做冗余 VRRP配置示例 接口IP配置&#xff0c;略。 R1&#xff1a; int g0/0vrrp vrid 1 virtual 192.168.1.254vrrp vrid 1 priority 105 # 1-254,越大越优先R2&#xff1a; …

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 官方说明书 https://support.hyland.com/r/Alfresco/Alfresco-Content-Services-Community-Edition/23.4/Alfresco-Content-Services-Community-Edition/Using/Content/Folder-rules/Defining-…

rust feature h和 workspace相关知识 (十一)

feature 相关作用和描述 在 Rust 中&#xff0c;features&#xff08;特性&#xff09; 是一种控制可选功能和依赖的机制。它允许你在编译时根据不同的需求启用或禁用某些功能&#xff0c;优化构建&#xff0c;甚至改变代码的行为。Rust 的特性使得你可以轻松地为库提供不同的…