【聚类】谱聚类解读、代码示例

news2024/9/29 18:07:21

【聚类】谱聚类详解、代码示例

文章目录

1. 介绍

谱聚类的基本原理:

  • 把所有数据看成空间中的点,这些点之间可以用变连接起;
  • 距离较远的两个点之间的边权重较低,而距离较近的两个点之间的边权重较高;
  • 通过对所有数据点组成的图进行切图,让切图后的不同的子图间边权重和尽可能小(即距离远),而子图内的边权重和尽可能高(即距离近)。

难点:

  • 如何构建图?
  • 如何切分图?

2. 方法解读

2.1 先验知识

2.1.1 无向权重图

在这里插入图片描述

2.1.2 拉普拉斯矩阵

在这里插入图片描述

2.2 构建图(第一步)

2.2.1 ϵ \epsilon ϵ 邻近法

在这里插入图片描述

2.2.2 k 近邻法

在这里插入图片描述

2.2.3 全连接法

比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。

  • 可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。
  • 最常用的是高斯核函数 RBF
    在这里插入图片描述

2.3 切图(第二步)

在这里插入图片描述
其中 A i ˉ \bar {\text{A}_i} Aiˉ A \text{A} A 的补集。

进而,如何切图使子图内的点权重高,子图之间的点权重低?

2.3.1 最小化 cut (A1, A2, . . . Ak) \text{cut (A1, A2, . . . Ak)} cut (A1, A2, . . . Ak)

一个自然的想法就是最小化 cut (A1, A2, . . . Ak) \text{cut (A1, A2, . . . Ak)} cut (A1, A2, . . . Ak),但是可以发现,这种极小化的切图存在问题,如下图:
在这里插入图片描述

  • 为了避免最小切图导致的切图效果不佳,我们需要对每个子图的规模做出限定;
  • 一般来说,有两种切图方式,第一种是 RatioCut,第二种是 Ncut。

2.3.2 RatioCut 切图

对于每个切图,不仅要考虑最小化 cut (A1, A2, . . . Ak) \text{cut (A1, A2, . . . Ak)} cut (A1, A2, . . . Ak),还要考虑最大化每个子图样本的个数,即最小化 RatioCut函数:
在这里插入图片描述
在这里插入图片描述

  • 这里需要提一下, h i h_i hi是正交基,但并不是单位正交基,因为 h i T h i = 1 ∣ A j ∣ {h_i}^Th_i = \frac{1}{|A_j|} hiThi=Aj1,而不是1。但是不影响后面结论。

2.3.3 Ncut切图

在这里插入图片描述
在这里插入图片描述

3. 谱聚类流程

3.1 输入与输出

  • 输入:样本集 D = ( x 1 , x 2 , . . . , x n ) D=(x_1, x_2,...,x_n) D=(x1,x2,...,xn),邻接矩阵的生成方式,降维后的维度k1,聚类方法,聚类后的簇个数k2;
  • 输出: 簇划分 C ( c 1 , c 2 , . . . , c k 2 ) C ( c_1, c_2,. . .,c_{k2}) C(c1,c2,...,ck2)

3.2 一般流程

  • 根据邻接矩阵生成方式构建邻接矩阵W,构建度矩阵D;
  • 计算出拉普拉斯矩阵L;
  • 构建标准化后的拉普拉斯矩阵 D − 1 2 L D − 1 2 D^{-\frac {1}{2}}LD^{-\frac {1}{2}} D21LD21
  • ​计算 D − 1 2 L D − 1 2 D^{-\frac {1}{2}}LD^{-\frac {1}{2}} D21LD21最小的k1个特征值所各自对应的特征向量f;
  • 将各自对应的特征向量f组成的矩阵按行标准化,最终组成n × k1 维矩阵F;
  • 对F 中的每一行作为一个k1维样本,共n个样本,用输入的聚类方法进行聚类,聚类个数为k2;
  • 得到簇划分 C ( c 1 , c 2 , . . . , c k 2 ) C ( c_1, c_2,. . .,c_{k2}) C(c1,c2,...,ck2)

