sklearn聚类之谱聚类SpectralClustering

news2025/1/17 4:42:50

文章目录

    • 基本原理
    • sklearn中谱聚类的构造
    • 实战

基本原理

谱聚类是一种基于图论的聚类方法,所谓图,就是将空间中的所有点连接起来,只要这些连接中出现了一个圈,就可以称之为图。如果把这些连线加上一个权重,就叫做加权图。

如果连线越长则权重越小,连线越短则权重越大,然后把权重最小的边切断,使得一个图变成两个图,便完成了一次聚类,这就是谱算法的基本思路,而其基本流程,就是构图->切图。

所以,问题来了,如何构图?若将所有的点都连接起来,这显然有些离谱,毕竟这种平方级别的复杂度不是一般内存能吃得消的,作为有一点聚类基础的人,第一时间就会想到KNN算法,即k近邻。

由于谱聚类中,两个点是否要被切断,最关键的因素是短边而非长边,所以只要将点与其最近的k个点连接起来就行了。这样得到的图有一个问题,即x最近的k个点中可能有y,但y最近的k个点中可能没有x,像极了女神和你。

对此有两种解决方案,一种是x也不要y了,另一种是强制让x加入到y的近邻中。

除了k近邻之外,还可以定死一个距离r,凡是距离小于r的都连线,大于r的都不连线。由于点和点之间的距离往往相差较大,故其权重一般会在距离的基础上做一些变换,这个变换在下文乘坐权重函数。

sklearn中谱聚类的构造

sklearn中,谱聚类的构造函数为

SpectralClustering(n_clusters=8, *, eigen_solver=None, n_components=None, random_state=None, n_init=10, gamma=1.0, affinity='rbf', n_neighbors=10, eigen_tol='auto', assign_labels='kmeans', degree=3, coef0=1, kernel_params=None, n_jobs=None)

其中affinity参数表示构图方法,可以输入字符串或者sklearn.metrics.pairwise.pairwise_kernels中的函数,当输入字符串时:

  • nearest_neighbors: 表示采用最邻近算法
  • rbf:即rbf方法,表达式为 e − γ d i j 2 e^{-\gamma d_{ij}^2} eγdij2 d i j d_{ij} dij表示点i和j的距离。

pairwise_kernels中,还支持5种变换方法:rbf,sigmoid, polynomial/poly, linear, cosine

当选择最近邻算法时,可通过参数n_neighbors来设置最近邻的个数,即KNNK

当选择rbf时,可通过参数gamma来设置权重函数的系数 γ \gamma γ

当选择poly或者polynomial时,表示采用多项式函数,可通过degree来设置最高次的值。

当采用多项式或者sigmoid时,可通过coef0来设置0阶项系数。

通过kernel_params可以设置更加复杂的权重函数的系数。

此外,还有如下常用的参数

  • n_clusters 聚类数
  • eigen_solver 特征值分解策略,可选'arpack', 'lobpcg''amg';其中amg要求安装pyamg,可以更快地处理大规模样本,但可能有点不稳定;
  • random_state:随机数种子,便于结果复现
  • n_init:k-means算法的初值个数
  • eigen_tol:精度要求
  • assign_labels:表示分配标签的策略,可选kmeans, discretizecluster_qr
  • n_jobs 并行数

实战

import numpy as np
from sklearn import datasets
from sklearn.cluster import SpectralClustering
import matplotlib.pyplot as plt

X, y = datasets.make_circles(n_samples=1000, factor=0.5, noise=0.05)

fig = plt.figure()

# 谱聚类默认聚类数为8
model = SpectralClustering().fit(X)
ax = fig.add_subplot(131)
ax.scatter(X[:,0], X[:,1], c=model.labels_, marker='.')

model = SpectralClustering(n_clusters=2).fit(X)
ax = fig.add_subplot(132)
ax.scatter(X[:,0], X[:,1], c=model.labels_, marker='.')


