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

学习日记_20241126_聚类方法(谱聚类Spectral Clustering)

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

文章目录

  • 前言
  • 聚类算法
    • 经典应用场景
    • 谱聚类(Spectral Clustering)
      • 优点
      • 缺点
      • 总结
      • 简单实例(函数库实现)
      • 数学表达
        • 基本步骤
      • 手动实现


聚类算法

聚类算法在各种领域中有广泛的应用,主要用于发现数据中的自然分组和模式。以下是一些常见的应用场景以及每种算法的优缺点:

经典应用场景

  1. 市场细分:根据消费者的行为和特征,将他们分成不同的群体,以便进行有针对性的营销。

  2. 图像分割: 将图像划分为多个区域或对象,以便进行进一步的分析或处理。

  3. 社交网络分析:识别社交网络中的社区结构。

  4. 文档分类:自动将文档分组到不同的主题或类别中。

  5. 异常检测识别数据中的异常点或异常行为。

  6. 基因表达分析:在生物信息学中,根据基因表达模式对基因进行聚类。

谱聚类(Spectral Clustering)

谱聚类(Spectral Clustering)是一种基于图论和线性代数的聚类方法,广泛应用于处理复杂的聚类结构。下面是谱聚类的优缺点概述:

优点

  1. 能够识别任意形状的聚类:与传统的基于距离的聚类方法(如 K-Means)不同,谱聚类能够处理形状复杂的聚类。它通过构建图和分析其特征向量,可以捕捉到非凸形状的聚类。

  2. 利用全局信息:谱聚类通过计算数据点之间的相似性矩阵,从而考虑了数据的全局结构,而不仅仅是局部邻域的信息,能更好地捕捉到数据的内在关系。

  3. 降维能力: 谱聚类利用特征值分解可以有效地将高维数据映射到低维空间,这对于高维数据集尤其重要,可以减少噪声和冗余特征的影响。

  4. 灵活性强:可以通过选择不同的相似性度量和距离函数,适应不同类型的数据和聚类需求。

缺点

  1. 计算复杂度高:谱聚类的计算通常涉及特征值分解或奇异值分解,其计算复杂度为 O ( n 3 ) O(n^3) O(n3),其中 n n n 是数据点的数量。因此在大规模数据集上,谱聚类可能会变得非常耗时和资源密集。

  2. 对参数敏感:谱聚类的效果可能对参数(如相似性矩阵的构建方式、聚类数目等)非常敏感。选择合适的参数可能需要经验和调试。

  3. 对噪声和异常值敏感:谱聚类对噪声和异常值较为敏感,这些点可能会影响相似性矩阵的构建,导致聚类结果不理想。

  4. 需要预定义聚类数:与许多聚类算法一样,谱聚类通常需要事先指定要生成的聚类数量,这在实际应用中可能不够灵活。

  5. 可解释性差:尽管谱聚类能够产生良好的聚类效果,但其结果的可解释性相对较差,尤其是在高维数据中,难以直观理解聚类的形成原因。

总结

谱聚类是一种强大而灵活的聚类方法,特别适合处理复杂和非线性的数据分布。然而,其高计算复杂度和对参数的敏感性限制了其在某些应用中的实用性。在选择聚类方法时,需要根据实际数据的特点和聚类的需求权衡这些优缺点。

简单实例(函数库实现)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import SpectralClustering# 生成模拟数据:两个半月形状的聚类
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)# 使用谱聚类进行聚类
n_clusters = 2  # 指定要生成的聚类数量
spectral_clustering = SpectralClustering(n_clusters=n_clusters, affinity='nearest_neighbors', random_state=42)
labels = spectral_clustering.fit_predict(X)# 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)
plt.title('Spectral Clustering of Moons Dataset')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

data数据分布与代码运行结果:
数据生成介绍:学习日记_20241115_聚类方法(DBSCAN)
可参考该博客简“简单实例(函数库实现)”部分。
结果:
在这里插入图片描述

数学表达

谱聚类(Spectral Clustering)是一种基于图论的聚类方法,它通过将数据点看作图中的节点,并利用图中的谱(即图的拉普拉斯矩阵的特征值和特征向量)来进行聚类。谱聚类在处理复杂数据集时,往往能取得比传统聚类方法更好的效果。

