当前位置: 首页 > 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返回每新…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...