资源简介
K-means聚类算法c语言实现。样本数据从文件读入,支持任意维数数据和任意k值(k当然要小于样本数),同时可以防止分出空类。 为做作业原创
代码片段和文件信息
#include
#include
#include
#include
int KVectordimdatasizeseed=1;
float **data**kmatrix;
float *max_column*min_column;
/*创建维数可指定的二维动态数组array[m][n]*/
float** array(int m int n)
{
float **p;
int i;
p=(float**)malloc(m*sizeof(float*));
p[0]=(float*)malloc(m*n*sizeof(float));
for(i=1; i return p;
}
/*释放二维数组所占用的内存*/
void freearray(float** p)
{
free(*p); free(p);
}
void loaddata()
{
FILE * fp;
int ij;
if((fp=fopen(“data.txt““r“))==NULL)
{
printf(“Cannot open file!\n“);
exit(0);
}
if(feof(fp))
{
printf(“data.txt is a empty file!\n“);
fclose(fp);
exit(0);
}
if(fscanf(fp“K=%dVectordim=%ddatasize=%d\n“&K&Vectordim&datasize)!=3)
{
printf(“load error!\n“);
fclose(fp);
exit(0);
}
data=array(datasizeVectordim+1);
for(i=0;i {
data[i][Vectordim]=0;
for(j=0;j {
if(j==(Vectordim-1)) fscanf(fp“%f\n“&data[i][j]);
else fscanf(fp“%f “&data[i][j]);
/*printf(“%f “data[i][j]);*/
}
}
}
double euclid_distance(float a[]float b[]int dim)
{
int i;
double sum=0;
for(i=0;i sum+=pow(a[i]-b[i]2);
return sqrt(sum);
}
void getmaxmin(float **a)
{
int ij;
max_column=(float *)malloc(sizeof(float)*Vectordim);
min_column=(float *)malloc(sizeof(float)*Vectordim);
for(i=0;i {
max_column[i]=a[0][i];
min_column[i]=a[0][i];
}
for(i=0;i {
for(j=1;j {
if(a[j][i]>max_column[i])max_column[i]=a[j][i];
if(a[j][i] /*printf(“max_column[%d]=%f min_column[%d]=%f\n“imax_column[i]imin_column[i]);*/
}
}
}
void initializerandom()
{
seed++;
srand((unsigned) time(NULL)+seed);
}
float randomreal(float Low float High)
{
return ((float) rand() / RAND_MAX) * (High-Low) + Low;
}
void K_locations_random()
{
int ij;
kmatrix=array(KVectordim+1);
printf(“Randomly the K-locations are initialized as follows:\n“);
for(i=0;i {
initializerandom();
kmatrix[i][Vectordim]=(float)(i+1);
printf(“location---%d: “i+1);
for(j=0;j {kmatrix[i][j]=randomreal(min_column[i]max_column[i]);printf(“%f “kmatrix[i][j]);}
printf(“\n“);
}
}
int existemptyclass()
{
int *emptyijef;
empty=(int *)malloc(sizeof(int)*K);
for(i=0;i for(i=0;i {
for(j=1;j<=K;j++)
{
if(j==(int)data[i][Vectordim]) empty[j-1]++;
}
}
for(i=0ef=0;i if(0==empty[i]) ef=1;
return ef;
}
int cluster()
{
int ijflageflag=1;
double closestd;
for(i=0;i {
closest=euclid_distance(data[i]kmatrix[0]Vectordim);
flag=1;
for(j=1;j {
d=euclid_distance(data[i]kmatrix[j]Vectordim);
if(d }
if(data[
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 332 2009-11-17 01:11 kmeans\data\data.txt
文件 141 2009-11-17 01:14 kmeans\data\data2.txt
文件 89 2009-11-17 01:36 kmeans\data\说明.txt
文件 332 2009-11-17 01:11 kmeans\data.txt
文件 4728 2009-11-17 01:22 kmeans\k.c
文件 24064 2009-11-17 01:34 kmeans\readme.doc
目录 0 2009-11-17 01:37 kmeans\data
目录 0 2009-11-17 01:35 kmeans
----------- --------- ---------- ----- ----
29686 8
- 上一篇:计算方法实验5--埃特金加速迭代算法
- 下一篇:单片机计时器/计数器产生方波
相关资源
- 基于聚类的医学图像分割法
- 复杂网络聚类系数最短路径平均长度
- MFC实现K均值算法
- k-means 源代码C++实现
- k-means多维数据聚类
- c++写的马尔科夫聚类算法MCL
- 层次聚类算法C++
- FLICM聚类算法C语言
- vc6.0编写的SOM神经网络聚类
- k均值聚类算法
- Em算法实现聚类(VC++实现)
- K-means聚类算法的C++实现
- DBSCAN聚类算法C++代码实现
- 聚类算法DBScanC++实现代码及简单
- c++ 图片分类(特征聚类)
- 智能控制中的谱系聚类法实现与设计
- DBSCAN聚类C++算法,可用于GPS车辆聚集
- Opencv实现区域增长法,K均值聚类,模
- k-mean聚类算法实现
- K均值算法C语言
评论
共有 条评论