基本步骤
  1. 构建相似度图:首先,需要根据数据点之间的相似度构建一个无向加权图 G = ( V , E ) G = (V, E) G=(V,E),其中 V V V 是节点集,表示数据点, E E E 是边集,边的权重表示数据点之间的相似度。常用的相似度函数有高斯核函数(Gaussian Kernel):
    w i j = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) w_{ij} = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right) wij=exp(2σ2xixj2)
    其中 x i x_i xi x j x_j xj 是数据点, σ \sigma σ 是带宽参数。
  2. 构建图的拉普拉斯矩阵:图的拉普拉斯矩阵 L L L 定义为:
    L = D − W L = D - W L=DW
    度矩阵 D D D
    D = diag ( d 1 , d 2 , … , d n ) 其中 d i = ∑ j w i j D = \text{diag}(d_1, d_2, \ldots, d_n) \quad \text{其中} \quad d_i = \sum_{j} w_{ij} D=diag(d1,d2,,dn)其中di=jwij
    相似度矩阵 W W W
    W = [ w i j ] 其中 w i j = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) W = [w_{ij}] \quad \text{其中} \quad w_{ij} = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right) W=[wij]其中wij=exp(2σ2xixj2)
    其中 W W W 是权重矩阵, D D D是度矩阵, D i i D_{ii} Dii 是节点 i i i 的度,即与节点 i i i 相连的边的权重之和。
    diag()可以将其元素放置在矩阵的主对角线上,其他位置为0,从而构造出一个对角矩阵。
  3. 计算拉普拉斯矩阵的特征值和特征向量:对拉普拉斯矩阵 L L L 进行特征分解,得到特征值和对应的特征向量。谱聚类通常关注最小的 k k k 个非零特征值对应的特征向量。
    特征分解:
    L u i = λ i u i 对于 i = 1 , 2 , … , k L u_i = \lambda_i u_i \quad \text{对于} \quad i = 1, 2, \ldots, k Lui=λiui对于i=1,2,,k
    其中 λ i \lambda_i λi 是特征值, u i u_i ui 是对应的特征向量。
    特征向量矩阵 U U U
    U = [ u 1 , u 2 , … , u k ] U = [u_1, u_2, \ldots, u_k] U=[u1,u2,,uk]
  4. 构建特征向量矩阵:将这 k k k 个特征向量组成一个矩阵 U U U,其中每一列是一个特征向量。
  5. 聚类:将矩阵 U U U 的行看作新的数据点,使用传统的聚类算法(如 k-means)对这些新数据点进行聚类。

手动实现

import numpy as np
from scipy.sparse.csgraph import laplacian
from scipy.linalg import eigh
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import rbf_kerneldef spectral_clustering(X, n_clusters=2, gamma=1.0):"""手动实现谱聚类参数:X: 形状为 (n_samples, n_features) 的 ndarray输入数据。n_clusters: int, 默认=2聚类的数量。gamma: float, 默认=1.0RBF核函数的参数(用于相似度矩阵)。返回:labels: 形状为 (n_samples,) 的 ndarray每个样本的预测标签。"""# 步骤1: 计算相似度矩阵(RBF核)affinity_matrix = rbf_kernel(X, gamma=gamma)# 步骤2: 计算拉普拉斯矩阵(归一化拉普拉斯矩阵)# 计算度矩阵degree_matrix = np.diag(np.sum(affinity_matrix, axis=1))# 计算拉普拉斯矩阵laplacian_matrix = degree_matrix - affinity_matrix# 步骤3: 计算拉普拉斯矩阵的特征值和特征向量# 计算最小的k个特征向量eigenvalues, eigenvectors = eigh(laplacian_matrix, subset_by_index=[0, n_clusters - 1])# 步骤4: 使用特征向量形成矩阵(嵌入)# 特征向量矩阵的行表示样本在新特征空间中的坐标X_embedding = eigenvectors# 步骤5: 在新特征空间中使用K-means对样本进行聚类kmeans = KMeans(n_clusters=n_clusters)labels = kmeans.fit_predict(X_embedding)return labels# 示例用法
if __name__ == "__main__":from sklearn.datasets import make_blobsimport matplotlib.pyplot as plt# 生成合成数据X, y = make_blobs(n_samples=300, centers=3, random_state=42)# 应用谱聚类labels = spectral_clustering(X, n_clusters=3)# 绘制结果plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')plt.title("Spectral Clustering Result")plt.show()

数据与结果为
在这里插入图片描述

相关文章:

学习日记_20241126_聚类方法(谱聚类Spectral Clustering)

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...

图书系统小案例

目前就实现了分页查询,修改,删除功能 这个小案例练习到了很多技能,比如前后端交互、异步请求、三层架构思想、后端连接数据库、配置文件、基础业务crud等等 感兴趣的小伙伴可以去做一个试试 准备工作 1、使用maven构建一个web工程 打开i…...

目标检测之学习路线(本科版)

以下是为一名计算机科学与技术本科大四学生整理的“目标检测”学习路线,结合了从基础到高级的内容,适合初学者逐步深入。每个阶段都有明确的学习要求、学习建议和资源推荐。 阶段一:基础知识学习 学习要求: 掌握编程语言 Pytho…...

C#调用C++ DLL方法之C++/CLI(托管C++)

