首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Spark MLlib 做 K-means 聚类分析(3)

使用 Spark MLlib 做 K-means 聚类分析(3)

运行示例程序和本系列其他文章一样,我们依然选择使用 HDFS 存储数据文件。运行程序之前,我们需要将前文提到的训练和测试数据集上传到 HDFS。
图 6. 测试数据的 HDFS 目录清单 2. 示例程序运行命令
1
2
3
4
5
6
7
8
9
10
./spark-submit --class com.ibm.spark.exercise.mllib.KMeansClustering \
--master spark://<spark_master_node_ip>:7077 \
--num-executors 6 \
--driver-memory 3g \
--executor-memory 512m \
--total-executor-cores 6 \
/home/fams/spark_exercise-1.0.jar \
hdfs://<hdfs_namenode_ip>:9000/user/fams/mllib/wholesale_customers_data_training.txt \
hdfs://<hdfs_namenode_ip>:9000/user/fams/mllib/wholesale_customers_data_test.txt \
8 30 3




图 7. K-means 聚类示例程序运行结果如何选择 K前面提到 K 的选择是 K-means 算法的关键,Spark                                MLlib 在 KMeansModel 类里提供了 computeCost 方法,该方法通过计算所有数据点到其最近的中心点的平方和来评估聚类的效果。一般来说,同样的迭代次数和算法跑的次数,这个值越小代表聚类的效果越好。但是在实际情况下,我们还要考虑到聚类结果的可解释性,不能一味的选择使 computeCost 结果值最小的那个 K。
清单 3. K 选择示例代码片段
1
2
3
4
5
6
val ks:Array[Int] = Array(3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
ks.foreach(cluster => {
val model:KMeansModel = KMeans.train(parsedTrainingData, cluster,30,1)
val ssd = model.computeCost(parsedTrainingData)
println("sum of squared distances of points to their nearest center when k=" + cluster + " -> "+ ssd)
})




图 8. K 选择示例程序运行结果从上图的运行结果可以看到,当 K=9 时,cost 值有波动,但是后面又逐渐减小了,所以我们选择 8 这个临界点作为 K 的个数。当然可以多跑几次,找一个稳定的 K 值。理论上 K 的值越大,聚类的 cost 越小,极限情况下,每个点都是一个聚类,这时候 cost 是 0,但是显然这不是一个具有实际意义的聚类结果。
结束语通过本文的学习,读者已经初步了解了 Spark 的机器学习库,并且掌握了 K-means 算法的基本原理,以及如何基于 Spark                                MLlib 构建自己的机器学习应用。机器学习应用的构建是一个复杂的过程,我们通常还需要对数据进行预处理,然后特征提取以及数据清洗等,然后才能利用算法来分析数据。Spark                                MLlib 区别于传统的机器学习工具,不仅是因为它提供了简单易用的 API,更重要的是 Spark 在处理大数据上的高效以及在迭代计算时的独特优势。虽然本文所采用的测试数据集很小,并不能反映大数据的应用场景,但是对于掌握基本原理已经足够,并且如果读者拥有更大的数据集就可以轻松的将本文的测试程序推广到大数据聚类的场景下,因为 Spark                                MLlib 的编程模型都是一致的,无非是数据读取和处理的方式略有不同。希望读者可以在本文中找到自己感兴趣的知识,相信这对读者今后深入学习是有帮助的。另外,读者在阅读本文的过程中,如果遇到问题或者发现不足之处,请不吝赐教,在文末留言,共同交流学习,谢谢。
返回列表