下面是我对该算法的实现:
public class Kmeans {
private int K;
private int colsNum;
private int rowsNum;
private double[][] kMedians=null;
private double[][]myFeatures=null;
private HashMap<Integer,Integer> map=new HashMap<Integer, Integer>();
public Kmeans() {
}
/*
* Input double[numIns][numAtt] features, int K
* Output double[K][numAtt] clusterCenters, int[numIns] clusterIndex
*
* clusterCenters[k] should store the kth cluster center
* clusterIndex[i] should store the cluster index which the ith sample belongs to
*/
public void train(double[][] features, int K, double[][] clusterCenters, int[] clusterIndex) {
this.colsNum=features[0].length;
this.rowsNum=features.length;
this.kMedians=new double[K][colsNum];
this.myFeatures=features.clone();
this.K=K;
preHandle();
init();
setCluster();
while(true){
reSetMedian();
if(setCluster())
break;
}
features=myFeatures.clone();
for(int i=0;i<kMedians.length;i++){
for(int j=0;j<kMedians[0].length;j++)
clusterCenters[i][j]=kMedians[i][j];
}
for(int i=0;i<rowsNum;i++){
clusterIndex[i]=map.get(i);
}
kMedians=null;
myFeatures=null;
map.clear();
map=null;
}
public void preHandle(){//对数据进行预处理,替换掉NaN型数据
for(int i=0;i<myFeatures.length;i++){
double line[]=myFeatures[i];
for(int j=0;j<line.length;j++){
if(line[j]!=line[j]){
myFeatures[i][j]=getAverage(j);
}
}
}
}
public double getAverage(int attr){
double sum=0;
int k=0;
for(int i=0;i<rowsNum;i++){
double []row=myFeatures[i];
if(row[attr]==row[attr]){
sum+=row[attr];
k++;
}
}
return sum*1.0/k;
}
public boolean setCluster(){
boolean flag=true;
for(int i=0;i<rowsNum;i++){
double []row=myFeatures[i];
double []distances=new double[kMedians.length];
for(int j=0;j<kMedians.length;j++){
distances[j]=computeDistance(row, kMedians[j]);
}
int minIndex=0;
double min=Double.MAX_VALUE;
for(int j=0;j<distances.length;j++){
if(distances[j]<min){
minIndex=j;
min=distances[j];
}
}
int oldCluster=-1;
if(map.get(i)!=null)
oldCluster=map.get(i);
if(minIndex!=oldCluster)
flag=false;
map.put(i,minIndex);
}
return flag;
}
public void reSetMedian(){
double [][]sum=new double[K][colsNum];
int []num=new int[K];
Arrays.fill(num,0);
for(int i=0;i<K;i++)
for(int j=0;j<colsNum;j++)
sum[i][j]=0;
Iterator<Entry<Integer, Integer>> ite=map.entrySet().iterator();
while(ite.hasNext()){
Entry<Integer,Integer> entry=ite.next();
int rowNum=entry.getKey();
int clusterNum=entry.getValue();
num[clusterNum]++;
double []row=Arrays.copyOf(myFeatures[rowNum],colsNum);
for(int i=0;i<colsNum;i++){
sum[clusterNum][i]+=row[i];
}
}
for(int i=0;i<K;i++){
for(int j=0;j<colsNum;j++){
double ave=sum[i][j]*1.0/num[i];
kMedians[i][j]=ave;
}
}
}
public double computeDistance(double[] row,double[] median){
double sum=0;
for(int i=0;i<colsNum;i++){
sum+=Math.pow(row[i]-median[i],2);
}
return sum;
}
public void init(){
int index=0,i;
HashSet<Integer> rows=new HashSet<Integer>();
while(index<K){
int row=(int)(Math.random()*rowsNum);
if(rows.contains(row))
continue;
double []tempRow=myFeatures[row];
boolean flag1=true;
for(i=0;i<K;i++){
double []temp=kMedians[i];
boolean flag2=false;
for(int j=0;j<colsNum;j++){
if(temp[j]!=tempRow[j])
flag2=true;
}
if(flag2==false)
flag1=false;
}
if(!flag1)
continue;
for(i=0;i<tempRow.length;i++){
if(tempRow[i]!=tempRow[i])
break;
}
if(i>=tempRow.length){
rows.add(row);
kMedians[index++]=Arrays.copyOf(myFeatures[row],colsNum);
}
}
rows.clear();
rows=null;
}
}
分享到:
相关推荐
传统的k-means算法对初始聚类中心敏感,聚类结果随不同的初始输入而波动。为消除这种敏感性,提出一种优化初始聚类中心的方法,此方法计算每个数据对象所在区域的密度,选择相互距离最远的k个处于高密度区域的点作为...
k-means 算法
如果你想讲解关于k-means算法,却没有相应的ppt,那你来对了。我在一次面试的过程中也遇到了相似的情况,我精心做了一份关于k-means算法的ppt。如果你需要可以使用,但是使用的时候主要不要照抄哦。自己适度的改一改...
基于Matlab实现: 模式识别 K-Means算法 实现模式分类 模式识别 K-均值算法 实现模式分类
关于k-means算法的源程序代码.%%%%%%函数说明%%%%%% %输入: % sample--样本集; % k--聚类数目; %输出: % y--类标; % cnew--聚类中心; % n--迭代次数; function [y cnew n]=k_means(sample,k)
基于 K-means 算法的校园微博热点话题发现系统 一、研究目的 微博由其 “短平快 ” 的信息能力和快速传播能力 ,已广泛流行于高校学生的常生活中。但微博上的负面舆情信息给社会 、学校和个人带来巨大的危害 。由于...
从网上找的代码自己改了下,写了了个短小的人工智能作业K-MEANS算法
K-means算法讲解
现有的基于密度优化初始聚类中心的k-means算法存在聚类中心的搜索范围大、消耗时间久以及聚类结果对孤立点敏感等问题,针对这些问题,提出了一种基于平均密度优化初始聚类中心的k-means算法adk-means。该算法将数据...
基于改进K-Means算法的入侵检测方法,王倩,,近年来数据挖掘技术在入侵检测领域的应用越来越多,K-Means算法是聚类算法中一种高效的划分算法,应用广泛,但是基于K-Means聚类算法�
K-means算法源码 This directory contains code implementing the K-means algorithm. Source code may be found in KMEANS.CPP. Sample data isfound in KM2.DAT. The KMEANS program accepts input consisting of ...
一个聚类算法(k-means)实例,对想实践一下K_means算法的朋友很实用
k-means算法详解,内含k-means算法基于mapreduce的实现
K-means算法简介及代码过程
这是一个基于matlab语言的K-means算法的改进程序,代码完整易懂,里面包含有实际的数据集,能有利于对K-means算法感兴趣的研究学者或者开发人员
基于K-means算法的遥感图像分类的matlab实现
国外实现k-means算法,用Java写的,想学习的朋友请下载