⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 km.txt

📁 用JAVA编写的kmeans算法
💻 TXT
字号:
Kmeans算法的java实现
                                       
/*
 * Kmeans.java
 *
 * Created on 2007年1月22日, 下午12:46
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package edu.whu.iss.idle.kmeans;

/**
 *
 * @author He Jian
 */
public class Kmeans {
    
    private static int K = 2; // 类数(簇) 此程序为2 
    private static int TOTAL = 20; // 点个数 此程序为20
    private int test = 0;
    private Point[] unknown = new Point[TOTAL]; // 点数组
    private int[] type = new int[TOTAL]; // 每个点暂时的类(簇)
    private Point[] z = new Point[K];// 保存新的聚类中心
    private Point[] z0 = new Point[K]; // 保存上一次的聚类中心
    private Point sum = new Point(0.0,0.0);
    private int temp = 0;
    private int I = 0; // 迭代次数
   
    /** Creates a new instance of Kmeans */
    public Kmeans() {
        /** 进行聚类运算的20个点 */
        unknown[0] = new Point(0,0);
        unknown[1] = new Point(1,0);
        unknown[2] = new Point(0,1);
        unknown[3] = new Point(1,1);
        unknown[4] = new Point(2,1);
        unknown[5] = new Point(1,2);
        unknown[6] = new Point(2,2);
        unknown[7] = new Point(3,2);
        unknown[8] = new Point(6,6);
        unknown[9] = new Point(7,6);
        unknown[10] = new Point(8,6);
        unknown[11] = new Point(6,7);
        unknown[12] = new Point(7,7);
        unknown[13] = new Point(8,7);
        unknown[14] = new Point(9,7);
        unknown[15] = new Point(7,8);
        unknown[16] = new Point(8,8);
        unknown[17] = new Point(9,8);
        unknown[18] = new Point(8,9);
        unknown[19] = new Point(9,9);
        
        for(int i = 0;i < TOTAL; i++){
            type[i] = 0;
        }
        for(int i = 0; i < K; i++){
            z[i] = unknown[i]; // 伪随机选取
            z0[i] = new Point(0.0,0.0);
        }
    }
    
    /** 计算新的聚类中心 */
    public Point newCenter(int m){
        int n = 0;
        for(int i = 0;i < TOTAL; i++){
            if(type[i] == m){
                sum.setX(sum.getX() + unknown[i].getX());
                sum.setY(sum.getY() + unknown[i].getY());
                n += 1;
            }
        }
        sum.setX(sum.getX() / n);
        sum.setY(sum.getY() / n);
        return sum;
    }
    
    /** 比较两个聚类中心是否相等 */
    public boolean isEqual(Point p1,Point p2){
        if(p1.getX() * 10 == p2.getX() * 10 && p1.getY() * 10 == p2.getY() * 10)
            return true;
        else
            return false;
    }
    
    /** 计算两点之间的欧式距离 */
    public static double distance(Point p1,Point p2){
        return (p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) + 
                (p1.getY() - p2.getY()) * (p1.getY() - p2.getY());
    }
    
    /** 进行迭代,对TOTAL个样本根据聚类中心进行分类 */
    public void order(){
        int temp = 0; // 记录unknown[i]暂时在哪个类中
        for(int i = 0; i < TOTAL;i ++){
            for(int j = 0; j < 2;j++){
                if(distance(unknown[i],z[temp]) > distance(unknown[i],z[j]))
                    temp = j;
            }
            type[i] = temp;
            System.out.println("经比较后," + unknown[i].toString() + "被归为" + temp +"类" );
        }
    }
    
    public void main(){
        System.out.println("共有如下个未知样本:");
        for(int i = 0; i < TOTAL;i++){
            System.out.println(unknown[i]);
            //System.out.println("初始时,第" + i + "类中心:" + z[i].toString());
        }
        for(int i = 0; i < K;i++)
            System.out.println("初始时,第" + i + "类中心:" + z[i].toString());
        while(test != K){
            order();
            for(int i = 0; i < K;i ++){
                z[i] = newCenter(i);
                System.out.println("第" + i + " 类新中心:" + z[i].toString());
                if(isEqual(z[i],z0[i]))
                    test += 1;
                else
                    z0[i] = z[i];
            }
            I += 1;
            System.out.println("已完成第" + I + "次迭代");
            System.out.println("分类后有:");
            for(int j = 0;j < K;j++){
                System.out.println("第" + j + "类分类有: ");
                for(int i = 0;i < TOTAL;i++){
                    if(type[i] == j)
                        System.out.println(unknown[i].toString());
                }
            }
        }
    }
    
    public static void main(String[] args){
        new Kmeans().main();
    }
}

/*
 * Point.java
 *
 * Created on 2007年1月22日, 下午12:50
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package edu.whu.iss.idle.kmeans;

/**
 *
 * @author He Jian
 */
public class Point {
    
    private double x = 0;
    private double y = 0;
    
