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

📄 fuzzycluster.c

📁 这是一个模糊聚类代码(matlab)供大家学习
💻 C
字号:
/*************** Clustering, Bezdek's Algorithm *****************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_N    150  /* maximum number of data points x1, x2,....,xN */
#define MAX_DIM  10 /* maximum dimension */
#define MAX_CLUST  30 /* maximum number of clusters */
#define STOP 0.0001  /* max. improvement limit for stopping */

void main()
{
int i, j, l, m, n, c, switch1, select, flag1, seed;
float x[MAX_N][MAX_DIM], u[MAX_CLUST][MAX_N], v[MAX_CLUST][MAX_DIM];
float d[MAX_CLUST][MAX_N], old_u[MAX_CLUST][MAX_N], min[MAX_N];
float sum1, sum2, max, delta, ratio, m_prime;
char file_name[20], c1;

FILE *fp1;


printf("Input data file name\n");
printf("Data should be stored as matrix\n");
printf("row  -> data point (vector) Xi: column -> dimension of data set\n\n");
printf("File name: ");
scanf("%s", file_name);
printf("Data file name: %s \n", file_name);

fp1=fopen(file_name, "r");
if(fp1 == NULL) {
	printf("\nError - Can't open the data file\n");
	printf("Hit any key to exit\n");
	c1=getchar();
	c1=getchar();
	exit(1);
	}


printf("Number of data points(vectors): ");
scanf("%d", &n);
printf("Vector size(dimension): ");
scanf("%d", &m);
printf("Number of clusters: ");
scanf("%d", &c);
printf("Enter 1 for direct clustring ---- 2 for fuzzy clustring: ");
scanf("%d", &switch1);

if(switch1 == 2) {
	do{
		printf("m: ");
		scanf("%f", &m_prime);
		if(m_prime<=1) printf("m' should be larger than 1, try again\n");
		}while(m_prime<=1);
	}

printf("Input random number seed(any integer): ");
scanf("%d", &seed);

srand(seed);

/********* CHECK FOR VIOLATION OF CARDINAL RULES *********/

flag1=1;

if(switch1 == 1 || switch1 == 2) flag1=0;

if(n<c) flag1=1;

if(flag1 == 1) {
	printf("\nError - Violation of a Cardinal Rule\n");
	printf("Hit any key to exit\n");
	c1=getchar();
	c1=getchar();
	exit(1);
	}

/********** SCANNING THE DATA ********/

for(i=0; i<n; ++i) {
	for(j=0; j<m; ++j) fscanf(fp1, "%f ", &x[i][j]);
	fscanf(fp1, "\n");
	}

fclose(fp1);

printf("Printing Data:\n");
for(i=0; i<n; ++i) {
	for(j=0; j<m; ++j) printf("%f\t", x[i][j]);
	printf("\n");
	}

/********* CREATING INITIAL U MATRIX *****/

for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) u[i][j]=0.0;
	}

for(j=0; j<c; ++j) u[j][j]=1.0;
	for(j=c; j<n; ++j) {
		select=rand()%c;
		u[select][j]=1.0;
		}


printf("Initial U matrix\n");
for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) printf("%8.4f", u[i][j]);
	printf("\n");
	}


/************ GENERATING V MATRIX *************/

do{

for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) old_u[i][j]=u[i][j];
	}
for(i=0; i<c; ++i) {
	for(j=0; j<m; ++j) {
		sum1=0;
		sum2=0;
		for(l=0; l<n; ++l) {
			if(switch1 == 2) u[i][l]=pow((u[i][l]),m_prime);
			sum1=sum1+u[i][l]*x[l][j];
			sum2=sum2+u[i][l];
			}
      if (sum2==0.0) break;
		v[i][j]=sum1/sum2;

		}
	}

/*************** COMPUTING D MATRIX ***********/

for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) {
		sum1=0;
		for(l=0; l<m; ++l) {
			sum1=sum1+pow((x[j][l]-v[i][l]),2);
			}

		d[i][j]=sqrt(sum1);
		}
	}


/********** UPDATING U MATRIX ********************/



switch(switch1) {

case 1:  /* direct clustring */

	for(j=0; j<n; ++j) min[j]=d[0][j];
	for(j=0; j<n; ++j) {

		for(i=1; i<c; ++i) {
			if(d[i][j]<min[j]) min[j]=d[i][j];
			}
		}

	for(j=0; j<n; ++j) {
		for(i=0; i<c; ++i) {
			if(d[i][j] == min[j]) u[i][j]=1;
			else u[i][j]=0;
			}
		}
	break;

case 2:
	for(i=0; i<c; ++i) {
		for(j=0; j<n; ++j) {
			sum1=0.0;
			for(l=0; l<c; ++l) {
				if(d[l][j]==0.0) d[l][j]=1e-5;
				sum1=sum1+pow((d[i][j]/d[l][j]),(2.0/(m_prime-1.0)));
				}
			u[i][j]=1.0/sum1;
			}
		}
	break;

} /* end of switch */

printf("\nUpdated U matrix\n");
for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) printf("%7.4f", u[i][j]);
	printf("\n");
	}

/********** CALCULATE IMPROVEMENT ***************/

max=u[0][0]-old_u[0][0];
if(max<0) max=-1.0*max;

for(i=0; i<c; ++i) {
	for(j=0; j<n; ++j) {
		delta=u[i][j]-old_u[i][j];
		if(delta<0) delta=-1.0*delta;
		if(delta>max) max=delta;
		}
	}

printf("Max Improvement: %f\n", max);
printf("\nHit return to continue\n");

c1=getchar();


}while(max>STOP);

printf("\n\tCluster coordinates:\n");
printf("Cluster no:\n");
for(i=0; i<c; ++i) {
	printf("%d\t\t", i);
	for(j=0; j<m; ++j) printf("%f\t", v[i][j]);
	printf("\n");
	}


printf("\nCLUSTER\t\tDATA POINTS\n");
printf("========\t=====================\n");
for(i=0; i<c; ++i){
	printf("%d\t\t", i+1);
	for(j=0; j<n; ++j) {
		if(u[i][j]>0.5) printf("%3d", j+1);
		}
	printf("\n");
	}

c1=getchar();

} /* end of main loop */

⌨️ 快捷键说明

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