记录近期小改K-Means至MapReduce上的心得

背景:

    在所有聚类算法中KMeans算是表面上最简单的一种,没有过多恼人的古希腊符号公式,没有过分繁杂的公式嵌套。对于一个初学矩阵或者仅有向量概念的非专业人士的来说,不可不畏是一把踹门利器。这个世界上越是简单的东西,其实越是复杂,尤其在笔者将其改造成MapReduce时,发现并非那么容易一跃而过。虽然有现成的代码供把玩,但是对于练手还是值得一试。

 

心得:

· 纯理论一笔带过

    KMean的大致实现过程就是任意指定N个的质心,然后对所有星星进行遍历,寻找与这个N个质心距离最近欧几里得距离的星星,将其归为一类,再从这一类中重新计算N个质心坐标属性。直至这N个质心坐标变化DELTA小至自己设定的阀值。

· 一些心得

  1. 网上对于KMEAN的算法有很多,大多数集中于(2质心+2维+单机)版本。要想支持(N质心+N维+MP)着实需要重新好好考虑程序架构,当然更NB者还能支持多线程。
  2. 嵌套问题是目前大多数非JAVA Hadoop计算的一道门槛,即便是JAVA类本身在JOB CHAIN上也常常会碰到傻傻分不清的情况。对于10G以上数据如何在MP上发挥最大功效,就是减少JOB和TASK之间来回SHUFFLE。
  3. 既期望一次MP,完成整个运算,同时将负载尽可能在Map阶段进行压榨。也因此,笔者在假设数据完全散列的情况下完成每组TASK的计算,已期望得到N个K(质心)离开最终质心近似向量值。在Reduce阶段粗暴地对N个K做归类,再做算术平均,再做一把全两项遍历,最后得出N个类。难就难在对N个TASK的K做重新归类
  4. 由于主要通过Streaming来计算,整个对于Hadoop的I/O还是有较大负荷。
  5. 下面两幅图简单介绍下K-Means聚合过程。左边是2个质心2维,右边是3个质心2维。

                       

 

DATA:

 

X      Y
29    12
21    33
23    23
25    23
33    24
22    36
23    12
16    20
23    32
33    10
26    23
32    14
33    7
38    4
13    33
65    77
43    63
81    87
72    64
54    71
61    67
81    58
57    81
54    79
50    82
53    62
74    58
77    55
69    81
70    82
44    55
60    58

 

posted @ 2014-02-21 00:12  RichardParker  阅读(1996)  评论(0编辑  收藏  举报