02storm聚类尝试kmeans

来源:互联网 发布:手机数据包解压软件 编辑:程序博客网 时间:2024/06/06 21:21

先挑个最简单的算法尝试

01聚类kmeans算法和kmeans例子演示

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为c个类别,算法描述如下:
(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。
来之百度百科:http://baike.baidu.com/link?url=sSyKEDTwqhsaJR4fqdNTP_JbxipZg1w82YcJZEcoKw8SxpZICi-OF5D47LztuG5jNcUU4igWC01ZA_qCMlR2Ca
例子演示。假设现在有1,6,7,9,15,16。这六个点作为数据集。按照kmeans算法来演练
1:选择 1 和16作为我们的初始中心点,两个中心点确定了,聚类结束后,会有两类。定为聚类c1和c2
2:每个点到这两个初始中心点的距离。以6为例。
使用欧氏距离为例  n = 根号 [(x1-x2)2+(y1-y2)2+...]
6到初始点1的距离 n1 = 根号 [(6-1)2] =  5  ; 6到初始点16的距离 n2 = 根号[(6-16)2] = 10
n1< n2,说明 6属于初始点1所在的聚类c1。
    其他点都带入上面的距离公式后,得到的c1 = {1 , 6 , 7} .c2 = {9  , 15 , 16}

3:使用均值算法(求平均数)

v = [(x1+x2+......xn)+(y1+y2+......+yn)+......] / n

更新 中心点。 

c1 = {1 , 6 , 7} .的均值 v1 = (1+6+7) / 3 = 4.67 ,  c2 = {9  , 15 , 16}的均值 v2 = (9+15+16)/ 3 = 10;

4:以  v1,v2,作为新的中心点 带入2,3.反复迭代K次。知道中心点第k次和k-1次的中心点相等,即收敛。则聚类结束。


算法分析,

1:该算法的初始点的个数选择,决定了最终聚类结果类型的个数 。初始点的选择很大影响了迭代的次数,尽量选择个中间的点。

2:该算法是个反复迭代K次,直到中心点收敛的迭代过程。这个K次可能非常长,可以通过指定迭代次数的最大值。假设10如果迭代10次后也中心点仍然为收敛,此时迭代结束。

3:每个点到这两个初始中心点的距离,的这个距离公式的选择,欧式距离,余弦距离,等距离公式的不同都会影响到聚类效果。

02storm实现分布式kmeans聚类算法的思路

1:该算法是个全量数据的迭代过程,如果storm做当然要做成分布式,那么得会打散数据集。再对划分后的数据集的做一次kmeans迭代,将各个分区最终的中心点,作为初始点汇集在一起,再一次kmeans计算中心点。得最后的聚类结果。

2:见分而治之的算法和kmeans的原始定义是不一致的:。

3:其次做分而治之的话。值是多个点有多个维度的数字,并且算法不是简单的加法运算,不想url求总数只有一个字符,可以按hash(url)取模1024去分区。



03实现kmeans算法相关开源项目的思路参考

03-1 mahout实现分布式kmeans思路:

org.apache.mahout.clustering.kmeans.KMeansDriver这个类开始分析

    //距离公式实现

    String measureClass = getOption(DefaultOptionCreator.DISTANCE_MEASURE_OPTION);
   
未指定默认使用为开根号的欧氏距离

   if (measureClass == null) {
      measureClass = SquaredEuclideanDistanceMeasure.class.getName();
    }
   
//迭代过程之间的中心点 的收敛距离阀值,默认值是 0.5

    double convergenceDelta = Double.parseDouble(getOption(DefaultOptionCreator.CONVERGENCE_DELTA_OPTION));
   
最大迭代次数K

    int maxIterations = Integer.parseInt(getOption(DefaultOptionCreator.MAX_ITERATIONS_OPTION));
距离实例化
    DistanceMeasure measure = ClassUtils.instantiateAs(measureClass, DistanceMeasure.class);
    
   
聚类结果最后的类型个数

    if (hasOption(DefaultOptionCreator.NUM_CLUSTERS_OPTION)) {
      clusters = RandomSeedGenerator.buildRandom(getConf(), input, clusters,
          Integer.parseInt(getOption(DefaultOptionCreator.NUM_CLUSTERS_OPTION)), measure);
    }
   
 计算簇中心后是否计算各个点属于哪个中心

    boolean runClustering = hasOption(DefaultOptionCreator.CLUSTERING_OPTION);
    boolean runSequential = getOption(DefaultOptionCreator.METHOD_OPTION).equalsIgnoreCase(
        DefaultOptionCreator.SEQUENTIAL_METHOD);
    double clusterClassificationThreshold = 0.0;
    if (hasOption(DefaultOptionCreator.OUTLIER_THRESHOLD)) {
      clusterClassificationThreshold = Double.parseDouble(getOption(DefaultOptionCreator.OUTLIER_THRESHOLD));
    }
    run(getConf(), input, clusters, output, convergenceDelta, maxIterations, runClustering,
        clusterClassificationThreshold, runSequential);
    return 0;

//参数

1)    Path Input : 所有待聚类的数据点的路劲,参数不可缺

2)    Path clusters :存储每个簇中心的路劲,参数不可缺

3)    Path output :聚类结果存储的路劲,参数不可缺,如果指定了簇的个数,则该路劲下文件可为空

4)    DistanceMeasure measure :数据点间的距离计算方法,参数可缺,默认是 SquaredEuclidean 算方法

     提供参数值:   ChebyshevDistanceMeasure 切比雪夫距离

                    CosineDistanceMeasure 余弦距离

                    EuclideanDistanceMeasure 欧氏距离

                    MahalanobisDistanceMeasure 马氏距离

                    ManhattanDistanceMeasure 曼哈顿距离

                   MinkowskiDistanceMeasure 闵可夫斯基距离

                   SquaredEuclideanDistanceMeasure 欧氏距离 ( 不采取平方根 )

                   TanimotoDistanceMeasure  Tanimoto 系数距离

                   还有一些基于权重的距离计算方法:

                   WeightedDistanceMeasure

                    WeightedEuclideanDistanceMeasure 、 WeightedManhattanDistanceMeasure

5)  Double convergenceDelta: 收敛系数 新的簇中心与上次的簇中心的的距离不能超过 convergenceDelta ,如果超过,则继续迭代,否则停止迭代。参数可缺,默认值是 0.5

6)  int maxIterations : 最大迭代次数,如果迭代次数小于 maxIterations ,继续迭代,否则停止跌打,与 5) 中的convergenceDelta 满足任何一个停止迭代的条件,则停止迭代。参数不可缺。

7)  boolean runClustering :如果是 true 则在计算簇中心后,计算每个数据点属于哪个簇,否则计算簇中心后结束,参数可缺,默认为 true

8)  clusteringOption :采用单机或者 Map/Reduce 的方法计算。参数可缺,默认是 mapreduce 。

9)  int numClustersOption :簇的个数,参数可缺。

-----未完




0 0
原创粉丝点击