《mahout in action》第六章。

datafile/cluster/simple_k-means.txt数据集例如以下:

1 1

2 1

1 2

2 2

3 3

8 8

8 9

9 8

9 9

1. k-means聚类算法原理

1、从D中随机取k个元素。作为k个簇的各自的中心。

2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。

3、依据聚类结果。又一次计算k个簇各自的中心,计算方法是取簇中全部元素各自维度的算术平均数。

4、将D中所有元素依照新的中心又一次聚类。

5、反复第4步,直到聚类结果不再变化。

6、将结果输出。

2. 举例说明

2.1 从D中随机取k个元素,作为k个簇的各自的中心。

private final static Integer K=2; //选K=2,也就是估算有两个簇。

以下选1 1,2,1两个点。

C0:1 1

C1:2 1

2.2 分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。

结果为:

C0 : 1 1

C0:的点为:1.0,2.0

C1: 2 1

C1:的点为:2.0,2.0

C1:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

2.3 依据2.2的聚类结果。又一次计算k个簇各自的中心,计算方法是取簇中全部元素各自维度的算术平均数。

採取欧区距离公式。

C0 新的簇心为:1.0,1.5

C1 新的簇心为:5.857142857142857,5.714285714285714

2.4 将D中所有元素依照新的中心又一次聚类。

第2次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

2.5  反复第4步,直到聚类结果不再变化。

当距离小于某个值的时候。就觉得聚类已经聚类了。不须要再迭代,这里的值选0.001

private final static Double converge=0.001;

------------------------------------------------

C0的簇心为:1.6666666666666667,1.75

C1的簇心为:7.971428571428572,7.942857142857143

各个簇心移动中最小的距离为,move=0.7120003121097943

第3次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.777777777777778,1.7916666666666667

C1的簇心为:8.394285714285715,8.388571428571428

各个簇心移动中最小的距离为。move=0.11866671868496578

第4次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.7962962962962965,1.7986111111111114

C1的簇心为:8.478857142857143,8.477714285714285

各个簇心移动中最小的距离为,move=0.019777786447494432

第5次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.799382716049383,1.7997685185185184

C1的簇心为:8.495771428571429,8.495542857142857

各个簇心移动中最小的距离为。move=0.003296297741248916

第6次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.7998971193415638,1.7999614197530864

C1的簇心为:8.499154285714287,8.499108571428572

各个簇心移动中最小的距离为。move=5.49382956874724E-4

3. JAVA实现

package mysequence.machineleaning.clustering.kmeans;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import java.util.Vector;

import mysequence.machineleaning.clustering.canopy.Point;

