模糊识别的聚类分析+C代码

1.  模糊识别的聚类分析的实现步骤:



2. 模糊矩阵计算的一些知识:





2.1  内积和外积的计算:

2.1.1 内积计算:




2.1.2 外积计算:



2.2  截集计算


2.3 传递闭包矩阵 t(R)的计算方法如下:



3.  系数矩阵R的计算方法有很多,如:

数量积法:


最大最小法:


绝对值减数法:

R(i, j) = 1 - a*sum( | X(i, k) - X(j, k) | )


c语言代码如下:

#include "stdio.h"
#include "math.h"
#include "vector"
using namespace std;


#define CLUTER_NUM 3  //聚类数量
#define MAXITER 1000
#define dimNum 4
#define N 5
typedef vector<int> intVector;


double X[N][dimNum] = {5, 5, 3, 2,   2, 3, 4, 5,   5, 5, 2, 3,   1, 5, 3, 1,   2, 4, 5, 1};
double R[N][N] = {0};   //系数矩阵(相似度矩阵)
double T_R[N][N] = {0};  //传递矩阵


double MIN(double a, double b) {return a<b?a:b;}
double MAX(double a, double b) {return a>b?a:b;}
void getR();   //获取相似度矩阵
void getT_R();  //获取传递矩阵
bool QueryT_R();  //检查传递矩阵条件是否符合
void Cluster();   //聚类函数


void main()
{
getR();  //获取相似度矩阵
getT_R();  //计算传递矩阵
Cluster();  //开始聚类
}




//聚类函数
void Cluster()
{
double Landa = 1;


int i, j, k;
double Landa_R[N][N];
vector<int> vecTemp;
vector<intVector> clusters;



//截集
for(Landa=1; Landa>0; )
{
clusters.clear();


for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
if(T_R[i][j]<Landa)
Landa_R[i][j] = 0;
else
Landa_R[i][j] = 1;
}

//聚类
for(i=0; i<N; i++)
{
vecTemp.clear();
int temp[N]={0};

for(j=0; j<N; j++)
if(Landa_R[i][j]==1)
temp[j] = 1;

for(j=0; j<N; j++)
if(temp[j]!=0)
{
vecTemp.push_back(j+1);
for(k=0; k<N; k++)
Landa_R[j][k] = 0;
}

if(vecTemp.size()>0)
clusters.push_back(vecTemp);

}

Landa = Landa-0.002;
//判断是否满足分类要求
if(clusters.size()==CLUTER_NUM)
{
printf("将样本分为%d类的情况如下:\n", CLUTER_NUM);


for(i=0; i<clusters.size(); i++)
{
printf("第%d类:\n", i+1);
for(j=0; j<clusters[i].size(); j++)
printf("   X%d", clusters[i][j]);
printf("\n");
}


break;
}


}



}


//检查传递矩阵条件是否符合
bool QueryT_R()
{
int i, j, m, n;


for(i=0; i<N; i++)
for(j=0; j<N; j++)
if(T_R[i][j] != R[i][j])
{
for(m=0; m<N; m++)
for(n=0; n<N; n++)
R[m][n] = T_R[m][n];
return false;
}


return true;
}


//获取传递矩阵
void getT_R()
{
int Iter = 0;
bool flag = false;
int i, j, k;
double temp[N];
double maxTemp;


//计算传递矩阵
while(!flag && Iter<MAXITER)
{
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
temp[k] = MIN(R[i][k], R[k][j]);


maxTemp = temp[0];
for(k=1; k<N; k++)
maxTemp = MAX(maxTemp, temp[k]);


T_R[i][j] = maxTemp;
}


flag = QueryT_R();
Iter++;
}


}




//获取相似度矩阵
void getR()
{
int n;
int i, j, k;
double sum;


printf("相关系数的计算方法:\n1. 绝对值减数法\n2. 数量积法 \n3. 最大最小法\n请选择:");
scanf("%d", &n);
printf("\n");

//绝对值减数法
if(n==1)
{
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
sum = 0;
for(k=0; k<dimNum; k++)
sum += fabs(X[i][k]-X[j][k]);
R[i][j] = 1-0.1*sum;
}

}


//数量积法
if(n==2)
{
double M = 0;


//计算相似度矩阵
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
sum = 0;
for(k=0; k<dimNum; k++)
sum += X[i][k]*X[j][k];
R[i][j] = sum;
if(M<sum)
M = sum;
}


//求M的值(M>max(sum))
M = M+M*0.2;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
R[i][j] = R[i][j]/M;
if(i==j)
R[i][j] = 1;
}


}


//最大最小法
if(n==3)
{
double a1, a2;


for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
a1 = a2 = 0;
for(k=0; k<dimNum; k++)
{
a1 += MIN(X[i][k], X[j][k]);
a2 += MAX(X[i][k], X[j][k]);
}


R[i][j] = a1/a2;
}


}


}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值