Spark 3.0 - 15.ML PIC 快速迭代聚类理论与实战

news2024/10/5 20:23:48

目录

一.引言

二.PIC 理论

1.谱聚类

2.快速迭代聚类

三.PIC 实战

1.数据准备

2.构建 PIC

3.预测与展示

四.总结


一.引言

前面介绍了 K-means 聚类与高斯混合聚类,本文介绍另外一种聚类方法 Power Iteration Cluster 快速迭代聚类,简称 PIC。快速迭代聚类是谱聚类的一种,是由 Lin 和 Cohen 开发的可拓展图聚类算法。

二.PIC 理论

1.谱聚类

谱聚类是最近聚类研究的一个热点问题,是建立在图论理论上的一种新的聚类算法。谱聚类基于谱图原理,根据数据集的相似度矩阵进行聚类,它具有更强的数据分布适应性。

A.计算相似度矩阵

前面我们讲到过 GraphEmbedding - GraphEmbedding 之获取图结构,里面有带权图的概念。谱聚类思想为将带权无向图划分为两个或两个以上的最优子图,要求子图内尽量相似而不同子图间距离尽量较远,以达到每个子图构成一个聚类 cluster 的目的。在无向图中,对于点1和点2,我们可以定义两点之间的距离 dst 为 w,从而构建相似度矩阵:

W = R^{n\cdot n}

这里相似度最常见的为欧式距离,也可以使用高斯核函数、余弦相似度等计算相似度。

B.计算度矩阵

度是图论中的概念,也就是矩阵 W 行或者列的元素之和。

C.计算拉普拉斯矩阵

谱聚类基于前面的相似度矩阵与度矩阵构造 Laplace 矩阵,通过特征值计算评估不同数据的相似度。这里可以理解为将原始数据嵌入到由相似度矩阵映射出来的低维子空间,然后直接通过常规的聚类算法得到聚类结果。

L = D^{-1}W

其中 D 为度矩阵,W 为相似度矩阵。后续涉及到特征值与特征向量的计算,通过对特征向量使用类似 K-means 的算法衡量相似度并按照 K 进行聚类。

2.快速迭代聚类

关于 PIC 完整的推理与论文描述大家可以参考:Power Iteration Clustering。下面对算法做简单分解:

A.Input

输入一个按行归一化的关联矩阵 W 和期望的聚类 Cluster 数目,并随机选取一个初始化向量 v0。

B.Repeat

V^{t+1}=\frac{W_{v}^{(t)}}{\left \| W_{v}^{(t)} \right \|}_1

\delta ^{(t+1)}=\left | v^{(t+1)}-v^{(t)} \right |

C.Until

不断增加 t,直到:

\left | \delta ^{t}- \delta ^{t-1}\right |\simeq 0

使用 K-means 算法对 v^t 得到的向量进行聚类

D.Output

输出 Cluster 1、2 ... 直到预定的 K。从引言的图中看到,谱聚类更适合在非凸模型下实现较好的聚类效果,而 K-Means 则适合用于区分线性可分的类别,例如上面通过转化得到的 v 向量。

三.PIC 实战

1.数据准备

与前面 K-means 和 GMM 不同,这里数据不再以 libsvm 的稀疏形式给出,而是遵循 Spark PIC 的约定的无向带权图形式 (src, dst, weight):

     val spark = SparkSession
       .builder      //创建spark会话
       .master("local")  //设置本地模式
       .appName("PowerIterationClusteringExample")  //设置名称
       .getOrCreate()   //创建会话变量

     // 创建快速迭代聚类的数据源
     val dataset = spark.createDataFrame(Seq(
       (0L, 1L, 1.0),
       (0L, 2L, 1.0),
       (1L, 2L, 1.0),
       (3L, 4L, 1.0),
       (4L, 0L, 0.1)
     )).toDF("src", "dst", "weight")

以 (0L, 1L, 1.0) 为例,其中 0L 代表边的起点,1L 代表边的终点,1.0 为边的权重。

2.构建 PIC

     //创建专用类
     val model = new PowerIterationClustering().
       setK(2).//设定聚类数
       setMaxIter(20).//设置迭代次数
       setInitMode("degree").//初始化算法的参数
       setWeightCol("weight")//权重列名称的参数