public class MyKmeans {

static Vector li=new Vector();

//static List li=new ArrayList();

static List> list=new ArrayList>(); //每次迭代保存结果,一个vector代表一个簇

private final static Integer K=2; //选K=2,也就是估算有两个簇。

private final static Double converge=0.001; //当距离小于某个值的时候。就觉得聚类已经聚类了,不须要再迭代,这里的值选0.001

//读取数据

public static final void readF1() throws IOException {

String filePath="datafile/cluster/simple_k-means.txt";

BufferedReader br = new BufferedReader(new InputStreamReader(

new FileInputStream(filePath)));

for (String line = br.readLine(); line != null; line = br.readLine()) {

if(line.length()==0||"".equals(line))continue;

String[] str=line.split(" ");

Point p0=new Point();

p0.setX(Double.valueOf(str[0]));

p0.setY(Double.valueOf(str[1]));

li.add(p0);

//System.out.println(line);

}

br.close();

}

//math.sqrt(double n)

//扩展下。假设要给m开n次方就用java.lang.StrictMath.pow(m,1.0/n);

//採用欧氏距离

public static Double DistanceMeasure(Point p1,Point p2){

Double tmp=StrictMath.pow(p2.getX()-p1.getX(), 2)+StrictMath.pow(p2.getY()-p1.getY(), 2);

return Math.sqrt(tmp);

}

//计算新的簇心

public static Double CalCentroid(){

System.out.println("------------------------------------------------");

Double movedist=Double.MAX_VALUE;

for(int i=0;i

Vector subli=list.get(i);

Point po=new Point();

Double sumX=0.0;

Double sumY=0.0;

Double Clusterlen=Double.valueOf(subli.size());

for(int j=0;j

Point nextp=subli.get(j);

sumX=sumX+nextp.getX();

sumY=sumY+nextp.getY();

}

po.setX(sumX/Clusterlen);

po.setY(sumY/Clusterlen);

//新的点与旧点之间的距离

Double dist=DistanceMeasure(subli.get(0),po);

//在多个簇心移动的过程中,返回移动距离最小的值

if(dist

list.get(i).clear();

list.get(i).add(po);

System.out.println("C"+i+"的簇心为:"+po.getX()+","+po.getY());

}

String test="ll";

return movedist;

}

//本次的簇心

//下一次移动的簇心

private static Double move=Double.MAX_VALUE;//移动距离

//不断地迭代,直到收敛

public static void RecursionKluster(){

for(int times=2;move>converge;times++){

System.out.println("第"+times+"次迭代");

//默认每个list里的Vector第0个元素是质心

for(int i=0;i

Point p=new Point();

p=li.get(i);

int index = -1;

double neardist = Double.MAX_VALUE;

for(int k=0;k

Point centre=list.get(k).get(0);

double currentdist=DistanceMeasure(p,centre);

if(currentdist

neardist=currentdist;

index=k;

}

}

System.out.println("C"+index+":的点为:"+p.getX()+","+p.getY());

list.get(index).add(p);

}

//又一次计算簇心,并返回移动的距离,最小的那个距离

move=CalCentroid();

System.out.println("各个簇心移动中最小的距离为。move="+move);

}

}

public static void Kluster(){

for(int k=0;k

Vector vect=new Vector();

Point p=new Point();

p=li.get(k);

vect.add(p);

list.add(vect);

}

System.out.println("第1次迭代");

//默认每个list里的Vector第0个元素是质心

for(int i=K;i

Point p=new Point();

p=li.get(i);

int index = -1;

double neardist = Double.MAX_VALUE;

for(int k=0;k

Point centre=list.get(k).get(0);

double currentdist=DistanceMeasure(p,centre);

if(currentdist

neardist=currentdist;

index=k;

}

}

System.out.println("C"+index+":的点为:"+p.getX()+","+p.getY());

list.get(index).add(p);

}

}

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

//读取数据

readF1();

//第一次迭代

Kluster();

//第一次迭代后计算簇心

CalCentroid();

//不断迭代,直到收敛

RecursionKluster();

}

}

4.执行结果:

C0:1 1

C1:2 1

第1次迭代

C0:的点为:1.0,2.0

C1:的点为:2.0,2.0

C1:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.0,1.5

C1的簇心为:5.857142857142857,5.714285714285714

第2次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.6666666666666667,1.75

C1的簇心为:7.971428571428572,7.942857142857143

各个簇心移动中最小的距离为,move=0.7120003121097943

第3次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.777777777777778,1.7916666666666667

C1的簇心为:8.394285714285715,8.388571428571428

各个簇心移动中最小的距离为。move=0.11866671868496578

第4次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.7962962962962965,1.7986111111111114

C1的簇心为:8.478857142857143,8.477714285714285

各个簇心移动中最小的距离为。move=0.019777786447494432

第5次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.799382716049383,1.7997685185185184

C1的簇心为:8.495771428571429,8.495542857142857

各个簇心移动中最小的距离为。move=0.003296297741248916

第6次迭代

C0:的点为:1.0,1.0

C0:的点为:2.0,1.0

C0:的点为:1.0,2.0

C0:的点为:2.0,2.0

C0:的点为:3.0,3.0

C1:的点为:8.0,8.0

C1:的点为:8.0,9.0

C1:的点为:9.0,8.0

C1:的点为:9.0,9.0

------------------------------------------------

C0的簇心为:1.7998971193415638,1.7999614197530864

