Spark K-Means
K-Means(K均值)
介绍
K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个对象,根据其到各个簇中心的距离,把他们分给距离最小的簇中心,然后重新计算每个簇平均值。重复这个过程,直到聚类准则则函数收敛。准则函数一般采用两种方式:第一种是全局误差函数,第二种是前后两次中心误差变化。
与分类不同,分类是监督学习,要求分类前明确各个类别,并断言每个元素映射到一个类别,而聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域,相应的算法也非常的多。
K-Means属于无监督学习,最大的特别和优势在于模型的建立不需要训练数据。在日常工作中,很多情况下没有办法事先获取到有效的训练数据,这时采用K-Means是一个不错的选择。但K-Means需要预先设置有多少个簇类(K值),这对于像计算某省份全部电信用户的交往圈这样的场景就完全的没办法用K-Means进行。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出cost最小时所对应的K值,这个值往往能较好的描述有多少个簇类。
运用场景
1.商务上,帮助市场分析人员从客户基本库中发现不同的客户群,并且用购买模式来刻画不同的客户群特征。
2.生物学上,用于推导植物和动物的分类,对基因的分类,获得对种群中固有结构的认识。
3.互联网上,用于对Web上的文档进行分类从而发现信息。
4.对一个游戏中的玩家进行分类(下面的案例)。
工作原理
针对包含n个对象的数据集合D以及初始化的聚类数目k,使用下面的算法。
1.从数据集合D中随机选择k个对象作为初始簇中心。
2.根据簇的中心值,把数据集合中的n个对象全部分给最“相似”的簇(“相似”根据距离长短来判断)。
3.根据簇的中心值,重新计算每个簇的中心值。
4.计算准则函数。
5.若准则函数满足阈值则退出,否则返回第二步继续。
输入数据说明
数据:玩家信息(月)
玩家(ID) |
游戏时间(小时) |
充值金额(元) |
1 |
60 |
55 |
2 |
90 |
86 |
3 |
30 |
22 |
4 |
15 |
11 |
5 |
288 |
300 |
6 |
223 |
200 |
7 |
0 |
0 |
8 |
14 |
5 |
9 |
320 |
280 |
10 |
65 |
55 |
11 |
13 |
0 |
12 |
10 |
18 |
13 |
115 |
108 |
14 |
3 |
0 |
15 |
52 |
40 |
16 |
62 |
76 |
17 |
73 |
80 |
18 |
45 |
30 |
19 |
1 |
0 |
20 |
180 |
166 |
数据抽象为如下,含义为 游戏时间(小时),充值金额(元)
把玩家分为3类:
1.优质用户(高时长,高消费)
2.普通玩家(在线时长中等,消费中等)
3.不活跃用户 (在线时间短,消费低)
流程图
测试代码
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}
object KMeansTest {
def main(args: Array[String]) {
val conf = new SparkConf()
val sc = new SparkContext(conf)
val data =sc.textFile(args(0))
val parsedData =data.map(s => Vectors.dense(s.split(' ').map(_.trim.toDouble))).cache()
//设置簇的个数为3
val numClusters =3
//迭代20次
val numIterations= 20
//运行10次,选出最优解
val runs=10
val clusters =KMeans.train(parsedData, numClusters, numIterations,runs)
// Evaluateclustering by computing Within Set Sum of Squared Errors
val WSSSE = clusters.computeCost(parsedData)
println("WithinSet Sum of Squared Errors = " + WSSSE)
val a21 =clusters.predict(Vectors.dense(57.0,30.0))
val a22 =clusters.predict(Vectors.dense(0.0,0.0))
//打印出中心点
println("Clustercenters:");
for (center <-clusters.clusterCenters) {
println(" "+ center)
}
//打印出测试数据属于哪个簇
println(parsedData.map(v=> v.toString() + " belong to cluster :" +clusters.predict(v)).collect().mkString("\n"))
println("预测第21个用户的归类为-->"+a21)
println("预测第22个用户的归类为-->"+a22)
}
}
提交代码脚本(standalone模式):
./bin/spark-submit
--name kmeans \ (项目名)
--class naiveBayes \ (主类名)
--master spark://master:7077 \ (使用集群管理器)
~/Desktop/kmeans.jar \ (代码包位置)
Hdfs://master:9000/KMeansTest.data (args(0)的参数值)
输出结果说明
可以明显的看到:
1类用户为优质用户
2类用户为普通用户
3类用户为不活跃用户
21个用户的数据为(57,30)
22个的用户数据为(0,0)
分类是正确的
三个簇的聚集中心
转载于:https://www.cnblogs.com/xiaomaohai/p/6158068.html
Spark K-Means相关推荐
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means
学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...
- K means 图片压缩
k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...
- 为了联盟还是为了部落 | K means
1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- k means聚类算法_一文读懂K-means聚类算法
1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...
- simple k means
//选择初始的k个质点 for (int j = initInstances.numInstances() - 1; j >= 0; j--) { instIndex = RandomO.nex ...
- k means聚类算法_K-Means 聚类算法 20210108
说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...
最新文章
- 12 Java面向对象之多态
- 中国北斗全球系统核心星座将于2019年年底部署完成
- Go语言int类型绑定方法
- Retrofit 2.0
- python:django应用问题汇总
- oracle 自增1,oracle自增无法从1开始
- socket编程资料-网络收集
- Mysql编码教程_mysql编码设置教程 mysql编码要怎么设置呢
- 160 - 45 Dope2112.2
- 「雕爷学编程」Arduino动手做(18)---太阳能电池模块
- Linux实现免密码登录
- 今日起开始预约!北京将发放5万份数字人民币红包
- 六、 抽象类与接口对比
- 微信秘笈之--微信多开
- 线性代数学习笔记——矩阵主要公式
- 【CCNA题库】Ti CCNA640-802V30版题库
- php 调用 百度句法分析,【原创源码】百度新版翻译API调用使用范例
- Jackie Chan Comments Spark Online Backlash
- 【光线追踪系列十一】纹理贴图
- 开源软件 商业软件_如何销售开源软件