Advertisement

数据挖掘之聚类算法K-Means总结

阅读量:

由于项目需要,需要对数据进行处理,故而又要滚回来看看paper,做点小功课,这篇文章只是简单的总结一下基础的Kmeans算法思想以及实现;

正文:

1.基础Kmeans算法.

Kmeans算法的属于基础的聚类算法,它的核心思想是: 从初始的数据点集合,不断纳入新的点,然后再从新计算集合的“中心”,再以改点为初始点重新纳入新的点到集合,在计算”中心”,依次往复,直到这些集合不再都不能再纳入新的数据为止.

图解:

假如我们在坐标轴中存在如下A,B,C,D,E一共五个点,然后我们初始化(或者更贴切的说指定)两个特征点(意思就是将五个点分成两个类),采用欧式距离计算距离.

注意的点:

1.中心计算方式不固定,常用的有使用距离(欧式距离,马式距离,曼哈顿距离,明考斯距离)的中点,还有重量的质心,还有属性值的均值等等,虽然计算方式不同,但是整体上Kmeans求解的思路相同.

2.初始化的特征点(选取的K个特征数据)会对整个收据聚类产生影响.所以为了得到需要的结果,需要预设指定的凸显的特征点,然后再用Kmeans进行聚类.

代码实现:

复制代码
      1package com.data.algorithm;
      2  3import java.util.ArrayList;
      4import java.util.List;
      5  6/**  7 * *********************************************************
      8 * <p/>
      9 * Author:     XiJun.Gong
     10 * Date:       2017-01-17 15:57
     11 * Version:    default 1.0.0
     12 * Class description:
     13 * <p/>
     14 * *********************************************************
     15*/ 16publicclass Kmeans {
     17privatefinaldouble;
     18 19private topk;
     20 21public getTopk() {
     22return topk;
     23    }
     24 25publicvoid topk) {
     26this topk;
     27    }
     28 29class KMeanData {
     30 31privatefloat//x坐标 32privatefloat//y坐标 33privateint//隶属于哪一个簇 34 35publicint getFlag() {
     36return flag;
     37        }
     38 39publicvoidint flag) {
     40this flag;
     41        }
     42 43publicfloat getX() {
     44return x;
     45        }
     46 47publicvoidfloat x) {
     48this x;
     49        }
     50 51publicfloat getY() {
     52return y;
     53        }
     54 55publicvoidfloat y) {
     56this y;
     57        }
     58    }
     59 60publicbooleanfloatfloat b) {
     61returntruefalse;
     62    }
     63 64publicfloat distance(KMeanData a, KMeanData b) {
     65 66returnfloat)
     67));
     68    }
     69 70publicboolean Kequal(KMeanData a, KMeanData b) {
     71if exp)
     72returntrue;
     73returnfalse;
     74    }
     75 76publicintint range) {
     77new KMeanData[size];
     78forint) {
     79new KMeanData();
     80float range));
     81float range));
     82);
     83        }
     84return kmData;
     85    }
     86 87publicvoidfinalint k) {
     88forint) {
     89thisthis);
     90forint) {
     91if i) {
     92);
     93                }
     94            }
     95);
     96        }
     97    }
     98 99publicfinalint k) {
    100ifnull) {
    101);
    102returnnull;
    103        }
    104if data.length) {
    105 data.length);
    106returnnull;
    107        }
    108/*随机选取k个点*/109new();
    110int k;
    111//均值步长取k的初始簇112forint stride) {
    113);
    114            topk.add(data[i]);
    115        }
    116//聚合117whiletrue) {
    118forint) {
    119floatfloat) 1e9, dist;
    120int;
    121for (KMeanData kter : topk) {
    122if distance(data[i], kter))) {
    123 dist;
    124 i;
    125                    }
    126                }
    127);
    128            }
    129//重新计算质心130new];
    131intnewint];
    132forint) {
    133;
    134new KMeanData();
    135 data[i].getX());
    136 data[i].getY());
    137            }
    138forint) {
    139 kcnt[i]);
    140            }
    141//判断一下是否是已经收敛了142booleanfalse;
    143forint) {
    144if])) {
    145true;
    146]);
    147                }
    148            }
    149ifbreak;
    150        }
    151return data;
    152    }
    153

View Code

复制代码
     1package com.data.algorithm;
     2 3 4/** 5 * *********************************************************
     6 * <p/>
     7 * Author:     XiJun.Gong
     8 * Date:       2017-01-17 17:57
     9 * Version:    default 1.0.0
    10 * Class description:
    11 * <p/>
    12 * *********************************************************
    13*/14publicclass Main {
    15publicstaticvoid main(String args[]) {
    16new Kmeans();
    17);
    18    }
    19

View Code

复制代码
     1 )
     2 )
     3 4 )
     5 )
     6 7 )
     8 )
     910 )
    11 )
    1213 )
    14 )
    1516 )
    17 )
    1819 )
    20 )
    2122 )
    23 )
    2425 )
    26 )
    2728 )
    29

2. 改进的KMeans算法;

KMeans算法存在很多很多的改进版, 比如有优化最开始的K个特征数据选取的,还有如何减少计算量的,这里就介绍一下最后一种变种.

2.1 Mini Batch K-Means;

Mini Batch K-Means思想核心: 在求解稳定的聚类中心时,每次随机抽取一批数据,然后进行Kmean计算,然后直至中心点稳定之后,在将所有的数据依据这些中心点进行分类,从而达到和KMeans一样的效果,同时有大大的减少了中间的计算量.

应用的范围: 在面对巨大的数据量时,可以考虑使用这种思路.

参考文献:

http://image.hanspub.org:8080/pdf/CSA20160900000_76874550.pdf

全部评论 (0)

还没有任何评论哟~