public class KMeansCluster { 

        private int k;//簇的个数 
        private int num = 100000;//迭代次数 
        private List<double> datas;//原始样本集 
        private String address;//样本集路径 
        private List<point> data = new ArrayList<point>(); 
        private AbstractDistance distance = new AbstractDistance() { 
            @Override 
            public double getDis(Point p1, Point p2) { 
                //欧几里德距离 
                return Math.sqrt(Math.pow(p1.getX() - p2.getX(), 2) + Math.pow(p1.getY() - p2.getY(), 2)); 
            
        }; 
       
        public KMeansCluster(int k, int num, String address) { 
            this.k = k; 
            this.num = num; 
            this.address = address; 
        
       
        public KMeansCluster(int k, String address) { 
            this.k = k; 
            this.address = address; 
        
       
        public KMeansCluster(int k, List<double> datas) { 
            this.k = k; 
            this.datas = datas; 
        
       
        public KMeansCluster(int k, int num, List<double> datas) { 
            this.k = k; 
            this.num = num; 
            this.datas = datas; 
        
       
        private void check() { 
            if (k == 0
                throw new IllegalArgumentException("k must be the number > 0"); 
       
            if (address == null && datas == null
                throw new IllegalArgumentException("program can't get real data"); 
        
       
        /**
         * 初始化数据
         *
         * @throws java.io.FileNotFoundException
         */ 
        public void init() throws FileNotFoundException { 
            check(); 
            //读取文件,init data 
            //处理原始数据 
            for (int i = 0, j = datas.size(); i < j; i++) 
                data.add(new Point(i, datas.get(i), 0)); 
        
       
        /**
         * 第一次随机选取中心点
         *
         * @return
         */ 
        public Set<point> chooseCenter() { 
            Set<point> center = new HashSet<point>(); 
            Random ran = new Random(); 
            int roll = 0
            while (center.size() < k) { 
                roll = ran.nextInt(data.size()); 
                center.add(data.get(roll)); 
            
            return center; 
        
       
        /**
         * @param center
         * @return
         */ 
        public List<cluster> prepare(Set<point> center) { 
            List<cluster> cluster = new ArrayList<cluster>(); 
            Iterator<point> it = center.iterator(); 
            int id = 0
            while (it.hasNext()) { 
                Point p = it.next(); 
                if (p.isBeyond()) { 
                    Cluster c = new Cluster(id++, p); 
                    c.addPoint(p); 
                    cluster.add(c); 
                else 
                    cluster.add(new Cluster(id++, p)); 
            
            return cluster; 
        
       
        /**
         * 第一次运算,中心点为样本值
         *
         * @param center
         * @param cluster
         * @return
         */ 
        public List<cluster> clustering(Set<point> center, List<cluster> cluster) { 
            Point[] p = center.toArray(new Point[0]); 
            TreeSet<distence> distence = new TreeSet<distence>();//存放距离信息 
            Point source; 
            Point dest; 
            boolean flag = false
            for (int i = 0, n = data.size(); i < n; i++) { 
                distence.clear(); 
                for (int j = 0; j < center.size(); j++) { 
                    if (center.contains(data.get(i))) 
                        break
       
                    flag = true
                    // 计算距离 
                    source = data.get(i); 
                    dest = p[j]; 
                    distence.add(new Distence(source, dest, distance)); 
                
                if (flag == true) { 
                    Distence min = distence.first(); 
                    for (int m = 0, k = cluster.size(); m < k; m++) { 
                        if (cluster.get(m).getCenter().equals(min.getDest())) 
                            cluster.get(m).addPoint(min.getSource()); 
       
                    
                
                flag = false
            
       
            return cluster; 
        
       
        /**
         * 迭代运算,中心点为簇内样本均值
         *
         * @param cluster
         * @return
         */ 
        public List<cluster> cluster(List<cluster> cluster) { 
    //        double error; 
            Set<point> lastCenter = new HashSet<point>(); 
            for (int m = 0; m < num; m++) { 
    //            error = 0; 
                Set<point> center = new HashSet<point>(); 
                // 重新计算聚类中心 
                for (int j = 0; j < k; j++) { 
                    List<point> ps = cluster.get(j).getMembers(); 
                    int size = ps.size(); 
                    if (size < 3) { 
                        center.add(cluster.get(j).getCenter()); 
                        continue
                    
                    // 计算距离 
                    double x = 0.0, y = 0.0
                    for (int k1 = 0; k1 < size; k1++) { 
                        x += ps.get(k1).getX(); 
                        y += ps.get(k1).getY(); 
                    
                    //得到新的中心点 
                    Point nc = new Point(-1, x / size, y / size, false); 
                    center.add(nc); 
                
                if (lastCenter.containsAll(center))//中心点不在变化,退出迭代 
                    break
                lastCenter = center; 
                // 迭代运算 
                cluster = clustering(center, prepare(center)); 
    //            for (int nz = 0; nz < k; nz++) { 
    //                error += cluster.get(nz).getError();//计算误差 
    //            } 
            
            return cluster; 
        
       
        /**
         * 输出聚类信息到控制台
         *
         * @param cs
         */ 
        public void out2console(List<cluster> cs) { 
            for (int i = 0; i < cs.size(); i++) { 
                System.out.println("No." + (i + 1) + " cluster:"); 
                Cluster c = cs.get(i); 
                List<point> p = c.getMembers(); 
                for (int j = 0; j < p.size(); j++) { 
                    System.out.println("\t" + p.get(j).getX() + " "); 
                
                System.out.println(); 
            
        
    }

K-means算法Java实现的更多相关文章

  1. k近邻算法-java实现

    最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习. 一 . K-近邻算法(KNN)概述 最简单最初级的分 ...

  2. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  3. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  4. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

  5. KNN算法java实现代码注释

    K近邻算法思想非常简单,总结起来就是根据某种距离度量检测未知数据与已知数据的距离,统计其中距离最近的k个已知数据的类别,以多数投票的形式确定未知数据的类别. 一直想自己实现knn的java实现,但限于 ...

  6. Floyd算法java实现demo

    Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...

  7. k-means算法Java一维实现

    这里的程序稍微有点变形.k_means方法返回K-means聚类的若干中心点.代码: import java.util.ArrayList; import java.util.Collections; ...

  8. 感知机学习算法Java实现

    感知机学习算法Java实现. Perceptron类用于实现感知机, 其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式: perceptronAnother()方法用 ...

  9. 一致哈希算法Java实现

    一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中经常使用的算法. 传统的Hash算法当槽位(Slot)增减时,面临全部数据又一次部署的问题.而一致哈希算法确 ...

  10. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

随机推荐

  1. 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)

    1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则)     * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...

  2. 使用JavaScript访问XML数据

    在本篇文章中,我们将讲述如何在IE中使用ActiveX功能来访问并解析XML文档,由此允许网络冲浪者操纵它们.这一网页将传入并运行脚本的初始化.你一定确保order.xml文档与jsxml.html在 ...

  3. Python(1)(安装与基本使用)

    1.Python的下载和安装我就不废话了,百度上都有. 我安装的是Python 3.4.3 64bit 安装完之后,打开Cmd,输入Python 显示以上相同,按照百度的意思就是安装成功. 2.配置环 ...

  4. Linux系统中的运行级别

    什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别. 它让一些程序在一个级别启动,而另外一个级别的时候不启动. Linux系统的有效登录模式有0~9共十种,不过沿用UNIX系统的至多6 ...

  5. codeforces 696A A. Lorenzo Von Matterhorn(水题)

    题目链接: A. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes inp ...

  6. 15个你不可不知的cmd命令

    cmd和dos: dos是Disk Operating System 磁盘操作系统的缩写,它是个人计算机上的一类操作系统.跟Windows图像界面操作系统不同的是,dos是一种面向磁盘的操作系统,并且 ...

  7. CodeForces-245H:Queries for Number of Palindromes(3-14:区间DP||回文串)

    Times:5000ms: Memory limit:262144 kB 给定字符串S(|S|<=5000),下标由1开始.然后Q个问题(Q<=1e6),对于每个问题,给定L,R,回答区间 ...

  8. 「HAOI2015」「LuoguP3178」树上操作(树链剖分

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  9. Android Studio 1.5.1

    Android Studio 1.5.1 December 3rd, 2015: For information on what's new in 1.5.1, see the release ann ...

  10. 使用JavaScript实现弹出层效果的简单实例

    转自:https://www.jb51.net/article/85475.htm 实现弹出层效果的思路非常简单:将待显示的内容先隐藏,在触发某种条件后(如点击按钮),将原本隐藏的内容显示出来. 实现 ...