Spark MLlib之K-Means聚类算法
本章要点
一、基本含义
二、K-Means
三、Spark协同过滤实现
基本含义
聚类算法
聚类,Cluster analysis,有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能的相似,簇与簇之间的object尽可能的相异。聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,较常见的还有:层次法(CURE、CHAMELEON等)、网格算法(STING、WaveCluster等)等等。
较权威的聚类问题定义:所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇。
基本含义
与分类不同,分类是示例式学习,要求分类前明确各个类别,并断言每个元素映射到一个类别,而聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域,相应的算法也非常的多。
K-Means
K-Means属于基于平方误差的迭代重分配聚类算法,其核心思想十分简单:
随机选择K个中心点
计算所有点到这K个中心点的距离,选择距离最近的中心点为其所在的簇
简单的采用算术平均数(mean)来重新计算K个簇的中心
重复步骤2和3,直至簇类不在发生变化或者达到最大迭代值
输出结果
K-Means算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对K值的选择没有准则可依循,对异常数据较为敏感,只能处理数值属性的数据,聚类结构可能不平衡。
Spark实现K-Means算法
测试数据
测试数据不用带标签,数据分为3个维度。
Spark实现K-Means算法
public static void main(String[] args) {
SparkConf sparkConf = new SparkConf()
.setAppName("K-Means")
.setMaster("local[2]");
JavaSparkContext sc = new JavaSparkContext(sparkConf);
JavaRDD<String> data = ("/home/yurnom/data/");
JavaRDD<Vector> parsedData = (s -> {
double[] values = ((s))
.stream()
.mapToDouble(Double::parseDouble)
.toArray();
return (values);
});
Spark实现K-Means算法
int numClusters = 3; //预测分为3个簇类
int numIterations = 20; //迭代20次
int runs = 10; //运行10次,选出最优解
KMeansModel clusters = ((), numClusters, numIterations, runs);
//计算测试数据分别属于那个簇类
print((v -> ()
+ " belong to cluster :" + (v)).collect());
//计算cost
double wssse = puteCost(());
("Within Set Sum of Squared Errors = " + wssse);
//打印出中心点
("Cluster centers:");
for (Vector center : ()) {
(" " + center);
}
Spark实现K-Means算法
//进行一些预测
Spark MLlib之K-Means聚类算法 来自淘豆网m.daumloan.com转载请标明出处.