学习日记_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返回每新…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