托管C与C/CLI前世今生 C/CLI (C/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展,它是为了与 .NET Framework 进行互操作而设计的。C/CLI 是 C 的一种方言,它引入了一些新的语法和关键字,以便更好地支持 .NET 类型和垃圾…...

免费搭建一个属于自己的个性化博客(Hexo+Fluid+Github)

文章目录 0.简介1. 下载安装fluid主题2. 创建文章3. 添加分类及标签3.1 创建“分类”选项3.2 创建“标签”选项4. 文章中插入图片5. 添加阅读量统计6. 添加评论功能7. 显示文章更新时间8. 为hexo添加latex支持小结参考文献0.简介 通过HEXO模板和Fluid主题搭建自己的博客,预览…...

vue3 开发利器——unplugin-auto-import

这玩意儿是干啥的? 还记得 Vue 3 的组合式 API 语法吗?如果有印象,那你肯定对以下代码有着刻入 DNA 般的熟悉: 刚开始写觉得没什么,但是后来渐渐发现,这玩意儿几乎每个页面都有啊! 每次都要写…...

开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据

需求描述: 定义时间分界点:每月26号8点,过了26号8点则过滤出data数组中符合条件数据下个月的数据,否则过滤出当月数据 1.假如现在是2024年11月14日,那么过滤出data数组中日期都是2024-11月的数据; 2.假如…...

人工智能如何改变创新和创造力?

王琼工作室 输出的力量 有了GPT这样的人工智能平台,创新和创造力的机会在哪里? 我们是否有信心: 面对效率,超越效率。 把问题拓展为机会? 把机会拓展为价值? 让智能更好地和我们协作,走心、走…...

Github 基本使用学习笔记

1. 基本概念 1.1 一些名词 Repository(仓库) 用来存放代码,每个项目都有一个独立的仓库。 Star(收藏) 收藏你喜欢的项目,方便以后查看。 Fork(克隆复制项目) 复制别人的仓库&…...

群论入门笔记

群的基本定义 群由一组元素 G 和一个运算(常用符号包括 ,x , 或 ∗)组成。 封闭性 对于任意两个元素 x,y∈G,运算 x * y 的结果仍然属于集合 G,即: ∀x,y∈G,x∗y∈G. 结合律 对于任意 a,b,c∈G&…...

2024最新python使用yt-dlp

2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1)google浏览器下载Get cookies.txt LOCALLY插件2)导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1)使用Pycharm(2024.3)进行代码…...

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 什么是深度学习? 人工智能、机器学习与…...

单点登录深入详解之设计方案总结

基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie ,当再次访问本服务或者访问其他应用服务时,直接从 Cookie 中传递认证信息,进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…...

Loadsh源码分析-forEach,eachRight,map,flatMap,flatMapDeep,flatMapDepth

处理数组array的函数已经学习完,接下来是collection相关的函数, collection指的是一组用于处理集合(如数组或对象)的工具函数。 lodash源码研读之forEach,forEachRight,map,flatMap,flatMapDeep,flatMapDepth 一、源码地址 GitH…...

检测到“runtimelibrary”的不匹配项: 值“mtd_staticdebug”不匹配值“mdd_dynamic”

1. 解释“runtimelibrary”不匹配错误的含义 在Visual Studio中,LNK2038错误表示链接器检测到项目与其依赖的库之间存在“Runtime Library”(运行时库)的不匹配。具体来说,这意味着编译项目时使用的运行时库类型与编译依赖库时使…...

go clean -modcache命令清理缓存

go clean -modcache命令用于清理Go模块的本地缓存。Go模块缓存位于$GOPATH/pkg/mod/cache目录下,存储了所有下载和使用的模块版本。当执行go clean -modcache时,这个命令会删除该目录下的所有内容,迫使Go在下次构建时重新下载所有依赖的模块。…...

C#结构体排序(数组)

结构体排序(数组) 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…...

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进,越来越多地区积极建设信息基础设施,以充沛算力支撑产业物联网的可持续发展,数据机房就是其中的典型代表。而且随着机房规模的扩大,对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...

【Jenkins】自动化部署 maven 项目笔记

文章目录 前言1. Jenkins 新增 Maven 项目2. Jenkins 配置 Github 信息3. Jenkins 清理 Workspace4. Jenkins 配置 后置Shell脚本后记 前言 目标:自动化部署自己的github项目 过程:jenkins 配置、 shell 脚本积累 相关连接 Jenkins 官方 docker 指导d…...

LeetCode 3243. Shortest Distance After Road Addition Queries I

🔗 https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i 题目 有 n 个城市,编号 0 ~ n-1,从城市 i 到 i1 有一条路给若干高速路,表明从城市 u 到 v 有一条新增的路,v - u > 1返回每新…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...