5.2.4 使用Spark MLlib实现K⁃means聚类分析

更新于 2026年10月10日 版权声明
5.2.4 使用Spark MLlib实现K⁃means聚类分析

Spark MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤、维度缩减等。使用Spark MLlib来做机器学习工作,通常只需要在对原始数据进行处理后,然后直接调用相应的API就可以实现。第2章介绍了K⁃means聚类算法,下面介绍用Spark MLlib实现K⁃means聚类分析具体方法。

1)K⁃means聚类算法原理

聚类分析是一个无监督学习(Unsupervised Learning)过程,一般是用来对数据对象按照其特征属性进行分组,经常被应用在客户分群、欺诈检测、图像分析等领域。K⁃means应该是最有名并且最经常使用的聚类算法,其原理比较容易理解,并且聚类效果良好,有着广泛的使用。

和诸多机器学习算法一样,K⁃means算法也是一个迭代式的算法,其主要步骤如下:

第一步 选择图示个点作为初始聚类中心。

第二步 计算其余所有点到聚类中心的距离,并把每个点划分到离它最近的聚类中心所在的聚类中去。在这里,衡量距离一般有多个函数可以选择,最常用的是欧几里得距离(Euclidean Distance),也叫欧式距离。公式如下:

图示 (5⁃1)

式(5⁃1)中图示:空间维数;图示:第i维中心点坐标;图示:第图示维非聚类中心点坐标。

第三步 重新计算每个聚类中所有点的平均值,并将其作为新的聚类中心点。

最后,重复第二、三步的过程,直至聚类中心不再发生改变,或者算法达到预定的迭代次数,又或者聚类中心的改变小于预先设定的阈值。

在实际应用中,K⁃means算法有两个不得不面对且需克服的问题。

①聚类个数K的选择。K的选择是一个比较有学问和讲究的问题,可以使用Spark提供的工具选择K。

②初始聚类中心点的选择。选择不同的聚类中心可能导致聚类结果的差异。

实现Spark MLlib K⁃means算法在初始聚类点的选择上,借鉴了一个叫K⁃meansⅡ的类K⁃means++实现。K⁃means++算法在初始点选择上遵循一个基本原则:初始聚类中心点相互之间的距离应该尽可能远。基本步骤如下:

第一步 从输入的数据点集合中随机选择一个点作为第一个初始聚类点。

第二步 对于数据集中的每一个点x,计算它与最近被选出的初始聚类点的距离图示。

第三步 选择一个新的数据点作为新的初始聚类点,一般地,图示值较大的点被选作为新的初始聚类点的概率较大。

第四步 重复第二、三步过程,直到初始聚类点被选择出来。

2)MLlib的K⁃means实现

(1)KMeans类

Spark MLlib中K⁃means算法的实现类(KMeans.scala)具有以下参数,如图5⁃10所示。

图示

图5⁃10 KMeans.scala参数

其参数含义具体如下:

• k:期望的聚类的个数。

• maxInterations:方法单次运行最大的迭代次数。

• runs:算法被运行的次数。K⁃means算法不保证能返回全局最优的聚类结果,所以在目标数据集上多次跑K⁃means算法,有助于返回最佳聚类结果。

• initializationMode:初始聚类中心点的选择方式,目前支持随机选择或者K⁃meansⅡ方式。默认是K⁃meansⅡ。

• initializationSteps:K⁃meansⅡ方法中的步数。

• epsilon:K⁃means算法迭代收敛的阈值。

• seed:集群初始化时的随机种子。

通过下面的默认构造函数,可以看到这些可调参数具有的初始值,如图5⁃11所示。

图示(https://www.daowen.com)

图5⁃11 可调参数初始值查看

通常应用时,人们都会先调用KMeans.train方法对数据集进行聚类训练,这个方法会返回KMeansModel类实例,然后也可以使用KMeansModel.predict方法对新的数据点进行所属聚类的预测,这是非常实用的功能。

KMeans.train方法有很多重载方法,这里选择参数最全的一个重载方法,如图5⁃12所示。

图示

图5⁃12 KMeans.train方法的重载方法

KMeansModel.predict方法接受不同的参数,可以是向量或者RDD,返回是入参所属的聚类的索引号,其定义如图5⁃13所示。

图示

图5⁃13 KMeansModel.predict接受参数

(2)数据获取

所用到的目标数据集来自UCI Machine Learning Repository的Wholesale customer Data Set。UCI是一个关于机器学习测试数据的下载中心站点,里面包含了适用于做聚类、分群、回归等各种机器学习问题的数据集。

Wholesale customer Data Set是引用某批发经销商的客户在各种类别产品上的年消费数。为了方便处理,把原始的CSV格式转化成了两个文本文件,分别是训练用数据和测试用数据,其数据格式如图5⁃14所示。

图示

图5⁃14 客户消费数据格式

可以从图中标题清楚地看到每一列代表的含义,当然也可以到UCI网站上去找到关于该数据集的更多信息。

(3)K⁃means实现

根据目标客户的消费数据,将每一列视为一个特征指标,对数据集进行聚类分析,下面是聚类分析实现类源码。

程序接受5个入参,分别是:

• 训练数据集文件路径;

• 测试数据集文件路径;

• 聚类的个数;

• K⁃means算法的迭代次数;

• K⁃means算法run的次数。

(4)程序运行

选择使用HDFS存储数据文件,运行程序之前,需要将训练和测试数据集上传到HDFS。图5⁃15是测试数据的HDFS目录。

图示

图5⁃15 测试数据的HDFS目录

程序运行命令如下。

该程序运行结果如图5⁃16所示。

图示

图5⁃16 Spark MLlib实现K⁃means聚类分析运行结果图

K的选择是K⁃means算法的关键,Spark MLlib在KMeansModel类里提供了computeCost方法来选择K,该方法通过计算所有数据点到其最近的中心点的平方和来评估聚类的效果。一般来说,同样的迭代次数和算法跑的次数,这个平方和越小,代表聚类的效果越好。但是在实际情况下,还要考虑到聚类结果的可解释性,不能一味地选择使computeCost结果值最小的那个K。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)