4. 代码演示

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler

np.random.seed(0)

# 数据构造
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.2, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)

data_sets = [
    (noisy_circles, {"n_clusters": 3}),
    (noisy_moons, {"n_clusters": 2}), 
    (blobs, {"n_clusters": 3})
]
colors = ["#377eb8", "#ff7f00", "#4daf4a"]
affinity_list = ['rbf', 'nearest_neighbors']

plt.figure(figsize=(20, 15))

for i_dataset, (dataset, algo_params) in enumerate(data_sets):
    params = algo_params
    
    X, y = dataset
    X = StandardScaler().fit_transform(X)

    for i_affinity, affinity_strategy in enumerate(affinity_list):
        spectral = cluster.SpectralClustering(
            n_clusters=params['n_clusters'],
            eigen_solver='arpack', 
            affinity=affinity_strategy
        )

        spectral.fit(X)

        y_pred = spectral.labels_.astype(int)

        y_pred_colors = []

        for i in y_pred:
            y_pred_colors.append(colors[i])
        
        plt.subplot(3, 4, 4*i_dataset+i_affinity+1)
        plt.title(affinity_strategy)
        plt.scatter(X[:, 0], X[:, 1], color=y_pred_colors)

# plt.show()
plt.savefig("a.jpg")

在这里插入图片描述

5. 总结

  • 优点:
    • 谱聚类只需要数据之间的邻接矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到;
    • 由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
  • 缺点:
    • 如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好;
    • 聚类效果依赖于邻接矩阵,不同的邻接矩阵得到的最终聚类效果可能很不同。

6. 参考

【1】https://blog.csdn.net/qq_42735631/article/details/121010760

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374942.html

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

相关文章

基于jeecgboot的flowable的H5版本在演示系统发布

目前在NBCIO 亿事达企业管理平台上发布了H5的在线演示系统,欢迎大家批评指正。 在nbcio-vue nbcio-vue: NBCIO 亿事达企业管理平台前端代码,基于ant-design-vue-jeecg的前端版本: 3.0.0代码和和flowable6.7.2,初步完成了集流程设…

【Linux】安装MySQL

目录 1.检测当前系统是否安装过MySQL相关数据库 2. 卸载现有的MySQL数据库 3.上传解压 4.顺序安装rpm包 5.启动MySQL 6.查看临时密码 7.登录MySQL 8.开放端口 1.检测当前系统是否安装过MySQL相关数据库 需要通过rpm相关指令,来查询当前系统中是否存在已安…

无法将“django-admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题

无法将“django admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题 小提示:首先检查一下有没有拼写错误!!!没有的话请继续 我们要知道django装到哪里去了 pip show django 注意:3.0…

Flutter(二)第一个Flutter应用

1.默认应用 在Android Studio中创建好项目以后,项目的入口即是lib下的main.dart import package:flutter/material.dart;void main() {runApp(const MyApp()); } //无状态的组件(Stateless widget) class MyApp extends StatelessWidget {}…

基于paddlex的C#环境配置及其部署【附带安装包】

前言 最近应老师要求部署一个基于paddlex的C#环境,踩了一些坑,经过几个版本的安装测试,最终成功,这里记录一下。此次用到的所有软件的安装包如下: 补充的vs 2019安装包: 官方参考链接(没有环…

Meta利用视觉信息来优化3D音频模型,未来将用于AR/VR

我们知道,Meta为了给AR眼镜打造智能助手,专门开发了第一人称视觉模型和数据集。与此同时,该公司也在探索一种将视觉和语音融合的AI感知方案。相比于单纯的语音助手,同时结合视觉和声音数据来感知环境,可进一步增强智能…

ERD Online 4.0.9 在线数据库建模、元数据管理平台(免费、私有部署)

ERD Online 是全球第一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能,辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 4.0.9 ❝ feat(erd): 主键生…

