这里的程序稍微有点变形。
k_means方法返回K-means聚类的若干中心点。
代码:

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3.  
  4. public class Prophet_kmeans {
  5. private static final int MAXK = 100;
  6.  
  7. private static int n = 0;
  8. private static int K = 0;
  9.  
  10. private static ArrayList<Double> k_means(ArrayList<Double> list) {
  11. n = list.size();
  12. K = MAXK;
  13. if(K > n/4) K = n/2;
  14. if(K == 0) K = n;
  15. Collections.sort(list);
  16. double[] point = new double[n];
  17. int id = 0;
  18. double minn = list.get(0), maxx = list.get(0);
  19. for(double number : list) {
  20. if(number < minn) minn = number;
  21. if(number > maxx) maxx = number;
  22. point[id++] = number;
  23. }
  24. double[] center = new double[K];
  25. double delta = (maxx-minn) / K;
  26. double p =minn + delta / 2;
  27. for(int i=0;i<K;i++) {
  28. center[i] = p;
  29. p += delta;
  30. }
  31. int[] belong = new int[n];
  32. for(int i=0;i<n;i++) belong[i] = 0;
  33. double[] x_total = new double[K];
  34. int[] x_cnt = new int[K];
  35. for(int T=0;T<10;T++) { // T代表k means聚类迭代的次数
  36. for(int i=0;i<n;i++) {
  37. double min_dist = Math.abs(point[i] - center[belong[i]]);
  38. for(int k=0;k<K;k++) {
  39. double tmp_dist = Math.abs(point[i] - center[k]);
  40. if(tmp_dist < min_dist) {
  41. min_dist = tmp_dist;
  42. belong[i] = k;
  43. }
  44. }
  45. }
  46. for(int i=0;i<K;i++) {
  47. x_total[i] = 0;
  48. x_cnt[i] = 0;
  49. }
  50. for(int i=0;i<n;i++) {
  51. int k = belong[i];
  52. x_total[k] += point[i];
  53. x_cnt[k] ++;
  54. }
  55. for(int k=0;k<K;k++) {
  56. if(x_cnt[k] == 0) continue;
  57. center[k] = x_total[k] / (double)x_cnt[k];
  58. }
  59. }
  60. ArrayList<Double> k_list = new ArrayList<Double>();
  61. for(int k=0;k<K;k++) if(x_cnt[k] != 0) k_list.add(center[k]);
  62. K = k_list.size();
  63. return k_list;
  64. }
  65.  
  66. public static void main(String[] args) {
  67. ArrayList<Double> list = new ArrayList<Double>();
  68. list.add(1.0);
  69. list.add(2.0);
  70. list.add(3.0);
  71. list.add(2.2);
  72. list.add(2.1);
  73. list.add(1.5);
  74. list.add(9.9);
  75. list.add(7.5);
  76. list.add(8.8);
  77. list.add(6.9);
  78. list.add(8.7);
  79. ArrayList<Double> ansList = k_means(list);
  80. System.out.println("K == " + K);
  81. for(double number : ansList) {
  82. System.out.println(number);
  83. }
  84. }
  85.  
  86. }

输出结果如下:
K == 4
1.25
2.325
7.2
9.133333333333333

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近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

  8. KMeans (K均值)算法讲解及实现

    算法原理 KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标 ...

  9. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

随机推荐

  1. AOP(面向切面)的粗俗理解

    百度百科的解释:AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. 一个比较绕的概念,简单来说就是把不影响业 ...

  2. oom_killer

    Limited Memory 今天在虚拟机里面用Word处理文档的时候,突然硬盘灯一阵狂闪,然后虚拟机就一起消失了. 这种事情屡见不鲜,很明显是Linux内核把占用最多内存的程序(这次是Virtual ...

  3. 初识async函数

    为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...

  4. 010——数组(十)compact extract in_array

    <?php /** 10 数组 compact extract in_array */ //compact() (紧凑的,简洁的) 将变量转换为数组,变量名为数组键名,变量值为数组的键值. /* ...

  5. spring 核心接口之 Ordered

    Spring中提供了一个Ordered接口.从单词意思就知道Ordered接口的作用就是用来排序的.Spring框架是一个大量使用策略设计模式的框架,这意味着有很多相同接口的实现类,那么必定会有优先级 ...

  6. CSS: Grid Layout Module

    Grid Layout The CSS Grid Layout Module offers a grid-based layout system, with rows and columns, mak ...

  7. Django中间件(勾子函数)使用

    中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...

  8. input 取消自动填充

    增加属性:  name="clear" 

  9. java入门学习(2)—基本数据类型

    1.变量:定义变量:[数据类型] 变量名 = 赋值(这样定义的变量一般属于局部变量,放置在栈内存中): 2.标识符:可以有字母(可以使任意文字),数字,下划线,$等组成:但是不能以数字开头,不能是保留 ...

  10. 【转】Ubuntu16.04安装WPS

    下载安装下载WPS For Linux:http://community.wps.cn/download/ 直接下载:http://kdl.cc.ksosoft.com/wps-community/d ...