update.cpp

来自「matlab编写的聚类算法代码」· C++ 代码 · 共 129 行

CPP
129
字号
#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 + =
减小字号Ctrl + -
显示快捷键?