Opencv项目实战:21 美国ASL手势识别

0、项目介绍 首先,我可以保证在这里,你并不需要多么了解深的机器学习算法,我的初衷是通过本项目,激发大家学习机器学习的动力。选择这种手势原因是因为只有24个字母,你的电脑足以带的动,虽然我只训练A、B、…

group by聚合分组后如何获取分组数据

之前用group by分组后一直困惑怎么把分组后的数据拿到,因为分组后同一组的只有一条数据,最后发现了group_concat函数。记录一下,以后能用。语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator…

【MySQL - InnoDB 存储结构】行格式详解

我们平时对 MySQL 的了解都只是限制在使用层面上,但是难道你就没有一个时刻好奇 MySQL 的内部结构嘛,我们通过 SQL 语句插入的一条条记录在 MySQL 底层到底是以什么格式存储的呢 ? 本文就将以 InnoDB 存储引擎为例子,介绍 MySQL 存…

专科top4|临床医生CSC公派博士后美国凯斯西储大学医院赴职

Q医生符合CSC公派博士后申报条件,我们先为其取得Hopkins的邀请函并获CSC批准,后因导师失联,为保险起见,我们又继续申请并获得凯斯西储大学医学院彩虹宝宝和儿童医院的邀请函,该院连续20年被评为全美最好儿童医院&#…

【vulhub漏洞复现】CVE-2015-5254 ActiveMQ反序列化漏洞

一、漏洞详情Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。配置Apache ActiveMQ需要提前有jdk的环境。基于MQTT,消息订阅和分…

Javascript的API基本内容(三)

一、事件流 假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父实际工作都是使用事件冒泡为主 二、页面加载事件 加载外部资源(如图片、外联CS…

Portraiture4免费磨皮插件支持PS/LR

Portraiture 4免去了繁琐的手工劳动,选择性的屏蔽和由像素的平滑,以帮助您实现卓越的肖像润色。智能平滑,并删除不完善之处,同时保持皮肤的纹理和其他重要肖像的细节,如头发,眉毛,睫毛等。 一键…

Python Flask + Echarts 轻松制作动态酷炫大屏( 附代码)

目录一、确定需求方案二、整体架构设计三、编码实现 (关键代码)四、完整代码五、运行效果1.动态实时更新数据效果图 说明: 其中 今日抓拍,抓拍总数,预警信息统计,监控点位统计图表 做了动态实时更新处理。 ​ 2.静态…

Java岗面试题--Java并发(volatile 专题)

目录1. 面试题一:谈谈 volatile 的使用及其原理补充:内存屏障volatile 的原理2. 面试题二:volatile 为什么不能保证原子性3. 面试题三:volatile 的内存语义4. 面试题四:volatile 的实现机制5. 面试题五:vol…

用c语言模拟实现常用字符串函数

目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 一.常用字符串函数介绍 1.strlen 字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关…

浅谈模型评估选择及重要性

作者:王同学 来源:投稿 编辑:学姐 模型评估作为机器学习领域一项不可分割的部分,却常常被大家忽略,其实在机器学习领域中重要的不仅仅是模型结构和参数量,对模型的评估也是至关重要的,只有选择那…

vector迭代器失效与深浅拷贝问题

目录 1、vector迭代器失效问题 1.1、insert迭代器失效 扩容导致野指针 意义变了 官方库windows下VS和linux下对insert迭代器失效的处理 1.2、erase迭代器失效 官方库windows下VS和linux下对erase迭代器失效的处理 1.3、迭代器失效总结 2、深浅拷贝问题 1、vector迭…

GeoServer发布数据进阶

GeoServer发布数据进阶 GeoServer介绍 GeoServer是用于共享地理空间数据的开源服务器。 它专为交互操作性而设计,使用开放标准发布来自任何主要空间数据源的数据。 GeoServer实现了行业标准的 OGC 协议,例如网络要素服务 (WFS)…