以前写了一个K-means(C-means)K均值也成为C均值算法,该算法是聚类分析中的一个经典算法,现把程序粘上,大家相互讨论,以前写的代码,写过看起来有许多要改的地方,懒的改了,其中是用OpenGL画的图,很简单的图,本来自己的代码能力就不强哈!
程序如下:
#include <stdio.h>
#include <math.h>
#include <MALLOC.H>
#include <TIME.H>
#include <CONIO.H>
#include <STDLIB.H>
#include <MATH.H>
#include <graphics.h>
#include <GL/glut.h>
#include <WINDOWS.H>
#define TRUE 1
#define FALSE 0
int N;//数据个数
int K;//集合个数
int * CenterIndexX;//初始化质心数组的索引
int * CenterIndexY;
double * CenterX;//质心集合
double * CenterY;
double * CenterCopyX;//质心集合副本
double * CenterCopyY;
double * AllDataX;//数据集合
double * AllDataY;
double ** ClusterX;//簇的集合
double ** ClusterY;
int * TopX;//集合中元素的个数,也会用作栈处理
int * TopY;
//随机生成k个数x(0<=x<=n-1)作为起始的质心集合
void CreateRandomArray(int N,int k,int * centerX,int * centerY)
{
int i=0;
int j=0;
srand( (unsigned)time( NULL ) );
for( i=0;i<k;++i)//随机生成k个数
{
int a1=rand()%N;
int a2=rand()%N;
//判重
for(j=0;j<i;j++)
{
if(centerX[j]==a1&¢erY[j]==a2)//重复
{
break;
}
}
if(j>=i)//如果不重复,加入
{
centerX[i]=a1;
centerY[i]=a2;
}
else
{
//如果重复,本次重新随机生成
i--;
}
}
}
//返回距离最小的质心的序号
int GetIndex(double valueX,double valueY,double * centerX,double * centerY)
{
int i=0;
int index=i;//最小的质心序号
double min=sqrt(pow((valueX-centerX[