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