k-means算法Java一维实现
这里的程序稍微有点变形。
k_means方法返回K-means聚类的若干中心点。
代码:
import java.util.ArrayList;
import java.util.Collections; public class Prophet_kmeans {
private static final int MAXK = 100; private static int n = 0;
private static int K = 0; private static ArrayList<Double> k_means(ArrayList<Double> list) {
n = list.size();
K = MAXK;
if(K > n/4) K = n/2;
if(K == 0) K = n;
Collections.sort(list);
double[] point = new double[n];
int id = 0;
double minn = list.get(0), maxx = list.get(0);
for(double number : list) {
if(number < minn) minn = number;
if(number > maxx) maxx = number;
point[id++] = number;
}
double[] center = new double[K];
double delta = (maxx-minn) / K;
double p =minn + delta / 2;
for(int i=0;i<K;i++) {
center[i] = p;
p += delta;
}
int[] belong = new int[n];
for(int i=0;i<n;i++) belong[i] = 0;
double[] x_total = new double[K];
int[] x_cnt = new int[K];
for(int T=0;T<10;T++) { // T代表k means聚类迭代的次数
for(int i=0;i<n;i++) {
double min_dist = Math.abs(point[i] - center[belong[i]]);
for(int k=0;k<K;k++) {
double tmp_dist = Math.abs(point[i] - center[k]);
if(tmp_dist < min_dist) {
min_dist = tmp_dist;
belong[i] = k;
}
}
}
for(int i=0;i<K;i++) {
x_total[i] = 0;
x_cnt[i] = 0;
}
for(int i=0;i<n;i++) {
int k = belong[i];
x_total[k] += point[i];
x_cnt[k] ++;
}
for(int k=0;k<K;k++) {
if(x_cnt[k] == 0) continue;
center[k] = x_total[k] / (double)x_cnt[k];
}
}
ArrayList<Double> k_list = new ArrayList<Double>();
for(int k=0;k<K;k++) if(x_cnt[k] != 0) k_list.add(center[k]);
K = k_list.size();
return k_list;
} public static void main(String[] args) {
ArrayList<Double> list = new ArrayList<Double>();
list.add(1.0);
list.add(2.0);
list.add(3.0);
list.add(2.2);
list.add(2.1);
list.add(1.5);
list.add(9.9);
list.add(7.5);
list.add(8.8);
list.add(6.9);
list.add(8.7);
ArrayList<Double> ansList = k_means(list);
System.out.println("K == " + K);
for(double number : ansList) {
System.out.println(number);
}
} }
输出结果如下:
K == 4
1.25
2.325
7.2
9.133333333333333
k-means算法Java一维实现的更多相关文章
- k近邻算法-java实现
最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习. 一 . K-近邻算法(KNN)概述 最简单最初级的分 ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- K-means算法
K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢? ...
- k近邻算法的Java实现
k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...
- KNN算法java实现代码注释
K近邻算法思想非常简单,总结起来就是根据某种距离度量检测未知数据与已知数据的距离,统计其中距离最近的k个已知数据的类别,以多数投票的形式确定未知数据的类别. 一直想自己实现knn的java实现,但限于 ...
- Floyd算法java实现demo
Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...
- <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...
- KMeans (K均值)算法讲解及实现
算法原理 KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标 ...
- 机器学习 Python实践-K近邻算法
机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...
随机推荐
- Linux 文件与目录管理,Linux系统用户组的管理
一.Linux 文件与目录管理 我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什 ...
- vue中element 的上传功能
element 的上传功能 最近有个需求,需要在上传文件前,可以进行弹窗控制是否上传upload 看完文档后,感觉有两种思路可以实现 基于before-upload :上传文件之前的钩子,参数为上传的 ...
- Convert(varchar(8),Getdate(),108) 什么意思
100 或者 0 mon dd yyyy hh:miAM (或者 PM) 101 mm/dd/yy 102 yy.mm.dd 103 dd/mm/yy 104 dd.mm.yy 105 dd-mm-y ...
- 本地如何搭建IPv6环境测试你的APP(转)
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- TCP 初步认识
TCP连接的建立---三次握手 第一次握手:客户端TCP首先给服务器端TCP发送一个特殊的TCP数据段. 该数据段不包含应用层数据,并将头部中的SYN位设置为1,所以该数据段被称为SYN数据段. 另外 ...
- ubuntu maven install&config
可以通过命令直接安装,我还是用文件安装. 1,下载apache-maven-3.5.0-bin.tar.gz二进制压缩文件 https://maven.apache.org/download.cgi ...
- Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本
Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本 不知道为什么,我总想用 Shell 脚本来实现把一个站点内容给下载下来.但是下载什么站点我确不知道.今天尝试了一下利用 curl ...
- 看一遍就懂,详解java多线程——volatile
多线程一直以来都是面试必考点,而volatile.synchronized也是必问点,这里我试图用容易理解的方式来解释一下volatile. 来看一下它的最大特点和作用: 一 使变量在多个线程间可见 ...
- 深入理解Feign之源码解析
转载请标明出处: 本文出自方志朋的博客 什么是Feign Feign是受到Retrofit,JAXRS-2.0和WebSocket的影响,它是一个jav的到http客户端绑定的开源项目. Feign的 ...
- learn go function callback
package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.7.md im ...