zoukankan      html  css  js  c++  java
  • 记录近期小改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
  • 相关阅读:
    境外支付宝接口对接--支付接口
    js bind
    css的input文本框的 propertychange、focus、blur
    字符流Reader和Writer
    对象流--对象的序列化
    输入流IS和输出流OS学习总结
    File文件的读写操作RandomAccessFile类
    File文件操作学习总结
    Map集合的便利学习总结
    Map集合学习总结
  • 原文地址:https://www.cnblogs.com/zacard-orc/p/3558678.html
Copyright © 2011-2022 走看看