数据挖掘之聚类算法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
