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

📄 fcm.c

📁 模糊聚类分析传递闭包算法FCM的matlab程序
💻 C
字号:
//模糊聚类分析法
#include <stdio.h> 
#include <math.h>
#include <malloc.h>

int N;//样本数
int M;//特征数
double 	Q//置信水平
double **DATA//样本数据
double *P//平均值矩阵
double *P1//标准差矩阵
double **DATA2
double **R//模糊相似矩阵
double **T//模糊等价关系矩阵
double **T2//q截矩阵

void meancluster(int n,int m,double **data,double *p,double *p1)
{ int i,j;
	
	for(i=0;i<m;i++)
  {p[i]=0;
   for(j=0;j<n;j++)
    p[i]+=data[j][i];
    p[i]=p[i]/n;
    }
  for(i=0;i<m;i++)
  {p1[i]=0;
   for(j=0;j<n;j++)
    p1[i]+=(data[j][i]-p[i])*(data[j][i]-p[i]);
    p1[i]=p1[i]/n;
    p1[i]=sqrt(p1[i]);
    }
 }
//将数据归一化
 void standardcluster(int n,int m,double *p1,double *p,double **data,double **data2)
 { double *a;
   double *b;
   double **data1;
   int i,j;
   for(i=0;i<n;i++)
     for(j=0;j<m;j++)
       data1[i][j]=(data[i][j]-p[j))/p1[j];
   for(j=0;j<m;j++)
    {a[j]=data1[0][j];//最小
     for(i=0;i<n;i++)
      if(data1[i][j]<a[j])
      	a[j]=data1[i][j];
      b[j]=data1[0][j];//最大
      for(i=0;i<n;i++)
      if(data1[i][j]>a[j])
      	a[j]=data1[i][j];
      }
   for(i=0;i<n;i++)
    for(j=0;j<m;j++)
     data2[i][j]=(data1[i][j]-a[j]))/(b[j]-a[j]);
 } 
 //建立模糊相似矩阵
 void simplycluster(int n,int m,double **data2,double **r)
 { double **r1;
 	 double m;
 	 int i,j,k;
   for(i=0;i<n;i++)
    for(k=0;k<n;j++)
     {if(i==k);
     	else
     		for(j=0;j<m;j++)
     		 r1[i][k]=r1[i][k]+data2[i][j]*data2[k][j];
     		}
    m=r1[0][0];
    for(i=0;i<n;i++)
     for(j=0;j<n;j++)
      if(r1[i][j]>m)
      	m=r1[i][j];
    for(i=0;i<n;i++)
     for(j=0;j<n;j++)
     {if(i==j)
      	r[i][j]=1;
      else
      	r[i][j]=r1[i][j]/m;
      }
  }
  //建立模糊等价关系矩阵
  void equalcluster(int n,double **r,double **t)
{ int flag=1;
	int c=0;
	int i,j,k;
	double **t1;
  for(i=0;i<n,i++)
		for(j=0;j<n;j++)
		 t1[i][j]=r[i][j];
	while(flag!=0)
	{for(i=0;i<n,i++)
		for(j=0;j<n;j++)
		 for(k=0;k<n;k++)
		 {if(t1[i][k]<t1[k][j])
		 	 c=t1[i][k];
		 	else
		 	 c=t1[k][j];
		 	if(c<t1[i][j])
		 		c=t1[i][j];
		 	else ;
		 	t[i][j]=c;
		 	}
		 flag=0;
		for(i=0;i<n,i++)
		 for(j=0;j<n;j++)
		 if(t[i][j]!=t1[i][j])
		 	{flag=1;
		 	 t[i][j]=t1[i][j];
		 	}
		}
	}
	void result(int n,double **t,double **t2,double q)
{ int i,j;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{if(t[i][j]>=q)
			t2[i][j]=1;
		 else
		 	t2[i][j]=0;
		}
	}
	void Print(int n,double **s)
{
    int i,j;
    printf("-------------------------------------- ");
    for(i=0;i<n;i++)
   {
        for(j=0;j<n;j++)
          {
              printf("%f ",s[i][j]);
          }           
    }     
}
int main()
{ int i,j;
	printf("样本数:");
 scanf("%d",&N);
 printf("特征数 :");
 scanf("&d",&M);
 printf("输入样本数:");
 for(i=0;i<N;i++)
  for(j=0;j<M;j++)
   scanf("%f",&DATA[i][j]);
 printf("q置信水平:");
 scanf("%f",&Q);
 
 P=(double *)malloc(sizeof(double)*M);//申请空间
 P1=(int *)malloc(sizeof(int)*M);//申请空间
DATA2=(double *)malloc(sizeof(double*)*N);//为数据集合申请空间
R=(double *)malloc(sizeof(double*)*N);
T=(double *)malloc(sizeof(double*)*N);
T2=(double *)malloc(sizeof(double*)*N);

 meancluster(N,M,DATA,P,P1);
 standardcluster(N,M,P1,P,DATA,DATA2);
 simplycluster(N,M,DATA2,R);
 printf("模糊相似矩阵:");
 Print(N,R);
 equalcluster(N,R,T);
 printf("模糊等价矩阵:");
 Print(N,T);
 result(N,T,T2,Q);
 printf("Q截矩阵:");
 Print(N,Q);
}
 
 
 





  
 
 

	
		 	
		 
	
	
	
  
     
      
    
     	
     		 
     
   
    
   
 
     
      	
      	
    
  
    
    
    

⌨️ 快捷键说明

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