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;
}
}
}