Spark 构建了 PowerIterationClustering 实现了 PIC 聚类,下面看下模型的参数有哪些:

srcCol: 源顶点 ID 的输入列,默认 src

dstCol: 目标顶点 ID 的输入列,默认 dst

initMode: 初始化算法,可以使用 'random' 使用随机向量作为顶点属性,也可以是 'degree' 即使用与其他顶点的相似性归一化和,默认 'random'

k: 要创建的 cluster 数目,必须大于1,默认2

maxIter: 最大迭代次数,必须大于等于0,默认20

weightCol: 权重列名称,如果未设置或为空,则所有实例视为权重为 1.0,默认 1.0。

3.预测与展示

     // 进行数据集预测
     val prediction = model.assignClusters(dataset).select("id", "cluster")

     //  展示结果
     prediction.show(false)
     // $example off$

     spark.stop()

可以看到 PIC 基于当前数据无向带权图进行特征值计算并最终将数据分类,与传统的 K-Means、GMM 不同的是,PIC model 只能基于当前数据对数据进行 cluster,不能向前者生成聚类中心或者高斯函数继续进行 predict 预测,但是 PIC 的优势是其对于不规则数据的聚类效果较好。所以实际场景使用聚类算法时,需要作者对数据的特性进行分析把控,从而选择最合适的聚类算法。 

+---+-------+
|id |cluster|
+---+-------+
|4  |1      |
|0  |0      |
|1  |0      |
|3  |1      |
|2  |0      |
+---+-------+

四.总结

除了本文介绍的 PIC 聚类,前面还介绍了 Spark ML K-Means、GMM 高斯混合聚类 两种聚类算法,几种算法各有优势:

K-Means 简单高效,适用于线性可分的数据以及快速聚类,可以获得聚类中心并重复使用。

GMM 高斯混合聚类其实本质上是数据分布拟合,相比 K-Means 其可以获得多个 GM 高斯分布模型,并获得每个样本属于不同聚类的概率。

PIC 快速迭代聚类通过 Laplcae 矩阵分解获取特征值特征向量,更适合非凸模型数据的聚类,但不可复用。

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

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

相关文章

【架构设计】你的类足够“专一”吗

前言 软件设计SOLID原则中有一个最基础的原则就是单一职责原则,我想绝大部分的程序员都知道,而且都理解它的意思,甚至觉得很简单。但是往往“看懂”和“会用”是两回事,而“用好”更是难上加难。好比我们项目,一开始一…

取代OpenFeign:Spring Framework 6全新声明式客户端@HttpExchange

本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“…

【几种可调动对象,Function和bind;线程的调动方式举例】

1.可调动对象的调动方式 方法 1、函数指针调动 方法2 、类类型的括号的重载 调动可调动对象 #include<iostream> #include<functional> using namespace std; struct Foo {void operator()(int x){cout<<"Foo operator "<<x<<endl;}…

CSS3【定位的基本使用[静态定位\相对定位\绝对定位]、子绝父相、固定定位、元素的层级关系】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、定位1.1定位的基本介绍1.1.1 网页常见布局方式1.1.2 定位的常见应用场景1.2 定位的基本使用1.2.1 定位初体验1.2.2 使用定位的步骤1.2.3 静态定位1.2.4 小结1.2.…

使用 Docker Hub 完美地存储 Helm 图表实战

使用 Docker Hub 完美地存储 Helm 图表实战 Helm 是 Kubernetes 的包管理器。它是一个开源容器编排系统。它通过提供一种简单的方法来定义、安装和升级复杂的 Kubernetes 应用程序&#xff0c;帮助您管理 Kubernetes 应用程序。 使用 Helm&#xff0c;您可以将您的应用程序打包…

git教程

教程目录Git 教程Git 与 SVN 区别Git 与 SVN 区别点&#xff1a;Git 安装配置Linux 平台上安装Debian/UbuntuCentos/RedHatWindows 平台上安装Mac 平台上安装Git 配置用户信息文本编辑器##差异分析工具查看配置信息Git 工作流程Git 工作区、暂存区和版本库基本概念Git 创建仓库…

