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 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)
分类是正确的
三个簇的聚集中心
Spark K-Means的更多相关文章
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN
Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...
- Apache Spark RDD(Resilient Distributed Datasets)论文
Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...
- Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)
Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...
- 快速查找无序数组中的第K大数?
1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...
- spark基础知识介绍2
dataframe以RDD为基础的分布式数据集,与RDD的区别是,带有Schema元数据,即DF所表示的二维表数据集的每一列带有名称和类型,好处:精简代码:提升执行效率:减少数据读取; 如果不配置sp ...
- 网络费用流-最小k路径覆盖
多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- numpy.ones_like(a, dtype=None, order='K', subok=True)返回和原矩阵一样形状的1矩阵
Return an array of ones with the same shape and type as a given array. Parameters: a : array_like Th ...
- 当我们在谈论kmeans(2)
本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 其他:建设中- 当我们在谈论kmeans(2 ...
随机推荐
- 用Java操作树莓派!pi4j简介与安装
简介 对C不熟?习惯了使用java不想换语言,但又想操作树莓派?想一边喝咖啡,一边吃树莓派蛋糕?快来使用pi4j吧! pi4j旨在为java开发者提供面友好的面向对象的API,来操控树莓派.pi4j对 ...
- sphinx续5-主索引增量索引和实时索引
原文件地址:http://blog.itpub.net/29806344/viewspace-1400942/ 在数据库数据非常庞大的时候,而且实时有新的数据插入,如果我们不更新索引,新的数据就sea ...
- linux与linux,linux与windows之间用SSH传输文件
linux与linux,linux与windows之间用SSH传输文件linux与linux之间传送文件:scp file username@hostIP:文件地址 例: scp abc.txt ...
- (leetcode) countandsay
class Solution { public: string calcuate(string s) { string result; char pre = s[0]; int cnt = 1; fo ...
- JS之Array.slice()方法
1.Array.slice(startIndex,endIndex); 返回由原始数组从startIndex到endIndex-1的元素构成的新数组; startIndex:默认值0,如果startI ...
- LeetCode Find Minimum in Rotated Sorted Array
原题链接在这里:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ Method 1 就是找到第一个违反升序的值,就 ...
- centos python 2.7 安装
一开始有这个需求,是因为用 YaH3C 替代 iNode 进行校园网认证时,一直编译错误,提示找不到 Python 的某个模块,百度了一下,此模块是在 Python2.7 以上才有的,但是系统的自带的 ...
- Java文件操作①——XML文件的读取
一.邂逅XML 文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输.所以XML在现今应用程序中是非常流行的.本文主要讲Java解析和生成XML.用于不同平台.不同设备间的数据 ...
- 面向对象编程(十)——继承之Super关键字及内存分析
Super关键字
- 第三篇 Integration Services:增量加载-Adding Rows
本篇文章是Integration Services系列的第三篇,详细内容请参考原文. 增量加载是什么增量加载仅加载与先前加载差异的.差异包括:->新增的行->更新的行->删除的行通过 ...