⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 junzhi.cpp

📁 这个是以前开始研究模式识别的关于C均值算法和固定增量法的VC++程序
💻 CPP
字号:
#include<stdio.h> 
#include<malloc.h> 
#include<string.h> 
#include<stdlib.h>
#include <ctime>

#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;

void CreateRandomArray(int n, int k,int * center)
{
    int i=0;
    int j=0;    
    srand((unsigned)time(NULL));
    for( i=0;i<k;++i)
    {
        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);
    for(i=0;i<K;i++)
    {
        Center[i]=AllData[CenterIndex[i]];
    }
    CopyCenter();
}

void AddToCluster(int index,double value)
{
    Cluster[index][Top[index]++]=value;
} 

void UpdateCluster()
{    
    int i=0;
    int tindex;
    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;    
    
        for(j=0;j<Top[i];j++)
         {
             sum+=Cluster[i][j];
         }
        if(Top[i]>0)
        {
           Center[i]=sum/Top[i];
        }
    }
}

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);
    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();
     
}

void main()
{
    int Flag=1;
    int i=0;
     InitData();     
     while(Flag)
     {
         UpdateCluster();
         UpdateCenter();
         if(IsEqual(Center,CenterCopy))
         {
             Flag=0;
         }
         else
         {
             CopyCenter();
         }
     }
     Print();
     getchar();
     getchar();
     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -