k-means算法

原理

timg.jpg

(a)背景:假定在二维空间中有一些待分类的样本,需要将这些样本点分为2类。
(b)随机选择n个点(n=类别数2),作为第一轮的分类中心点
(c)计算每个待测样本点与两个中心点的距离,将其归类到较近的那个类
(d)在上一轮分类得到的样本中,分别取两个类样本的中心作为新一轮的中心点。
(e)重复c,d,直到中心点不再变化。

算法实现

基于spark-mllib

数据来源:

数据源:某批发经销商的客户在各种类别产品上的年消费数
来自UCI Machine Learning Repository
http://archive.ics.uci.edu/ml/datasets/Wholesale+customers

image.png

代码实现

package Cluster

import org.apache.spark.mllib.clustering.{KMeansModel,KMeans}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkContext, SparkConf}

/**
  * Created by dengyu on 17/6/2.
  */
object KmeansTest {
  private def isColumnNameLine(line:String):Boolean = {
    if(line!=null && line.contains("Channel")) true else false
  }

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("K-means").setMaster("local")
    val sc = new SparkContext(conf)
    //读取源数据
    val rawData = sc.textFile("file:///Users/dengyu/Downloads/a.csv")
    //将源数据分为训练数据和测试数据
    val splitData = rawData.randomSplit(Array(0.7,0.3))
    val trainData = splitData(0)
    val testData = splitData(1)

    //处理训练数据,获得训练矩阵
    val train = trainData.filter(line => !isColumnNameLine(line)).map(
      line =>
        {Vectors.dense(line.split(",").map(_.trim).filter(!"".equals(_)).map(_.toDouble))}
    )
    //设置聚类的类别数量 
    val numClusters = 8
    //设置迭代次数
    val numIterations = 39
    //设置run的次数
    val runTimes = 3
    var clusterIndex : Int = 0
    //建模
    val clusters:KMeansModel = KMeans.train(train,numClusters,numIterations,runTimes)
    println("Cluster Number:"+clusters.clusterCenters.length)
    println("Cluster Centers Information Overview:")
    //输出聚类中心点的坐标
    clusters.clusterCenters.foreach(x=>{
      print("Center Point of Cluster:"+clusterIndex+":")
      println(x)
      clusterIndex += 1
    })
    //处理测试数据,获取测试矩阵
    val test = testData.filter(line => !isColumnNameLine(line)).map(
      line =>
      {Vectors.dense(line.split(",").map(_.trim).filter(!"".equals(_)).map(_.toDouble))}
    )
    //用聚类模型预测测试集,返回所在的聚类中心
    test.collect().foreach(testLine =>
    {
      val predictedClusterIndex:Int = clusters.predict(testLine)
      println("The data "+testLine.toString+" belongs to cluster "+ predictedClusterIndex)
    })

  }

}

结果

8个类及其类别中心点:

Cluster Number:8
Cluster Centers Information Overview:
Center Point of Cluster:0:[1.0793650793650793,2.515873015873016,5078.166666666666,2918.9841269841268,3263.6666666666665,2610.4841269841268,881.6428571428571,896.015873015873]
Center Point of Cluster:1:[2.0,3.0,40204.0,46314.0,57584.5,5518.0,25436.0,4241.0]
Center Point of Cluster:2:[1.1363636363636365,2.6363636363636362,40838.5,5504.227272727273,6354.772727272727,5843.590909090909,943.909090909091,2363.909090909091]
Center Point of Cluster:3:[1.830188679245283,2.5283018867924527,3388.433962264151,9543.32075471698,15430.358490566037,1309.0566037735848,6567.11320754717,1376.1509433962265]
Center Point of Cluster:4:[1.6486486486486487,2.621621621621622,13174.270270270272,6613.594594594595,9301.72972972973,1761.3513513513515,3120.0810810810813,1895.945945945946]
Center Point of Cluster:5:[2.0,3.0,22925.0,73498.0,32114.0,987.0,20070.0,903.0]
Center Point of Cluster:6:[1.0597014925373134,2.582089552238806,18936.17910447761,2617.3283582089553,3120.7014925373132,4561.985074626866,517.7164179104477,1404.5223880597014]
Center Point of Cluster:7:[2.0,2.2666666666666666,8766.533333333333,18596.266666666666,32031.933333333334,2014.8,15845.866666666667,2325.2666666666664]

测试集预测结果:

The data [2.0,3.0,9413.0,8259.0,5126.0,666.0,1795.0,1451.0] belongs to cluster 4
The data [2.0,3.0,12126.0,3199.0,6975.0,480.0,3140.0,545.0] belongs to cluster 4
The data [1.0,3.0,5567.0,871.0,2010.0,3383.0,375.0,569.0] belongs to cluster 0
The data [1.0,3.0,31276.0,1917.0,4469.0,9408.0,2381.0,4334.0] belongs to cluster 2
The data [2.0,3.0,26373.0,36423.0,22019.0,5154.0,4337.0,16523.0] belongs to cluster 7
The data [2.0,3.0,16165.0,4230.0,7595.0,201.0,4003.0,57.0] belongs to cluster 4
The data [1.0,3.0,29729.0,4786.0,7326.0,6130.0,361.0,1083.0] belongs to cluster 2
The data [1.0,3.0,1502.0,1979.0,2262.0,425.0,483.0,395.0] belongs to cluster 0
The data [1.0,3.0,56159.0,555.0,902.0,10002.0,212.0,2916.0] belongs to cluster 2
The data [2.0,3.0,10850.0,7555.0,14961.0,188.0,6899.0,46.0] belongs to cluster 4
The data [2.0,3.0,630.0,11095.0,23998.0,787.0,9529.0,72.0] belongs to cluster 3
The data [2.0,3.0,9670.0,7027.0,10471.0,541.0,4618.0,65.0] belongs to cluster 4
The data [2.0,3.0,5417.0,9933.0,10487.0,38.0,7572.0,1282.0] belongs to cluster 3
The data [1.0,3.0,13779.0,1970.0,1648.0,596.0,227.0,436.0] belongs to cluster 6
The data [1.0,3.0,6137.0,5360.0,8040.0,129.0,3084.0,1603.0] belongs to cluster 0
The data [2.0,3.0,7823.0,6245.0,6544.0,4154.0,4074.0,964.0] belongs to cluster 0
The data [2.0,3.0,85.0,20959.0,45828.0,36.0,24231.0,1423.0] belongs to cluster 7
.....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容