k-平均クラスタリングアルゴリズムC言語ソースコード


#include <stdio.h> 
#include <math.h>
#define TRUE            1
#define FALSE           0 
int N;//    
int K;//    
int * CenterIndex;//          
double * Center;//    
double * CenterCopy;//      
double * AllData;//    
double ** Cluster;//    
int * Top;//        ,       

 
//    k  x(0<=x<=n-1)         
void CreateRandomArray(int n, int k,int * center)
{
    int i=0;
    int j=0;    
    srand( (unsigned)time( NULL ) );
    for( i=0;i<k;++i)//    k  
    {
        int a=rand()%n;
        //  
        for(j=0;j<i;j++)
        {
            if(center[j]==a)//  
            {
                break;
            }
        }
        if(j>=i)//     ,  
        {
            center[i]=a;
        }
        else
        {
            i--;
            //    ,        
        }
    }     
}
 
//            
int GetIndex(double value,double * center)
{
    int i=0;
    int index=i;//       
    double min=fabs(value-center[i]);//       
    for(i=0;i<K;i++)
    {
        if(fabs(value-center[i])<min)//         ,             
        {
             index=i;
             min=fabs(value-center[i]);
        }
    }
    return index;
}
 
//         
void CopyCenter()
{
    int i=0;
    for(i=0;i<K;i++)
    {
        CenterCopy[i]=Center[i];
    }
}
//     ,     
void InitCenter()
{
    int i=0;
    CreateRandomArray(N,K,CenterIndex);//     K <N      
    for(i=0;i<K;i++)
    {
        Center[i]=AllData[CenterIndex[i]];//            
    }
    CopyCenter();//       
}
//         Cluster[index]  
void AddToCluster(int index,double value)
{
    Cluster[index][Top[index]++]=value;//       
} 

//       
void UpdateCluster()
{    
    int i=0;
    int tindex;
    //        ,  TOP 0
    for(i=0;i<K;i++)
    {
        Top[i]=0;
    }
    for(i=0;i<N;i++)
    {
        tindex=GetIndex(AllData[i],Center);//              
        AddToCluster(tindex,AllData[i]);        //          
    }
}
//        ,                 
void UpdateCenter()
{
    int i=0;
    int j=0;
    double sum=0;
    for(i=0;i<K;i++)
    {
        sum=0;    
        //   i    
        for(j=0;j<Top[i];j++)
         {
             sum+=Cluster[i][j];
         }
        if(Top[i]>0)//         
        {
           Center[i]=sum/Top[i];//     
        }
    }
}
//  2        
int IsEqual(double * center1 ,double * center2)
{
    int i;
    for(i=0;i<K;i++)
    {
         if(fabs(center1[i]!=center2[i]))
         {
             return FALSE;
         }
    }
    return TRUE;
}
//      
void Print()
{
    int i,j;
    printf("-------------------------------------- ");
    for(i=0;i<K;i++)
    {
         printf(" %d :   (%f) ",i,Center[i]);
          for(j=0;j<Top[i];j++)
          {
              printf("%f ",Cluster[i][j]);
          }           
    }     
}
//          
void InitData()
{
    int i=0;
    int a;
    printf("      : ");     
    scanf("%d",&N);
    printf("     : ");     
    scanf("%d",&K);    
    if(K>N)
    {
        exit(0);
    }
    Center=(double *)malloc(sizeof(double)*K);//         
    CenterIndex=(int *)malloc(sizeof(int)*K);//           
    CenterCopy=(double *)malloc(sizeof(double)*K);//           
    Top=(int *)malloc(sizeof(int)*K); 
    AllData=(double *)malloc(sizeof(double)*N);//         
    Cluster=(double **)malloc(sizeof(double *)*K);//        
    //   K    
    for(i=0;i<K;i++)
    {
        Cluster[i]=(double *)malloc(sizeof(double)*N);
        Top[i]=0;
    }
    printf("  %d  : ",N);
    for(i=0;i<N;i++)
    {
        scanf("%d",&(a));
        AllData[i]=a;
    }
    InitCenter();//             
    UpdateCluster();//   K    
     
}
/*
    :
K    :
          K, N     K    ,
                  ,          。
*/
main()
{
    int Flag=1;//    ,  false,     
    int i=0;
     InitData();//           
     while(Flag)//    
     {
         UpdateCluster();//      
         UpdateCenter();//      
         if(IsEqual(Center,CenterCopy))//                ,    ,    
         {
             Flag=0;
         }
         else//                     
         {
             CopyCenter();//                   
         }
     }
     Print();//    
     getchar();
     getchar();
     
}