model = SpectralClustering(n_clusters=2, affinity="nearest_neighbors").fit(X)
ax = fig.add_subplot(133)
ax.scatter(X[:,0], X[:,1], c=model.labels_, marker='.')

plt.show()

效果为

在这里插入图片描述

SpectralClustering有一个成员是affitiny_matrix_,存储了连接矩阵,将其调出后,可绘制具体的图

model = SpectralClustering( affinity="nearest_neighbors").fit(X)
inds = model.affinity_matrix_.nonzero()
inds = np.array(inds).T

for ind in inds:
    tmp = plt.plot(X[ind,0], X[ind, 1], c='g', lw=0.5)

plt.scatter(X[:,0], X[:,1], c=model.labels_, marker='o')

plt.show()

效果为

在这里插入图片描述

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

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

相关文章

小程序开发经验分享(6)开发流程大全

一、准备的资料 我们在开发微信小程序前,需要准备下相关资料。这个资料主要是后面进行ICP备案,微信小程序认证以及申请支付接口时需要用到。 资料如下: 营业执照【个体经营户或公司都行】银行开户许可证【个体经营户可以用法人个人银行卡】,企业网银【最好开通】。相关类…

车载以太网 - DoIP实体状态信息AliveCheck - 08

我们知道车载以太网的实体在车内一般常见的就是网关和节点,而网关和节点的状态信息对我们的以太网通信尤为重要,我们只有知道节点或者网关所处的状态,才能更好的进行下一步处理或者诊断,今天我们就来详细的了解下DoIP实体的状态信息这部分在ISO 13400中的定义。 DoIP实体状…

多图解析manacher算法原理

什么是manacher算法 用于快速计算一个字符串的最长回文子串 什么是最长回文子串? 例如:abc12321中,最长回文子串为12321,即子字符串中最长,且是回文的那个 怎么用暴力做法找出最长回文子串呢? 长度为奇…

线程等待,线程休眠,线程状态

线程等待:因为线程与线程之间,调度顺序是完全不确定,它取决于操作系统本身调度器的一个实现,但是有时候我们希望这个顺序是可控的,此时的线程等待,就是一种方法,用来控制线程结束的先后顺序; 1)…

神经网络基础部件-激活函数详解

本文分析了激活函数对于神经网络的必要性,同时讲解了几种常见的激活函数的原理,并给出相关公式、代码和示例图。 一,激活函数概述 1.1,前言 人工神经元(Artificial Neuron),简称神经元(Neuron),是构成神经…

[linux] 冯诺依曼体系及操作系统的概念

文章目录1. 冯诺依曼体系结构1. 为什么要有内存?1. 若内存不存在2. 若内存存在结论12.在硬件层面,单机和跨单机之间数据流是如何流向的?结论22. 操作系统(Operator System)1. 概念2.如何理解操作系统对硬件管理?结论13.管理者和被…

Linux安装 MySQL

1、MySQL安装方式 Linux MySQL安装有很多方式:yum安装、apt-get安装、rpm安装、二进制安装、源码编译安装。 比较通用的做法就是,二进制安装、源码编译安装,但是源码编译安装太麻烦,所以一般都是选择二进制安装。本文就是采用二…

百度百科创建词条参考资料问题汇总

百度百科词条编辑规则是相当复杂的,不是单纯写一写百度词条内容那么简单,还需要准备对应的参考资料来佐证你内容的真实性,很多小伙伴就因为这个参考资料犯了难,每次词条审核不通过的原因也大部分是因为参考资料的问题。 参考资料…

爬虫攻守道 - 2023最新 - Python Selenium 实现 - 数据去伪存真,正则表达式谁与争锋 - 爬取某天气网站历史数据

前言 前面写过3篇文章,分别介绍了反爬措施,JS逆向ajax获取数据,以及正则表达式匹配开头、结尾、中间的用法。第3篇算是本文 Python Selenium 爬虫实现方案的子集,大家可以参照阅读。 另外本意是“攻守”,不知道为何输…

【搞懂AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

文章目录前言一、名词解释二、NM报文1.NM报文格式2.NM报文数据场内容三、NM状态机1.NM状态转换图2.状态前言 AUTOSAR Automotive Open System Architecture,汽车开放系统架构,由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&am…

【Nginx】Nginx配置实例-负载均衡

1. 首先准备两个同时启动的 Tomcat2. 在 nginx.conf 中进行配置 1. 首先准备两个同时启动的 Tomcat 2. 在 nginx.conf 中进行配置 在 nginx.conf 中进行配置 随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题…

中睿天下入选“2023年网络安全服务阳光行动”成员单位

近日,中国网络安全产业联盟(CCIA)正式公布了“2023年网络安全服务阳光行动”成员单位名单。中睿天下作为以“实战对抗”为特点的能力价值型网络安全厂商,凭借领先的产品方案、专业的服务支持和优秀的行业自律精神成功入选。为规范…

12、Javaweb_登录添加删除修改多选删除分页查询复杂条件查询案例

1. 综合练习 1. 简单功能 1. 列表查询 2. 登录 3. 添加 4. 删除 5. 修改 2. 复杂功能 1. 删除选中 2. 分页查询 * 好处: 1. 减轻服务器内存的开销 …

C/C++数据类型转换详解

目录 C语言数据类型转换 1、自动类型转换 &#xff08;1&#xff09;算术表达式的自动类型转换 &#xff08;2&#xff09;赋值运算中的自动类型转换 2、强制类型转换 C数据类型转换 1、static_cast<> 2、const_cast<> 3、dynamic_cast<> 4、reint…

【Allegro软件PCB设计120问解析】第78问 如何在PCB中手动添加差分对及自动添加差分对属性呢?

答:设计PCB过程中,若设计中有差分对信号,则需要将是差分的2个信号设置为差分对,设置差分对有2种方式:手动添加及自动添加。 1、 手动添加差分对: 第一步,点击Setup-Constraints-Constraint Manager调出CM规则管理器,然后到Physical规则管理器下点击Net-All Layers,然…

React脚手架+组件化开发+组件生命周期+组件通信

react脚手架&#xff08;create-react-app&#xff09; 1.作用&#xff1a; 帮助我们生成一个通用的目录结构&#xff0c;并且已经将我们所需的工程环境配置好 2.依赖环境 脚手架都是使用node编写的&#xff0c;并且都是基于webpack的&#xff1b; 3.安装node 4.安装脚手架 n…

在哔站黑马程序员学习Spring—Spring Framework—(一)核心容器(core container)学习笔记

一、spring介绍 spring是一个大家族全家桶&#xff0c;spring技术是JavaEE开发必备技能。spring技术解决的问题&#xff1a;一是简化开发&#xff0c;降低企业级开发的复杂性。二是框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率。 spring技术…

git revert和git reset的差异点和区别

git revert 定义 撤销某次提交,此次撤销操作和之前的commit记录都会保留。 git revert会根据commitid找到此次提交的变更内容&#xff0c;并撤销这些变更并作为一次新commit提交。 ps:此次commit和正常commit相同&#xff0c;也可以被revert revert和reset有本质的差别&#…

使用C#开发ChatGPT聊天程序

使用C#开发ChatGPT聊天程序 总体效果如下&#xff1a; 源码下载 关键点1&#xff1a;无边框窗口拖动 Window中设置AllowsTransparency"True"、 Background"Transparent"以及WindowStyle"None"这样设置的话默认窗口的标题栏为不可见状态&…

cocos tween

缓动接口Tween 属性和接口说明接口说明接口功能说明tag为当前缓动添加一个数值类型&#xff08;number&#xff09;的标签to添加一个对属性进行 绝对值 计算的间隔动作by添加一个对属性进行 相对值 计算的间隔动作set添加一个 直接设置目标属性 的瞬时动作delay添加一个 延迟时…