k均值聚类算法的实现

chi*_*inu 1 java algorithm cluster-analysis data-mining k-means

在我的程序中,我将k = 2用于k-mean算法,即我只想要2个簇.我已经以一种非常简单明了的方式实现了,我仍然无法理解为什么我的程序进入无限循环.任何人都可以指导我在哪里犯错误..?

为简单起见,我已经在程序代码本身中获取了输入.这是我的代码:

import java.io.*;
import java.lang.*;
class Kmean
{
public static void main(String args[])
{
int N=9;
int arr[]={2,4,10,12,3,20,30,11,25};    // initial data
int i,m1,m2,a,b,n=0;
boolean flag=true;
float sum1=0,sum2=0;
a=arr[0];b=arr[1];
m1=a; m2=b;
int cluster1[]=new int[9],cluster2[]=new int[9];
for(i=0;i<9;i++)
    System.out.print(arr[i]+ "\t");
System.out.println();

do
{
 n++;
 int k=0,j=0;
 for(i=0;i<9;i++)
 {
    if(Math.abs(arr[i]-m1)<=Math.abs(arr[i]-m2))
    {   cluster1[k]=arr[i];
        k++;
    }
    else
    {   cluster2[j]=arr[i];
        j++;
    }
 }
    System.out.println();
    for(i=0;i<9;i++)
        sum1=sum1+cluster1[i];
    for(i=0;i<9;i++)
        sum2=sum1+cluster2[i];
    a=m1;
    b=m2;
    m1=Math.round(sum1/k);
    m2=Math.round(sum2/j);
    if(m1==a && m2==b)
        flag=false;
    else
        flag=true;

    System.out.println("After iteration "+ n +" , cluster 1 :\n");    //printing the clusters of each iteration
    for(i=0;i<9;i++)
        System.out.print(cluster1[i]+ "\t");

    System.out.println("\n");
    System.out.println("After iteration "+ n +" , cluster 2 :\n");
    for(i=0;i<9;i++)
        System.out.print(cluster2[i]+ "\t");

}while(flag);

    System.out.println("Final cluster 1 :\n");            // final clusters
    for(i=0;i<9;i++)
        System.out.print(cluster1[i]+ "\t");

    System.out.println();
    System.out.println("Final cluster 2 :\n");
    for(i=0;i<9;i++)
        System.out.print(cluster2[i]+ "\t");
 }
}
Run Code Online (Sandbox Code Playgroud)

Vin*_*ele 5

你有一堆错误:

  1. 在你开始do循环,你应该重置sum1sum2为0.

  2. 你应该循环直到kj计算sum1sum2(或清除cluster1和循环cluster2开始时)do.

  3. sum2你的计算中不小心使用sum1.

当我进行这些修复时,代码运行正常,产生输出:

Final cluster 1 :   
2   4   10   12  3   11  0   0   0

Final cluster 2 :
20  30  25   0   0   0   0   0   0
Run Code Online (Sandbox Code Playgroud)

我的一般建议:学习如何使用调试器.Stackoverflow不适用于这样的问题:预计您可以找到自己的错误,只有在其他一切都失败时才会来到这里...