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(); 
            
        
    }

转载于:https://www.cnblogs.com/wcLT/p/4604028.html

K-means算法Java实现相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  3. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  4. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  5. Leetcode算法Java全解答--60. 第k个排列

    Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...

  6. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  7. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  8. 独家 | R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)

    作者:Leihua Ye, UC Santa Barbara 翻译:陈超 校对:冯羽 本文约2300字,建议阅读10分钟 本文介绍了一种针对初学者的K临近算法在R语言中的实现方法. 本文呈现了一种在R ...

  9. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  10. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

最新文章

  1. 供应链金融3.0化解新车流通金融难题
  2. 基本概念-编写第一个C程序
  3. JDBC连接数据库格式
  4. java 重建二叉树_【剑指offer】 Java实现重建二叉树
  5. [软件测试_LAB1]安装junit和hamcrest及其使用
  6. mybatis resultType resultMap
  7. windows下,linux下elasticsearch安装插件head插件的步骤
  8. 正则表达式去除括号的问题
  9. 【Caffe安装】import caffe时出错:can not find module skimage.io
  10. android实现 5.0 6.0手机自动接听电话功能
  11. 2022百度人工智能专利白皮书 附下载
  12. python写前端图形界面_Python图形界面开发
  13. 在线UTF-8转换成GBK工具
  14. 【IoT】产品设计:包装盒LOGO设计工艺
  15. 2020不平凡的一年,2021请继续奋斗
  16. 分享前端获取微信之类图标的网站
  17. httpcancry抓包教程_httpcanary一抓包就断网
  18. MATLAB中stem函数的使用
  19. NSIS一键安装网站环境及部署网站
  20. ToDoList—最简单的待办事项列表(经典案例)重点

热门文章

  1. Android程序员面试必备的知识点,附答案
  2. 【深度学习】基于Colab Pro的TPU训练模型教程(Tensorflow)
  3. 一种医学图像分割的新思路【nnU-Net网络配置教程】
  4. 图像标记工具Labelme和LabelImg
  5. linux多路由表,linux 多网卡多路由表实现策略路由
  6. linux c++开发环境_使用 VM VirtualBox 搭建完善的Linux开发环境
  7. mysql内置乐观锁吗_mysql 乐观锁详解
  8. 网站推广期间如何做好用户体验中的交互体验设计?
  9. 网络营销外包专员浅析网络营销外包推广运营效果究竟如何?
  10. 怎样才能正确的挑选和建立关键词词库?