📄 fcm.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 + -