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

📄 main.cpp

📁 FCM算法的实现及测试
💻 CPP
字号:
/*********************************************************
//  模糊C均值聚类算法
//  Coded by zhchshen
//  Date: 2008-08-19 23:42
//  zhchshen@yahoo.com.cn
//  Bezdek J C. Pattern Recognition with Fuzzy Objective 
//  Function Algorithms. New York:Plenum Press, 1981
//  编译环境: VC++ 6.0 
**********************************************************/
#include "data.h"
#include "func.h"
#include "max.h"

//全局变量定义
double **Data;                                      //数据矩阵
double **Center;                                    //聚类中心矩阵
double **U;                                         //样本隶属度矩阵 

int m;                                              //样本总数
int n;                                              //样本属性数
int k;                                              //设定的划分类别数
   


int main()
{
	
	int Lab;                                        //数据文件标号
	int num;                                        //算法运行次数

	///////////////////////////////////////////////////////////////
	cout<<"模糊C均值聚类算法:"<<endl;
	cout<<"1-iris.txt;  2-wine.txt;  3-ASD_12_2.txt; 4-ASD_14_2.txt"<<endl;
	cout<<"请选择数据集: Lab=";
	cin>>Lab;
	cout<<"设定运行次数: mum=";
	cin>>num;

	//各次运行结束后的目标函数
	double* Index=new double[num];
	//各次运行结束后的聚类正确率
	double* R=new double [num];

	//num次运行的平均目标函数及平均正确率
	double M_Index=0;
	double M_R=0;


	//FCM聚类算法运行num次,并保存记录与结果
	for(int i=0;i<num;i++)
	{
		int j;
		double epsilon=1e-4;
		int e=0; 
		int nx=0;
		//记录连续无改进次数
		int E[200]={0};

		if(i>0)
		{
			cout<<endl<<endl;
			cout<<setfill('#')<<setw(10)<<endl;
		}

		cout<<"第"<<i+1<<"次运行记录:"<<endl;
		
		//读取数据文件
		if(Lab==1)
		{
			m=150;
			n=4;
			k=3;
			Data=DataRead("dataset\\iris.txt",m,n);
		}
		else if(Lab==2)
		{
			m=178;
			n=13;
			k=3;
			
			Data=DataRead("dataset\\wine.txt",m,n);
		}
		else if(Lab==3)
		{
			m=535;
			n=2;
			k=12;
			
			Data=DataRead("dataset\\ASD_12_2.txt",m,n);
		}
		else if(Lab==4)
		{
			m=685;
			n=2;
			k=14;
			
			Data=DataRead("dataset\\ASD_14_2.txt",m,n);
		}
		
		
		//数据极差标准化处理
		Data=Standardize(Data,m,n);
		
		
		//聚类中心及隶属度矩阵,内存分配
		Center=new double*[k];
		U=new double *[k];
		for(j=0;j<k;j++)
		{
			Center[j]=new double[n];
			U[j]=new double[m];
		}
		
		
		//隶属度矩阵的初始化
		Initialize(U, k, m);
	
		//对隶属度矩阵进行归一化
		Normalize(U,k,m);
		
		//历次迭代过程中的目标函数
		double Objfcn[100]={0};
		
		cout<<"第"<<i+1<<"次运行记录:"<<endl;
		cout<<"开始迭代过程!"<<endl;
		cout<<"*******************************"<<endl;
		
		//输出精度为小数点后5位
		cout.precision(5);
		//固定格式
		cout.setf(ios::fixed);
		
		
		//目标函数连续20代无改进,停止该次聚类迭代过程
		while(e<20)
		{
			nx++;
			
			//聚类迭代过程
			Objfcn[nx]=Update(U,Data,Center,m,n,k);
			
			//统计目标函数连续无改进次数e
			if(nx>0 && Objfcn[nx]-Objfcn[nx-1]<epsilon )
			{
				e++;
			}
			else
			{
				e=0;
			}
			
			E[nx]=e;
			
		}
		
		
		//输出结果到文件,保存
		ofstream outfile("运行记录.txt",ios::app);

		outfile<<"第"<<i+1<<"次运行记录:"<<endl;
		outfile<<"开始迭代过程!"<<endl;
		outfile<<"*******************************"<<endl;
		
		outfile.precision(5);
		outfile.setf(ios::fixed);
		for(int n1=1;n1<=nx;n1++)
		{
			cout<<"e["<<setw(2)<<n1<<"]="<<setw(2)<<E[n1]<<"   Objfcn["
				<<setw(2)<<n1<<"]="<<Objfcn[n1]<<" \n";
			//保存数据文件
			outfile<<"e["<<setw(2)<<n1<<"]="<<setw(2)<<E[n1]<<"   Objfcn["
				<<setw(2)<<n1<<"]="<<Objfcn[n1]<<" \n";
		}
		cout<<endl;
		outfile<<endl;
		outfile.close();

		//本次运行的最大目标函数
		Index[i]=Objfcn[nx];
		
		//保存聚类正确率,输出聚类结果:	
		R[i]=Result(Lab, U, k, m, i);
		
		
		//内存释放
		for(j=0;j<k;j++)
		{
			delete[]Center[j];
			delete[]U[j];
		}
		
		delete[]Center;
		delete[]U;
		
	}


	//////////////////////////统计平均///////////////////////////////////
	double temp1=0, temp2=0;
	for(i=0;i<num;i++)
	{
		temp1+=Index[i];
		temp2+=R[i];
	}

	//计算各次结果的统计平均
	M_Index=(double)temp1/num;
	M_R=(double)temp2/num;

	cout<<"//////////////////////////////////////////////////////////////"<<endl;
	cout<<num<<"次运行,平均聚类正确率: "<<100*M_R<<"%"<<endl;
	
	//输出精度为小数点后6位
	cout.precision(6);
	//固定格式
	cout.setf(ios::fixed);
	cout<<"平均目标函数: "<<M_Index<<endl;


	//统计结果文件保存
	ofstream resultfile("聚类结果.txt",ios::app);
	resultfile<<"//////////////////////////////////////////////////////////////"<<endl;
	resultfile<<num<<"次运行,平均聚类正确率: "<<100*M_R<<"%"<<endl;
	
	//输出精度为小数点后6位
	resultfile.precision(6);
	//固定格式
	resultfile.setf(ios::fixed);
	resultfile<<"平均目标函数: "<<M_Index<<endl;
	
	return 0;
}







⌨️ 快捷键说明

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