学习日记_20241126_聚类方法(谱聚类Spectral Clustering)
前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
文章目录
- 前言
- 聚类算法
- 经典应用场景
- 谱聚类(Spectral Clustering)
- 优点
- 缺点
- 总结
- 简单实例(函数库实现)
- 数学表达
- 基本步骤
- 手动实现
聚类算法
聚类算法在各种领域中有广泛的应用,主要用于发现数据中的自然分组和模式。以下是一些常见的应用场景以及每种算法的优缺点:
经典应用场景
-
市场细分:根据消费者的行为和特征,将他们分成不同的群体,以便进行有针对性的营销。
-
图像分割: 将图像划分为多个区域或对象,以便进行进一步的分析或处理。
-
社交网络分析:识别社交网络中的社区结构。
-
文档分类:自动将文档分组到不同的主题或类别中。
-
异常检测识别数据中的异常点或异常行为。
-
基因表达分析:在生物信息学中,根据基因表达模式对基因进行聚类。
谱聚类(Spectral Clustering)
谱聚类(Spectral Clustering)是一种基于图论和线性代数的聚类方法,广泛应用于处理复杂的聚类结构。下面是谱聚类的优缺点概述:
优点
-
能够识别任意形状的聚类:与传统的基于距离的聚类方法(如 K-Means)不同,谱聚类能够处理形状复杂的聚类。它通过构建图和分析其特征向量,可以捕捉到非凸形状的聚类。
-
利用全局信息:谱聚类通过计算数据点之间的相似性矩阵,从而考虑了数据的全局结构,而不仅仅是局部邻域的信息,能更好地捕捉到数据的内在关系。
-
降维能力: 谱聚类利用特征值分解可以有效地将高维数据映射到低维空间,这对于高维数据集尤其重要,可以减少噪声和冗余特征的影响。
-
灵活性强:可以通过选择不同的相似性度量和距离函数,适应不同类型的数据和聚类需求。
缺点
-
计算复杂度高:谱聚类的计算通常涉及特征值分解或奇异值分解,其计算复杂度为 O ( n 3 ) O(n^3) O(n3),其中 n n n 是数据点的数量。因此在大规模数据集上,谱聚类可能会变得非常耗时和资源密集。
-
对参数敏感:谱聚类的效果可能对参数(如相似性矩阵的构建方式、聚类数目等)非常敏感。选择合适的参数可能需要经验和调试。
-
对噪声和异常值敏感:谱聚类对噪声和异常值较为敏感,这些点可能会影响相似性矩阵的构建,导致聚类结果不理想。
-
需要预定义聚类数:与许多聚类算法一样,谱聚类通常需要事先指定要生成的聚类数量,这在实际应用中可能不够灵活。
-
可解释性差:尽管谱聚类能够产生良好的聚类效果,但其结果的可解释性相对较差,尤其是在高维数据中,难以直观理解聚类的形成原因。
总结
谱聚类是一种强大而灵活的聚类方法,特别适合处理复杂和非线性的数据分布。然而,其高计算复杂度和对参数的敏感性限制了其在某些应用中的实用性。在选择聚类方法时,需要根据实际数据的特点和聚类的需求权衡这些优缺点。
简单实例(函数库实现)
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)是一种基于图论的聚类方法,它通过将数据点看作图中的节点,并利用图中的谱(即图的拉普拉斯矩阵的特征值和特征向量)来进行聚类。谱聚类在处理复杂数据集时,往往能取得比传统聚类方法更好的效果。
基本步骤
- 构建相似度图:首先,需要根据数据点之间的相似度构建一个无向加权图 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σ2∥xi−xj∥2)
其中 x i x_i xi 和 x j x_j xj 是数据点, σ \sigma σ 是带宽参数。- 构建图的拉普拉斯矩阵:图的拉普拉斯矩阵 L L L 定义为:
L = D − W L = D - W L=D−W
度矩阵 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=j∑wij
相似度矩阵 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σ2∥xi−xj∥2)
其中 W W W 是权重矩阵, D D D是度矩阵, D i i D_{ii} Dii 是节点 i i i 的度,即与节点 i i i 相连的边的权重之和。
diag()可以将其元素放置在矩阵的主对角线上,其他位置为0,从而构造出一个对角矩阵。- 计算拉普拉斯矩阵的特征值和特征向量:对拉普拉斯矩阵 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]- 构建特征向量矩阵:将这 k k k 个特征向量组成一个矩阵 U U U,其中每一列是一个特征向量。
- 聚类:将矩阵 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返回每新…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

