||||
/*
*作者: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]);
}
}
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-2 20:23
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社