k-means演算法的Java實現
阿新 • • 發佈:2018-12-18
前言
k-means演算法是一種基於樣本間相似性度量的間接聚類方法,屬於非監督學習方法。通過指定k值將資料自動迭代分成k組,實現資料分類,然後可對分類好的資料進行進一步的研究。
演算法原理
1.在資料中隨機選取k個數據作為聚類中心 2.計算其他資料到k個聚類中心的距離(這個距離可以是歐氏距離或者其他距離) 3.根據到聚類中心的最小距離將資料分為k類 4.更新聚類中心的座標(對分類好的資料求均值) 5.回到2重新進行分類,(進行多次迭代更新,使聚類中心趨於穩定,迭代次數可根據需要自由設定)
Matlab模擬圖
來看看matlab模擬結果,先隨機撒點
kmeans演算法進行分類,k=4 資料成功分為4組,由於這裡用的均勻分佈的隨機數,資料也均勻被分為k組。
演算法實現
//Kmeans演算法
//k:聚類數量
//points:座標資料
//iteration:迭代計算次數
//返回:聚類中心
public static Point[] Kmeans(int k, Point[] points,int iteration){
if (points.length<k) return null;
//聚類中心
Point[] centre=new Point[k];
for(int i=0;i<centre.length;i++){
centre[ i]=points[i];
}
while (--iteration>0){
//分組下標,每個資料對應聚類中心陣列的下標
int[] index=new int[points.length];
//統計每組的資料數量
int[] count=new int[centre.length];
//分組
for (int i=0;i<points.length;i++){
//最小距離,-1代表沒有初值
float min=-1;
//尋找最近的聚類中心
for (int j=0;j<centre.length;j++){
float d=(float) Math.sqrt((centre[j].x-points[i].x)*(centre[j].x-points[i].x)+
(centre[j].y-points[i].y)*(centre[j].y-points[i].y));
if(min<0||d<min){
min=d;
index[i]=j;
}
}
++count[index[i]];
}
//更新聚類中心
for(int i=0;i<centre.length;i++){
centre[i].x=0;
centre[i].y=0;
}
for (int i=0;i<index.length;i++){
centre[index[i]].x+=points[i].x;
centre[index[i]].y+=points[i].y;
}
for(int i=0;i<centre.length;i++){
if (count[i]==0) continue;
centre[i].x/=count[i];
centre[i].y/=count[i];
}
}
return centre;
}