算法介绍
聚类分析是一个无监督学习 (Unsupervised Learning) 过程, 一般是用来对数据对象按照其特征属性进行分组,经常被应用在客户分群,欺诈检测,图像分析等领域。K-means 应该是最有名并且最经常使用的聚类算法了,其原理比较容易理解,并且聚类效果良好,有着广泛的使用。
K-means是聚类算法重较为简单的一种,其属于无监督学习,所以训练样本中没有没有类别标签,只有特征。
算法流程
- 第一步,选择 K 个点作为初始聚类中心。
- 第二步,计算其余所有点到聚类中心的距离,并把每个点划分到离它最近的聚类中心所在的聚类中去。在这里,衡量距离一般有多个函数可以选择,最常用的是欧几里得距离 (Euclidean Distance), 也叫欧式距离。公式如下:
其中 C 代表中心点,X 代表任意一个非中心点。 - 第三步,重新计算每个聚类中所有点的平均值,并将其作为新的聚类中心点。
- 最后,重复 (二),(三) 步的过程,直至聚类中心不再发生改变,或者算法达到预定的迭代次数,又或聚类中心的改变小于预先设定的阀值。
参数含义
- k 表示期望的聚类的个数。
- maxInterations 表示方法单次运行最大的迭代次数。
- runs 表示算法被运行的次数。K-means 算法不保证能返回全局最优的聚类结果,所以在目标数据集上多次跑 K-means 算法,有助于返回最佳聚类结果。(1.6版本后,该参数废弃)
-
- initializationMode 表示初始聚类中心点的选择方式, 目前支持随机选择或者 K-means||方式。默认是 K-means||。
- initializationSteps表示 K-means||方法中的部数。
- epsilon 表示 K-means 算法迭代收敛的阀值。
- seed 表示集群初始化时的随机种子。
通常应用时,我们都会先调用 KMeans.train 方法对数据集进行聚类训练,这个方法会返回 KMeansModel 类实例,然后我们也可以使用 KMeansModel.predict 方法对新的数据点进行所属聚类的预测,这是非常实用的功能
k-means小知识
距离计算方法
1.欧几里得距离
欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。
(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:
(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:
2.曼哈顿距离
从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(CityBlock distance)。
(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离
(2)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的曼哈顿距离
3.余弦相似度
余弦相似度,又称为余弦相似性。通过计算两个向量的夹角余弦值来评估他们的相似度。
(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
(2)两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦
类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。
案例
K-Means算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对K值的选择没有准则可依循,对异常数据较为敏感,只能处理数值属性的数据,聚类结构可能不平衡。
本实例中进行如下步骤:
1.装载数据,数据以文本文件方式进行存放;
2.将数据集聚类,设置2个类和20次迭代,进行模型训练形成数据模型;
3.打印数据模型的中心点;
4.使用误差平方之和来评估数据模型;
5.使用模型测试单点数据;
6.交叉评估1,返回结果;交叉评估2,返回数据集和结果。
数据格式
使用的kmeans_data.txt的数据如下所示:
0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2
运行参数
- 输入数据所在目录:输入数据文件目录,本例中在代码中在代码中可设置,这里设置为/Users/Iris/Documents/idea/spark-master/data/mllib/kmeans_data.txt
- 用户的评分文件路径:前一步骤中用户对十部电影评分结果文件路径,在这里设置为 /home/Iris/Documents/result_kmeans2
输出内容
1.两个簇中心点
17/06/19 16:48:23 INFO KMeans: KMeans converged in 1 iterations.
17/06/19 16:48:23 INFO KMeans: The cost is 0.11999999999994547.
17/06/19 16:48:23 INFO MapPartitionsRDD: Removing RDD 3 from persistence list
17/06/19 16:48:23 INFO BlockManager: Removing RDD 3
Cluster centers:
[9.099999999999998,9.099999999999998,9.099999999999998]
[0.1,0.1,0.1]
```
2.结果
模型确定后,可通过预测来几个数值来测试模型,
,注意数据要转换成向量
方法为:
model.predict(Vectors.dense(“0.25 0.25 0.25”.split(’ ‘).map(_.toDouble))
结果为:
0.25 0.25 0.25 1
“`
它属于cluster1