semargl 软件使用方法简介

文章目录前言一、semargl 软件使用简介1.semargl 软件简介2.准备演示软件操作所需的数据3.使用 semargl 获取频谱关系4.使用 semargl 获取特定频率模式的空间分布5.使用 semargl 获取自旋波的色散关系二、笔记05第三节内容的补充1.优化多进程读取磁化数据文件的代码2.新增获取特…

【JavaSE】 常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

Python手势识别与追踪

程序示例精选 Python手势识别与追踪 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Python手势识别与追踪>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 应…

【日常】圣诞节、颜色⛄

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 关于圣诞节&#x1f384;&#xff0c;大家想到什么颜色&#xff1f;⛄&#x1f98c;&#x1f381;&#x1f385;&#x1f525; demo online - https://codepen.io/adamlindqvist/pen/EaPeJg html <!-- Christ…

详细介绍关于自定义类型:结构体、枚举、联合【c语言】

文章目录结构体结构体的声名特殊的声明结构成员的类型结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数结构体变量访问成员结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段的内存分配位段的跨平台问题枚举枚举类型的定义枚举的…

【Linux】用户与用户组操作_补

文章目录一.用户1.1 用户与用户组概念1.2 与用户管理相关的系统文件1.3 查看用户组1.3.1用户组密码配置文件&#xff0f;etc&#xff0f;gshadow1.4用户管理创建用户修改用户添加密码一.用户 1.1 用户与用户组概念 用户和用户组的对应关系有&#xff1a;一对一、一对多、多对一…

【C语言进阶】指针练习题

写在前面 这是指有关指针的小题 正文 练习一 int main() {int a[5][5];int (*p)[4];pa;printf("%p,%d", &p[4][2]-&a[4][2], &p[4][2]-&a[4][2] );return 0; } 解析&#xff1a; a[4][2]为如图粉色部分&#xff0c;p[4][2]为如图蓝色部分。a的…

【ROS通信机制实战练习】通过话题发布实现turtlesim小乌龟圆周运动

本节记录下使用ROS中的话题机制&#xff0c;实现turtlesim中小乌龟的圆周运动。 如果想通过话题通信机制&#xff0c;实现小乌龟的圆周运动&#xff0c;需要首先明确小乌龟的运动情况&#xff0c;以及所涉及的指挥运动的参数&#xff0c;这里需要首先手动发布一个turtlesim的节…

springboot整合mybatis代码快速生成

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

String 字符串

String 基本介绍 String 应该是 Java 中最常用的一个对象&#xff0c;他不是八种基本数据类型的其中之一&#xff0c;但是随便翻了一下项目代码&#xff0c;用 String 定义的变量超过百分之八十。 public final class Stringimplements java.io.Serializable, Comparable<…

VUE3-计算属性和监听器《五》

目录 一&#xff0c;计算属性 二&#xff0c;监听器 在vue3种&#xff0c;当界面上需要处理一些数据的时候&#xff0c;可以通过计算属性和监听器处理&#xff0c;他们都是对一个属性进行操作的&#xff0c;然后返回数据。 他们的区别是&#xff0c;计算属性&#xff0c;是通…

20221226英语学习

今日短文 When we are shown two options, our eyes tend to flick from one to the other and back again several times as we deliberate on the pros and cons of each. Researchers at Johns Hopkins University in the US have found that the speed with which our ey…

Hbase是什么?

Hadoop Database简介表结构数据只能读不能改>生成新版本总结简介 永远的百度百科 HBase是一个分布式的、面向列的开源数据库&#xff0c;一个结构化数据的分布式存储系统”。 HBase不同于一般的关系数据库&#xff0c;它是一个适合于非结构化数据存储的数据库。另一个不同的…

过年首秀 - 用python写一个自动生成春联的软件并打包exe

前言 哈喽啊&#xff0c;我亲爱的铁铁们&#xff0c;I am back &#xff01;&#xff01; 别管&#xff0c;我也是阳过的人了&#xff0c;这么久都没有更新&#xff0c;今天就带来个小玩意吧 这不是过完圣诞就要过年了吗 这不得准备准备&#xff0c;春节的表演&#xff1f;…