C1的簇心为:8.499154285714287,8.499108571428572

各个簇心移动中最小的距离为。move=5.49382956874724E-4

kmeans实际应用例子 java_k-means聚类JAVA实例相关推荐

  1. k均值聚类算法考试例题_k means聚类算法实例

    所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其中每个子集叫做一个簇. ...

  2. java手撕KMeans算法实现手写数字聚类(失败案例)

    最近几天刚刚接触机器学习,学完K-Means聚类算法.正好又赶上一个课程项目是识别"手写数字",因为KMeans能够实现聚类,因此自然而然地想要通过KMeans来实现. 前排提示: ...

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

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

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

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

  5. java时间聚类_mongodb 按照时间聚类 java

    当存储到mongodb中的是string类型的时间,小tips: 1. 那么在对此域按照时间聚类(每周,每月)时就不能直接使用mongodb的time关键字了,因为mongodb有自己的时间类型,且目 ...

  6. som神经网络聚类简单例子_深度聚类的可视化解释

    作者:Amit Chaudhary 编译:ronghuaiyang 导读 视觉上的自监督学习方法,结合聚类,将无监督转变为有监督. 许多自监督方法使用[pretext tasks](https://a ...

  7. (转)个例子让你了解Java反射机制

    个例子让你了解Java反射机制 原文地址:http://blog.csdn.net/ljphhj/article/details/12858767 JAVA反射机制:   通俗地说,反射机制就是可以把 ...

  8. SPSS用KMEANS(K均值)、两阶段聚类、RFM模型在P2P网络金融研究借款人、出款人行为数据规律...

    全文下载链接:http://tecdat.cn/?p=27831 随着P2P网络金融平台的交易量的激增,其交易数据不能得到充分有效地利用.将聚类分析引入到P2P网络金融平台的管理之中,利用聚类分析技术 ...

  9. 【K-Means】基于经纬度的城市聚类

    文章目录 1. 项目准备 1.1. 问题导入 1.2. 数据集简介 2. K-Means算法 2.1. 算法特点 2.2. 算法流程 2.3. 算法缺陷 2.4. 算法改进 3. 实验步骤 3.1. ...

最新文章

  1. C++随时输出到文件-outfile
  2. android根据文件路径打开文件_你知道如何在打印的文件上面添加文件的路径吗...
  3. jQuery入口函数的四种写法【1分钟掌握】
  4. jrebel(破解版)+eclipse +jetty/tomcat 配置,实现热部署
  5. vmware workstation 链接不上网络
  6. java中char和string的区别是什么
  7. 机器学习与计算机视觉(绘图)
  8. DevOps 火爆,要学这么多技术!
  9. android gms包
  10. 计算机页面格式和编排,论文开题格式
  11. 半导体Led Driver IC失效分析
  12. UMLChina公众号文章精选(20220807更新精选)
  13. linux设置开机自动运行脚本的方法
  14. Oracle配置本地网络服务名
  15. 百度App Android启动性能优化-工具篇
  16. 英语测试题库软件,英语考试app哪个好 英语考试题库app推荐_96u手游网
  17. 中国黑客档案:识别黑客犯罪的蛛丝马迹
  18. 成兴光 | LED灯珠的封装形式
  19. linux删除文件最后一行换行符,linux - 使用sed删除最后一个换行符 - 堆栈内存溢出...
  20. 翻译Houdini官方对UE4新版插件的介绍:Houdini Engine for Unreal - V2

热门文章

  1. routersploit 路由器漏洞检测及利用框架
  2. linux shell 算术运算{expr、bc、dc、(( ))和[ ]}
  3. Vivotek 摄像头远程栈溢出漏洞分析及利用
  4. linux c 守护进程创建原理及简易方法
  5. BYTE,WORD,DWORD的大小及一些特殊的高低位宏(取高位 取低位)
  6. VC 中字符串比较和查找
  7. TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析
  8. 两篇文章说中断和异常之一
  9. linux C 中的volatile使用
  10. mysql不支持addbatch_【MySql】Java 批量插入数据库addBatch