目录
一.引言
前面介绍了 K-means 聚类与高斯混合聚类,本文介绍另外一种聚类方法 Power Iteration Cluster 快速迭代聚类,简称 PIC。快速迭代聚类是谱聚类的一种,是由 Lin 和 Cohen 开发的可拓展图聚类算法。
二.PIC 理论
1.谱聚类
谱聚类是最近聚类研究的一个热点问题,是建立在图论理论上的一种新的聚类算法。谱聚类基于谱图原理,根据数据集的相似度矩阵进行聚类,它具有更强的数据分布适应性。
A.计算相似度矩阵
前面我们讲到过 GraphEmbedding - GraphEmbedding 之获取图结构,里面有带权图的概念。谱聚类思想为将带权无向图划分为两个或两个以上的最优子图,要求子图内尽量相似而不同子图间距离尽量较远,以达到每个子图构成一个聚类 cluster 的目的。在无向图中,对于点1和点2,我们可以定义两点之间的距离 dst 为 w,从而构建相似度矩阵:
这里相似度最常见的为欧式距离,也可以使用高斯核函数、余弦相似度等计算相似度。
B.计算度矩阵
度是图论中的概念,也就是矩阵 W 行或者列的元素之和。
C.计算拉普拉斯矩阵
谱聚类基于前面的相似度矩阵与度矩阵构造 Laplace 矩阵,通过特征值计算评估不同数据的相似度。这里可以理解为将原始数据嵌入到由相似度矩阵映射出来的低维子空间,然后直接通过常规的聚类算法得到聚类结果。
其中 D 为度矩阵,W 为相似度矩阵。后续涉及到特征值与特征向量的计算,通过对特征向量使用类似 K-means 的算法衡量相似度并按照 K 进行聚类。
2.快速迭代聚类
关于 PIC 完整的推理与论文描述大家可以参考:Power Iteration Clustering。下面对算法做简单分解:
A.Input
输入一个按行归一化的关联矩阵 W 和期望的聚类 Cluster 数目,并随机选取一个初始化向量 v0。
B.Repeat
令
且
C.Until
不断增加 t,直到:
使用 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 矩阵分解获取特征值特征向量,更适合非凸模型数据的聚类,但不可复用。