k means聚類演算法的java實現

2021-08-10 00:21:20 字數 3979 閱讀 3346

聚類分析是一種重要的人類行為,早在孩提時代,乙個人就通過不斷改進下意識中的聚類模式來學會如何區分貓狗、動物植物。目前在許多領域都得到了廣泛的研究和成功的應用,如用於模式識別、資料分析、影象處理、市場研究、客戶分割、web文件分類等[1]。

聚類就是按照某個特定標準(如距離準則)把乙個資料集分割成不同的類或簇,使得同乙個簇內的資料物件的相似性盡可能大,同時不在同乙個簇中的資料物件的差異性也盡可能地大。即聚類後同一類的資料盡可能聚集到一起,不同資料盡量分離。

聚類技術[2]正在蓬勃發展,對此有貢獻的研究領域包括資料探勘、統計學、機器學習、空間資料庫技術、生物學以及市場營銷等。各種聚類方法也被不斷提出和改進,而不同的方法適合於不同型別的資料,因此對各種聚類方法、聚類效果的比較成為值得研究的課題。

在資料分析的術語之中,聚類和分類是兩種技術。分類是指我們已經知道了事物的類別,需要從樣品中學習分類的規則,是一種有指導學習;而

聚類則是由我們來給定簡單的規則,從而得到分類

,是一種無指導學習。兩者可以說是相反的過程。

k-means聚類演算法過程如下:

1、選取k個點作為初始質心(隨機);

2、對每個樣本分別計算到k個質心的相似度或距離,將該樣本劃分到相似度最高或距離最短的質心所在類;

3、對該輪計算結果,計算每乙個類別的質心,新的質心作為下一輪的質心;

4、判斷演算法是否滿足終止條件(即:前後兩個質心陣列中前一組的質心是否在後乙個質心組出現),滿足則結束,否則繼續2、3、4;

測試文字如下:

a    2     3

b     2     7

c     1     2

d     1     6

e     2     1

f     3     5

g     8     5

h     9     6

i     7     7

j     7     4

k     8     2

l     8     22

m     8     19

n     7     21

o     7     17

p     9     20

**實現n個點的聚類:

public class point   

public void setname(string name)

public double getx()

public void setx(double x)

public double gety()

public void sety(double y)

@override

public boolean equals(object obj)

return false;

} @override

public string tostring()

@override

public int hashcode()

}

k-means聚類如下:

public class kmeansclustering 

/*** 初始化資料集

* * @throws ioexception

*/private void initdataset() throws ioexception

} /**

* @param k

* 聚類的數目

*/public map> kcluster(int k)

// 上一次的聚簇中心

map> lastclustercentermap = null;

// 找到離中心最近的點,然後加入以該中心為map鍵的list中

while (true)

}nowclustercentermap.get(key).add(point);

}// 如果結果與上一次相同,則整個過程結束

if (isequalcenter(lastclustercentermap, nowclustercentermap))

lastclustercentermap = nowclustercentermap;

nowclustercentermap = new hashmap>();

// 把中心點移到其所有成員的平均位置處,並構建新的聚簇中心

for (entry> entry : lastclustercentermap

.entryset())

} return nowclustercentermap;

} /**

* 判斷前後兩次是否是相同的聚簇中心,若是則程式結束,否則繼續,直到相同

* * @param lastclustercentermap

* @param nowclustercentermap

* @return bool

*/private boolean isequalcenter(map> lastclustercentermap, map> nowclustercentermap) else

}} return true;

} /**

* 計算新的中心

* * @param value

* @return point

*/private point getnewcenterpoint(listvalue)

point point = new point();

point.setx(sumx / value.size());

point.sety(sumy / value.size());

return point;

} /**

* 使用歐幾里得演算法計算兩點之間距離

* * @param point1

* @param point2

* @return 兩點之間距離

*/private double distance(point point1, point point2)

public static void main(string args) throws ioexception

} }}

聚類結果每次會受k值的影響,結果可能會產生不同。幾個聚類結果如下:

第一次結果:

***************聚簇中心為:(4.545454545454546,4.363636363636363)***************=ab

c d

e f

g h

i j

k ***************聚簇中心為:(7.5,18.0)***************=

m o

***************聚簇中心為:(8.0,21.0)***************=

l n

p 第二次結果:

***************聚簇中心為:(1.8333333333333333,4.0)***************=ab

c d

e f

***************聚簇中心為:(7.8,19.8)***************=

l m

n o

p ***************聚簇中心為:(7.8,4.8)***************=

g h

i j

k 第三次結果:

***************聚簇中心為:(1.8333333333333333,4.0)***************=ab

c d

e f

***************聚簇中心為:(7.8,19.8)***************=

l m

n o

p ***************聚簇中心為:(7.8,4.8)***************=

g h

i j

k

K Means聚類演算法

k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...

聚類演算法 K means

演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...

k means聚類演算法

說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...