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

📄 update.cpp

📁 FCM算法的实现及测试
💻 CPP
字号:
#include "data.h"
#include "func.h"
double Update(double**u, double**data, double**center, int row, int col, int k)
{
	int i,j,t;
	double **p=NULL;

	for(i=0;i<k;i++)
	{
		for(j=0;j<row;j++)
		{
			//模糊指数取2
			u[i][j]=pow(u[i][j],2);
		}
	}
	

	//根据隶属度矩阵计算聚类中心
	p=MatrixMul(u,k,row,data,row,col);

	for(i=0;i<k;i++)
	{
		//计算隶属度矩阵每行之和
		double si=0;
		for(j=0;j<row;j++)
		{
			si+=u[i][j];
		}

		for(t=0;t<col;t++)
		{	
			center[i][t]=p[i][t]/si;
		}
	}


	//计算各个聚类中心i分别到所有点j的距离矩阵dis(i,j)	
	double* a=new double[col];      //第一个样本点
	double* b=new double[col];      //第二个样本点

	double**dis=new double*[k];   //中心与样本之间距离矩阵
	
	
	for(i=0;i<k;i++)
	{
		dis[i]=new double[row];
	}


	for(i=0; i<k; i++)
	{
		//聚类中心
		for(t=0; t<col; t++)
		{
			a[t]=center[i][t];
		}
	    //数据样本
		for(j=0; j<row; j++)
		{
			for(t=0; t<col; t++)
			{
				b[t]=data[j][t];
			}
			
			double d=0;
			//中心与样本之间距离的计算
			for(t=0; t<col; t++)
			{
				d+=(a[t]-b[t])*(a[t]-b[t]);	
			}			
		
			dis[i][j]=sqrt(d);	
		}
	}
	
	
	//根据距离矩阵计算隶属度矩阵	
	for(i=0;i<k;i++)
	{
		for(j=0;j<row;j++)
		{			
			double temp=0;
			for(t=0;t<k;t++)
			{		
				//dis[i][j]依次除以所在列的各元素,加和;2.3258995
				//模糊指数为2.0
				temp+=pow(dis[i][j]/dis[t][j],2/(2.0-1));
			}	

			u[i][j]=1/temp;
	
		}

	}


	//计算聚类有效性评价函数
	double func1=0;
	for(i=0;i<k;i++)
	{
		double func2=0;
		for(j=0;j<row;j++)
		{
			func2+=pow(u[i][j],2.0)*pow(dis[i][j],2);
		}
		
		func1+=func2;
	
	}

	double obj_fcn=1/(1+func1);

	return obj_fcn;



	//内存释放
	delete[]a;
	delete[]b;
	
	for(i=0;i<k;i++)
	{
		delete[]dis[i];
	}
	
	delete[]dis;
	

}

⌨️ 快捷键说明

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