    /** Creates a new instance of Point */
    public Point(double x,double y) {
        this.setX(x);
        this.setY(y);
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
    
    public String toString(){
        return "[" + x + "," + y + "]";
    }
    
    /**
    public static void main(String[] args) {
        System.out.println(new Point(3,4).toString());
    }*/
}

共20个点,簇数为2,点分别是
(0,0);(1,0);(0,1);(1,1);
(2,1);(1,2);(2,2);(3,2);
(6,6);(7,6);(8,6);(6,7);
(7,7);(8,7);(9,7);(7,8);
(8,8);(9,8);(8,9);(9,9)
运行后显示的结果为:
init:
deps-jar:
Compiling 1 source file to E:\workspace\Know\build\classes
compile-single:
run-single:
共有如下个未知样本:
[0.0,0.0]
[1.0,0.0]
[0.0,1.0]
[1.0,1.0]
[2.0,1.0]
[1.0,2.0]
[2.0,2.0]
[3.0,2.0]
[6.0,6.0]
[7.0,6.0]
[8.0,6.0]
[6.0,7.0]
[7.0,7.0]
[8.0,7.0]
[9.0,7.0]
[7.0,8.0]
[8.0,8.0]
[9.0,8.0]
[8.0,9.0]
[9.0,9.0]
初始时,第0类中心:[0.0,0.0]
初始时,第1类中心:[1.0,0.0]
经比较后,[0.0,0.0]被归为0类
经比较后,[1.0,0.0]被归为1类
经比较后,[0.0,1.0]被归为0类
经比较后,[1.0,1.0]被归为1类
经比较后,[2.0,1.0]被归为1类
经比较后,[1.0,2.0]被归为1类
经比较后,[2.0,2.0]被归为1类
经比较后,[3.0,2.0]被归为1类
经比较后,[6.0,6.0]被归为1类
经比较后,[7.0,6.0]被归为1类
经比较后,[8.0,6.0]被归为1类
经比较后,[6.0,7.0]被归为1类
经比较后,[7.0,7.0]被归为1类
经比较后,[8.0,7.0]被归为1类
经比较后,[9.0,7.0]被归为1类
经比较后,[7.0,8.0]被归为1类
经比较后,[8.0,8.0]被归为1类
经比较后,[9.0,8.0]被归为1类
经比较后,[8.0,9.0]被归为1类
经比较后,[9.0,9.0]被归为1类
第0 类新中心:[0.0,0.5]
第1 类新中心:[5.666666666666667,5.361111111111111]
已完成第1次迭代
分类后有:
第0类分类有: 
[0.0,0.0]
[0.0,1.0]
第1类分类有: 
[1.0,0.0]
[1.0,1.0]
[2.0,1.0]
[1.0,2.0]
[2.0,2.0]
[3.0,2.0]
[6.0,6.0]
[7.0,6.0]
[8.0,6.0]
[6.0,7.0]
[7.0,7.0]
[8.0,7.0]
[9.0,7.0]
[7.0,8.0]
[8.0,8.0]
[9.0,8.0]
[8.0,9.0]
[9.0,9.0]
经比较后,[0.0,0.0]被归为0类
经比较后,[1.0,0.0]被归为0类
经比较后,[0.0,1.0]被归为0类
经比较后,[1.0,1.0]被归为0类
经比较后,[2.0,1.0]被归为0类
经比较后,[1.0,2.0]被归为0类
经比较后,[2.0,2.0]被归为0类
经比较后,[3.0,2.0]被归为0类
经比较后,[6.0,6.0]被归为0类
经比较后,[7.0,6.0]被归为0类
经比较后,[8.0,6.0]被归为0类
经比较后,[6.0,7.0]被归为0类
经比较后,[7.0,7.0]被归为0类
经比较后,[8.0,7.0]被归为0类
经比较后,[9.0,7.0]被归为0类
经比较后,[7.0,8.0]被归为0类
经比较后,[8.0,8.0]被归为0类
经比较后,[9.0,8.0]被归为0类
经比较后,[8.0,9.0]被归为0类
经比较后,[9.0,9.0]被归为0类
第0 类新中心:[5.383333333333334,5.118055555555555]
第1 类新中心:[Infinity,Infinity]
已完成第2次迭代
分类后有:
第0类分类有: 
[0.0,0.0]
[1.0,0.0]
[0.0,1.0]
[1.0,1.0]
[2.0,1.0]
[1.0,2.0]
[2.0,2.0]
[3.0,2.0]
[6.0,6.0]
[7.0,6.0]
[8.0,6.0]
[6.0,7.0]
[7.0,7.0]
[8.0,7.0]
[9.0,7.0]
[7.0,8.0]
[8.0,8.0]
[9.0,8.0]
[8.0,9.0]
[9.0,9.0]
第1类分类有: 
生成成功(总时间:0 秒)

文件夹中包含3个文件Kmeans.java,Point.java,readme.txt 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -