当前位置: 首页 > news >正文

谱聚类实例

  在处理非完全图的聚类时候,很难找到一个有效的聚类算法去做聚类。

  对于下图来说,10号点和15号点的位置相隔并不是那么近,如用普通聚类算法对下图做聚类,通常会把10号点和15号点聚在一个类上,所以一般的聚类效果并没有那么好。

  

  而谱聚类,就很能很好的处理这类问题。  

  下面我们来重点介绍谱聚类

  谱聚类(SpectralClustering),就是要把样本合理地分成两份或者K份。从图论的角度来说,谱聚类的问题就相当于一个图的分割问题。即给定一个图G = (V, E),顶点集V表示各个样本,带权的边表示各个样本之间的相似度,谱聚类的目的便是要找到一种合理的分割图的方法,使得分割后形成若干个子图,连接不同子图的边的权重(相似度)尽可能低,同子图内的边的权重(相似度)尽可能高。物以类聚,人以群分。

(一) 算法步骤

  1.  根据数据构造一个Graph,Graph的每一个节点对应一个数据点,将各个点连接起来(随后将那些已经被连接起来但并不怎么相似的点,通过cut/RatioCut/NCut 的方式剪开),并  且边的权重用于表示数据之间的相似度。把这个Graph用邻接矩阵的形式表示出来,记为 W
  2.  把W的每一列元素加起来得到N个数,把它们放在对角线上(其他地方都是零),组成一个的对角矩阵,记为度矩阵D,并把的结果记为拉普拉斯矩阵。
  3.  求出L的前k个特征值(前k个指按照特征值的大小从小到大排序得到),以及对应的特征向量。
  4.  把这k个特征(列)向量排列在一起组成一个的矩阵,将其中每一行看作k维空间中的一个向量,并使用 K-means 算法进行聚类。聚类的结果中每一行所属的类别就是原  来 Graph 中的,因此节点亦即最初的N个数据点分别所属的类别。

 

(二) 谱聚类的实现

 

python编程,利用sklearn.cluster 下的 SpectralClustering可以很轻易的实现

from sklearn.cluster import SpectralClustering
labels=SpectralClustering(affinity='nearest_neighbors',n_clusters=20, n_neighbors=3).fit_predict(route)

#labels=

[ 3,  3,  5,  7,  8,  8,  9,  4,  4, 15, 15,  2,  2, 15, 16, 17, 18,
13, 1, 12, 2, 2, 2, 2, 2, 15, 15, 16, 16, 9, 4, 4, 4, 4,
17, 17, 17, 14, 14, 14, 18, 18, 3, 5, 4, 4, 9, 9, 8, 8, 8,
8, 8, 5, 5, 8, 19, 19, 8, 19, 8, 7, 7, 6, 6, 6, 6, 11,
3, 3, 3, 3, 3, 3, 11, 11, 11, 1, 1, 1, 13, 13, 13, 10, 12,
12, 0, 0, 10, 10, 0, 0]


其中:

1)n_clusters:代表我们在对谱聚类切图时降维到的维数。如分为20个聚类簇,n_clusters=20。

2) affinity: 也就是我们的相似矩阵的建立方式。可以选择的方式有三类,第一类是 'nearest_neighbors',即K邻近法;第二类是'precomputed',即自定义相似矩阵;第三类是全连接法,可以使用各种核函数来定义相似矩阵,还可以自定义核函数。基于对有向图的聚类,本文的参数选择是,affinity='nearest_neighbors', n_neighbors=3。

 

再把图画出来,完美解决类似于10号和15号坐标分成一类的问题。结果如下图

 

这个例子的实现所需要的数据和代码已经上传到github:https://github.com/yjx7/-SpectralClustering.git       有用给个star谢谢啦

转载于:https://www.cnblogs.com/jachin01/p/7488937.html

相关文章:

  • postgresql update returning
  • 其实吧,360的开发,素质也没高到哪去,看代码就看出来了
  • 判断js数据类型
  • Linux上给不是管理员的用户增加安装软件的权限
  • 【已解决】项目加载失败,Web应用程序项目XX已配置为使用IIS
  • JDBC连接数据库:单线程、多线程、批处理插入数据的对比
  • VS2015 +EF6 连接MYSQL数据库生成实体
  • CF 840 D
  • 初识oracle存储过程
  • 大数据竞赛平台Kaggle案例实战
  • 我的Hibernate学习记录(一)
  • Java 读写Properties配置文件
  • 输出斐波那契数列前20项,每输出5个数换行
  • MySQL5.6安装步骤
  • 【转载】max/min函数的用法
  • CSS相对定位
  • Electron入门介绍
  • java小心机(3)| 浅析finalize()
  • java中具有继承关系的类及其对象初始化顺序
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Laravel 中的一个后期静态绑定
  • MySQL-事务管理(基础)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP的Ev教程三(Periodic watcher)
  • Python语法速览与机器学习开发环境搭建
  • React as a UI Runtime(五、列表)
  • springMvc学习笔记(2)
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue全家桶实现一个Web App
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何利用MongoDB打造TOP榜小程序
  • 什么是Javascript函数节流?
  • 时间复杂度与空间复杂度分析
  • 容器镜像
  • ( 10 )MySQL中的外键
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (差分)胡桃爱原石
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (九)c52学习之旅-定时器
  • (六)Hibernate的二级缓存
  • (转)Linq学习笔记
  • (转)大型网站架构演变和知识体系
  • .axf 转化 .bin文件 的方法
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET开发不可不知、不可不用的辅助类(一)