1. 程式人生 > >k-means演算法的Java實現

k-means演算法的Java實現

前言

k-means演算法是一種基於樣本間相似性度量的間接聚類方法,屬於非監督學習方法。通過指定k值將資料自動迭代分成k組,實現資料分類,然後可對分類好的資料進行進一步的研究。

演算法原理

1.在資料中隨機選取k個數據作為聚類中心 2.計算其他資料到k個聚類中心的距離(這個距離可以是歐氏距離或者其他距離) 3.根據到聚類中心的最小距離將資料分為k類 4.更新聚類中心的座標(對分類好的資料求均值) 5.回到2重新進行分類,(進行多次迭代更新,使聚類中心趨於穩定,迭代次數可根據需要自由設定)

Matlab模擬圖

來看看matlab模擬結果,先隨機撒點 隨機撒點

kmeans演算法進行分類,k=4 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; }