neohua的个人博客分享 http://blog.sciencenet.cn/u/neohua

博文

kmeans算法的java简单实现

已有 3597 次阅读 2013-7-19 14:12 |个人分类:数据挖掘|系统分类:科研笔记|关键词:学者| Kmeans

/*

*作者:neohua

*如需引用请注明出处

*功能:kmeans简单算法

*/

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Kmeans {
static int k;                                         // The number of clusters
static double[][] center;                               // Centroid position
static double[] crita;                                  // Confidence
 
public static void main(String[] args) throws FileNotFoundException{
 
BufferedReader reader = new BufferedReader(new FileReader(
  "g:/all22_3_26_01.csv"));  
String temp="";
String[] data=new String[]{};
       ArrayList<ArrayList> trueData=new ArrayList();
 ArrayList<Double> tem=new ArrayList<>();
   int linenumber=0;
try {
 while((temp=reader.readLine())!=null)
 {
  data=temp.split(",");
  for(int i=0; i<data.length; i++)
  {    
   tem.add(Double.valueOf(data[i]));
  }
  trueData.add(tem);
  tem=new ArrayList<Double>();
  linenumber++;    
 }
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
System.out.println(linenumber);                            //Output Lines
Scanner s=new Scanner(System.in);
System.out.println("输入分类数");
k = s.nextInt();
center = new double[k][2];
crita =new double[k];
int tt=linenumber/k;
for (int i=0;i<k;i++) {
 Random random = new Random(System.currentTimeMillis());
 int ret =random.nextInt(tt)+i*tt;                  //Block and random values
 for(int j=0;j<2;j++){
 center[i][j] =  (double)trueData.get(ret).get(j);    
 }
 System.out.println(center[i][0]+","+center[i][1]); //Output initial centroid
}
 
for(int i=0,min=0;i<linenumber;i++){
        //Calculating confidence
 for(int j=0;j<k;j++){  
 //Euclidean distance formula
 crita[j]=java.lang.StrictMath.pow(((java.lang.StrictMath.pow(((double)trueData.get(i).get(0)-center[j][0]),(double)k))+(java.lang.StrictMath.pow(((double)trueData.get(i).get(1)-center[j][1]),(double)k))),(1.0/k));      
 //System.out.println(crita[j]);                   //Test Confidence
 }
        //Compare confidence level for the minimum
 
 for(int j=1;j<k;j++){
  if(crita[j]<crita[min]){
  min=j;
  }
 }  
 //Update centroid
 center[min][0]=((double)trueData.get(i).get(0)+center[min][0])/2.0;
 center[min][1]=((double)trueData.get(i).get(1)+center[min][1])/2.0;
 //System.out.println(center[min][0]+","+center[min][1]);//Test
}
 //Output centroid result
 System.out.println("************************************************");
 for(int i=0;i<k;i++){
 System.out.println(center[i][0]+","+center[i][1]);
 }
}
}


 



https://m.sciencenet.cn/blog-785542-709474.html

上一篇:JAVA约瑟夫环
下一篇:数据库的简单sql语言

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 20:23

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部