📄 kmeans.java
字号:
import java.util.*;
public class KMeans {
public static void main(String[] args){
K(3,getPointInfom.read());
}
public static void K(int n,ArrayList<String> arrays){
double[] x=new double[n];
double[] y=new double[n];
double[] z=new double[n];
double[] w=new double[n];
double[] xcmp=new double[n];
double[] ycmp=new double[n];
double[] zcmp=new double[n];
double[] wcmp=new double[n];
int[] count=new int[n];
int[] cluser=new int[arrays.size()/4];
double[] xi=new double[arrays.size()/4];
double[] yi=new double[arrays.size()/4];
double[] zi=new double[arrays.size()/4];
double[] wi=new double[arrays.size()/4];
double[][] xy=new double[xi.length][x.length];
int i,j;
for(i=0;i<arrays.size();i++){
if(i%4==0) xi[i/4]=Double.parseDouble(arrays.get(i));
else if((i-1)%4==0) yi[(i-1)/4]=Double.parseDouble(arrays.get(i));
else if((i-2)%4==0) zi[(i-2)/4]=Double.parseDouble(arrays.get(i));
else if((i-3)%4==0) wi[(i-3)/4]=Double.parseDouble(arrays.get(i));
}
//for(i=0;i<xi.length;i++)
//System.out.println(xi[i]+" "+yi[i]+" "+zi[i]+" "+wi[i]);;
for(i=0;i<xi.length&&i<x.length&&i<y.length;i++){
//x[i]=xcmp[i]=xi[i];
//y[i]=ycmp[i]=yi[i];
//z[i]=zcmp[i]=zi[i];
//w[i]=wcmp[i]=wi[i];
count[i]=0;
}
x[0]=xcmp[0]=xi[0];
y[0]=ycmp[0]=yi[0];
z[0]=zcmp[0]=zi[0];
w[0]=wcmp[0]=wi[0];
x[1]=xcmp[1]=xi[50];
y[1]=ycmp[1]=yi[50];
z[1]=zcmp[1]=zi[50];
w[1]=wcmp[1]=wi[50];
x[2]=xcmp[2]=xi[100];
y[2]=ycmp[2]=yi[100];
z[2]=zcmp[2]=zi[100];
w[2]=wcmp[2]=wi[100];
for(i=0;i<cluser.length;i++) cluser[i]=0;
boolean done;
done=true;
int k=0;
while(done){
for(i=0;i<xi.length;i++){
for(j=0;j<x.length;j++){
xy[i][j]=(xi[i]-x[j])*(xi[i]-x[j])+(yi[i]-y[j])*(yi[i]-y[j])+(zi[i]-z[j])*(zi[i]-z[j])+(wi[i]-w[j])*(wi[i]-w[j]);
}
}
for(i=0;i<cluser.length;i++) cluser[i]=getMin(xy[i]);
//for(i=0;i<cluser.length;i++) System.out.print(" "+cluser[i]);
System.out.println();
for(i=0;i<cluser.length;i++)
{
if(cluser[i]==0) count[0]+=1;
else if(cluser[i]==1) count[1]+=1;
else if(cluser[i]==2) count[2]+=1;
}
setZero(x);
setZero(y);
setZero(z);
setZero(w);
for(i=0;i<cluser.length;i++){
if(cluser[i]==0)
{
x[0]=x[0]+xi[i];
y[0]=y[0]+yi[i];
z[0]=z[0]+zi[i];
w[0]=w[0]+wi[i];
}
else if(cluser[i]==1)
{
x[1]=x[1]+xi[i];
y[1]=y[1]+yi[i];
z[1]=z[1]+zi[i];
w[1]=w[1]+wi[i];
}
else if(cluser[i]==2)
{
x[2]=x[2]+xi[i];
y[2]=y[2]+yi[i];
z[2]=z[2]+zi[i];
w[2]=w[2]+wi[i];
}
}
//计算新的中心点的位置
for(i=0;i<x.length;i++){
x[i]=x[i]/count[i];
y[i]=y[i]/count[i];
z[i]=z[i]/count[i];
w[i]=w[i]/count[i];
}
for(i=0;i<count.length;i++) count[i]=0;
if(Arrays.equals(x,xcmp)&&Arrays.equals(y,ycmp)&&Arrays.equals(z,zcmp)&&Arrays.equals(w,wcmp))
{
done=false;
}
else{
for(i=0;i<x.length;i++){
xcmp[i]=x[i];
ycmp[i]=y[i];
zcmp[i]=z[i];
wcmp[i]=w[i];
}
}
k++;
}
System.out.println("经过"+k+"次迭代后得到最终聚类的三个簇为:");
System.out.print("簇1为:");
for(i=0;i<cluser.length;i++)
{
if(cluser[i]==0) System.out.print(" "+"点"+(i+1));
}
System.out.println();
System.out.print("簇2为:");
for(i=0;i<cluser.length;i++)
{
if(cluser[i]==1) System.out.print(" "+"点"+(i+1));
}
System.out.println();
System.out.print("簇3为:");
for(i=0;i<cluser.length;i++)
{
if(cluser[i]==2) System.out.print(" "+"点"+(i+1));
}
System.out.println();
for(i=0;i<x.length;i++){
System.out.println("("+x[i]+","+y[i]+","+z[i]+","+w[i]+")");
}
}
//返回数组最小值的下标
public static int getMin(double[] a){
int itm=0;
double min=a[0];
for(int i=0;i<a.length;i++){
if(a[i]<min)
{
min=a[i];
itm=i;
}
}
return itm;
}
//数组置零
public static void setZero(double[] a){
for(int i=0;i<a.length;i++){
a[i]=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -