K均值聚类算法的Java版实现代码示例
1.简介
K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
2.什么是聚类
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
3.什么是k均值聚类
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
4.实现
Java代码如下:
packageorg.algorithm;
importjava.util.ArrayList;
importjava.util.Random;
/**
*K均值聚类算法
*/
publicclassKmeans{
privateintk;
//分成多少簇
privateintm;
//迭代次数
privateintdataSetLength;
//数据集元素个数,即数据集的长度
privateArrayListdataSet;
//数据集链表
privateArrayListcenter;
//中心链表
privateArrayList>cluster;
//簇
privateArrayListjc;
//误差平方和,k越接近dataSetLength,误差越小
privateRandomrandom;
/**
*设置需分组的原始数据集
*
*@paramdataSet
*/
publicvoidsetDataSet(ArrayListdataSet){
this.dataSet=dataSet;
}
/**
*获取结果分组
*
*@return结果集
*/
publicArrayList>getCluster(){
returncluster;
}
/**
*构造函数,传入需要分成的簇数量
*
*@paramk
*簇数量,若k<=0时,设置为1,若k大于数据源的长度时,置为数据源的长度
*/
publicKmeans(intk){
if(k<=0){
k=1;
}
this.k=k;
}
/**
*初始化
*/
privatevoidinit(){
m=0;
random=newRandom();
if(dataSet==null||dataSet.size()==0){
initDataSet();
}
dataSetLength=dataSet.size();
if(k>dataSetLength){
k=dataSetLength;
}
center=initCenters();
cluster=initCluster();
jc=newArrayList();
}
/**
*如果调用者未初始化数据集,则采用内部测试数据集
*/
privatevoidinitDataSet(){
dataSet=newArrayList();
//其中{6,3}是一样的,所以长度为15的数据集分成14簇和15簇的误差都为0
float[][]dataSetArray=newfloat[][]{{8,2},{3,4},{2,5},
{4,2},{7,3},{6,2},{4,7},{6,3},{5,3},
{6,3},{6,9},{1,6},{3,9},{4,1},{8,6}};
for(inti=0;iinitCenters(){
ArrayListcenter=newArrayList();
int[]randoms=newint[k];
Booleanflag;
inttemp=random.nextint(dataSetLength);
randoms[0]=temp;
for(inti=1;i>initCluster(){
ArrayList>cluster=newArrayList>();
for(inti=0;i());
}
returncluster;
}
/**
*计算两个点之间的距离
*
*@paramelement
*点1
*@paramcenter
*点2
*@return距离
*/
privatefloatdistance(float[]element,float[]center){
floatdistance=0.0f;
floatx=element[0]-center[0];
floaty=element[1]-center[1];
floatz=x*x+y*y;
distance=(float)Math.sqrt(z);
returndistance;
}
/**
*获取距离集合中最小距离的位置
*
*@paramdistance
*距离数组
*@return最小距离在距离数组中的位置
*/
privateintminDistance(float[]distance){
floatminDistance=distance[0];
intminLocation=0;
for(inti=1;idataArray,
StringdataArrayName){
for(inti=0;i
5.说明:
具体代码是从网上找的,根据自己的理解加了注释和进行部分修改,若注释有误还望指正
6.测试
packageorg.test;
importjava.util.ArrayList;
importorg.algorithm.Kmeans;
publicclassKmeansTest{
publicstaticvoidmain(String[]args)
{
//初始化一个Kmean对象,将k置为10
Kmeansk=newKmeans(10);
ArrayListdataSet=newArrayList();
dataSet.add(newfloat[]{1,2});
dataSet.add(newfloat[]{3,3});
dataSet.add(newfloat[]{3,4});
dataSet.add(newfloat[]{5,6});
dataSet.add(newfloat[]{8,9});
dataSet.add(newfloat[]{4,5});
dataSet.add(newfloat[]{6,4});
dataSet.add(newfloat[]{3,9});
dataSet.add(newfloat[]{5,9});
dataSet.add(newfloat[]{4,2});
dataSet.add(newfloat[]{1,9});
dataSet.add(newfloat[]{7,8});
//设置原始数据集
k.setDataSet(dataSet);
//执行算法
k.execute();
//得到聚类结果
ArrayList>cluster=k.getCluster();
//查看结果
for(inti=0;i
总结:测试代码已经通过。并对聚类的结果进行了查看,结果基本上符合要求。至于有没有更精确的算法有待发现。具体的实践还有待挖掘
总结
以上就是本文关于K均值聚类算法的Java版实现代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!