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

📄 main.cpp

📁 模糊K近邻分类器
💻 CPP
字号:
//控制整个程序的执行流程--训练,测试

#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include "FuzzyNN.h"
#include "feedfoward.h"
#include "fence.h"
#include "pecfuh.h"
#include "mpecfuh.h"
#include "tools.h"
#include "MLVQ.h"
#include "plvq.h"

void main()
{
	//输入程序需要的参数L,N
	int L; //输入层结点数
	int N; //输出层结点数
	int i,j,k;

	cout<<"请输入输入层的结点数:"<<endl;
	cin>>L;
	cout<<"请输入输出层的结点数:"<<endl;
	cin>>N;

	//网络结构的初始化
	ProtoNode *prototype;
	prototype=new ProtoNode[N+1];
	mcheck(prototype);
	for(j=1;j<=N;j++)
	{
		prototype[j].w=new FuzzyNum[L+1];
		mcheck(prototype[j].w);
		prototype[j].g=new int[N+1];
		mcheck(prototype[j].g);
	}
	ExemNode *exemplar=NULL; //exemplar是作为动态链表来处理的

	//读入数据,分别构造训练样本和测试样本
	int DataNum;
	int TrainNum;
	int TestNum;
	cout<<"请输入数据样本的总数:"<<endl;
	cin>>DataNum;
	cout<<"请输入用作训练样本的个数:"<<endl;
	cin>>TrainNum;
	TestNum=DataNum-TrainNum;

	double **data;
	data=new double *[DataNum+1];
	mcheck(data);
	for(i=1;i<=DataNum;i++)
	{
		data[i]=new double[L+2]; //L个feature,1个期望输出
		mcheck(data[i]);
	}

	ifstream ifs;
/*	
	ifs.open("c:\\iris1.dat");
    for(i=1;i<=DataNum;i++)
	{
		for(j=1;j<=L+1;j++)
		{
			ifs>>data[i][j];
		}
	}
*/	
	//~heart_scale数据的读取
	ifs.open("c:\\data.txt");
    double ttemp;
	for(i=1;i<=DataNum;i++)
	{
		for(j=1;j<=L+1;j++)
		{
			ifs>>data[i][j];
		}
		ttemp=data[i][1];
		data[i][1]=data[i][L+1];
		data[i][L+1]=ttemp;
	}

	ifs.close();
	
    
	//-将读入的数据规范化
	double *max;
	double *min;
	max=new double[L+1];
	mcheck(max);
	min=new double[L+1];
	mcheck(min);

	for(j=1;j<=L;j++)
	{
		max[j]=data[1][j];
		min[j]=data[1][j];
	}
	for(i=2;i<=DataNum;i++)
		for(j=1;j<=L;j++)
			if(data[i][j]>max[j])max[j]=data[i][j];
			else if(data[i][j]<min[j])min[j]=data[i][j];

	for(i=1;i<=DataNum;i++)
		for(j=1;j<=L;j++)
			data[i][j]=(data[i][j]-min[j])/(max[j]-min[j]);
    

	//-将规范化后的数据扩展成为模糊数
	FuzzyNum **Fuzzydata;
	Fuzzydata=new FuzzyNum *[DataNum+1];
	mcheck(Fuzzydata);
	for(i=1;i<=DataNum;i++)
	{
		Fuzzydata[i]=new FuzzyNum[L+1];
		mcheck(Fuzzydata[i]);
	}
	for(i=1;i<=DataNum;i++)
		for(j=1;j<=L;j++)
		{
			Fuzzydata[i][j].w1=data[i][j];
			Fuzzydata[i][j].w2=data[i][j];
			Fuzzydata[i][j].a=0;
			Fuzzydata[i][j].b=0;
		}
	int *output; //Fuzzydata表示特征,output表示相应的期望输出
	output=new int[DataNum+1];
	mcheck(output);
	for(i=1;i<=DataNum;i++)
		output[i]=(int)data[i][L+1];

	//生成训练样本集合
	FuzzyNum **Train;
	int *Train_out;
	Train=new FuzzyNum *[TrainNum+1];
	mcheck(Train);
	for(i=1;i<=TrainNum;i++)
	{
		Train[i]=new FuzzyNum[L+1];
		mcheck(Train[i]);
	}
	Train_out=new int[TrainNum+1];
	mcheck(Train_out);

	//下面的这部分代码段只是针对与iris这个特定的应用来写的,并
	//没有做到一般化
/*	
	int class1[25+1];
	int class2[25+1];
	int class3[25+1];

	myrand(25,class1,1,50);
	myrand(25,class2,51,100);
	myrand(25,class3,101,150);
    
	 
	for(i=1;i<=25;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class1[i]][j].w1;
            Train[i][j].w2=Fuzzydata[class1[i]][j].w2;
			Train[i][j].a=Fuzzydata[class1[i]][j].a;
			Train[i][j].b=Fuzzydata[class1[i]][j].b;
		}
		Train_out[i]=output[class1[i]];
	}
    for(i=26;i<=50;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class2[i-25]][j].w1;
            Train[i][j].w2=Fuzzydata[class2[i-25]][j].w2;
			Train[i][j].a=Fuzzydata[class2[i-25]][j].a;
			Train[i][j].b=Fuzzydata[class2[i-25]][j].b;
		}
		Train_out[i]=output[class2[i-25]];
	}
	for(i=51;i<=75;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class3[i-50]][j].w1;
            Train[i][j].w2=Fuzzydata[class3[i-50]][j].w2;
			Train[i][j].a=Fuzzydata[class3[i-50]][j].a;
			Train[i][j].b=Fuzzydata[class3[i-50]][j].b;
		}
		Train_out[i]=output[class3[i-50]];
	}

    

	//生成测试样本集
	int temp[150+1];
	for(i=1;i<=150;i++)
		temp[i]=i;
	for(i=1;i<=25;i++)
	{
		temp[class1[i]]=0;
		temp[class2[i]]=0;
		temp[class3[i]]=0;
	}
	int stest[75+1];
	k=1;
	for(i=1;i<=150;i++)
		if(temp[i]!=0)
		{
			stest[k]=temp[i];
			k++;
		}
	
	FuzzyNum **Test;
	int *Test_out;
	Test=new FuzzyNum *[TestNum+1];
	mcheck(Test);
	for(i=1;i<=TestNum;i++)
	{
		Test[i]=new FuzzyNum[L+1];
		mcheck(Test[i]);
	}
	Test_out=new int[TestNum+1];
	mcheck(Test_out);
	for(i=1;i<=75;i++)
	{
		for(j=1;j<=L;j++)
		{
			Test[i][j].w1=Fuzzydata[stest[i]][j].w1;
			Test[i][j].w2=Fuzzydata[stest[i]][j].w2;
			Test[i][j].a=Fuzzydata[stest[i]][j].a;
			Test[i][j].b=Fuzzydata[stest[i]][j].b;
		}
		Test_out[i]=output[stest[i]];
	}
	

	//~生成heart_scale数据的训练和测试样本集合
	int class1[60+1];
	int class2[75+1];
	
	myrand(60,class1,1,120);
	myrand(75,class2,121,270);
		 
	for(i=1;i<=60;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class1[i]][j].w1;
            Train[i][j].w2=Fuzzydata[class1[i]][j].w2;
			Train[i][j].a=Fuzzydata[class1[i]][j].a;
			Train[i][j].b=Fuzzydata[class1[i]][j].b;
		}
		Train_out[i]=output[class1[i]];
	}
    for(i=61;i<=135;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class2[i-60]][j].w1;
            Train[i][j].w2=Fuzzydata[class2[i-60]][j].w2;
			Train[i][j].a=Fuzzydata[class2[i-60]][j].a;
			Train[i][j].b=Fuzzydata[class2[i-60]][j].b;
		}
		Train_out[i]=output[class2[i-60]];
	}
	
	//生成测试样本集
	int temp[270+1];
	for(i=1;i<=270;i++)
		temp[i]=i;
	for(i=1;i<=60;i++)
	{
		temp[class1[i]]=0;
	}
	for(i=1;i<=75;i++)
	{
		temp[class2[i]]=0;
	}

	int stest[135+1];
	k=1;
	for(i=1;i<=270;i++)
		if(temp[i]!=0)
		{
			stest[k]=temp[i];
			k++;
		}
	
	FuzzyNum **Test;
	int *Test_out;
	Test=new FuzzyNum *[TestNum+1];
	mcheck(Test);
	for(i=1;i<=TestNum;i++)
	{
		Test[i]=new FuzzyNum[L+1];
		mcheck(Test[i]);
	}
	Test_out=new int[TestNum+1];
	mcheck(Test_out);
	for(i=1;i<=135;i++)
	{
		for(j=1;j<=L;j++)
		{
			Test[i][j].w1=Fuzzydata[stest[i]][j].w1;
			Test[i][j].w2=Fuzzydata[stest[i]][j].w2;
			Test[i][j].a=Fuzzydata[stest[i]][j].a;
			Test[i][j].b=Fuzzydata[stest[i]][j].b;
		}
		Test_out[i]=output[stest[i]];
	}
*/
	int class1[35+1];
	int class2[49+1];
	int class3[44+1];
	int class4[26+1];

	myrand(35,class1,1,71);
	myrand(49,class2,72,169);
	myrand(44,class3,170,258);
	myrand(26,class4,259,310);
    
	 
	for(i=1;i<=35;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class1[i]][j].w1;
            Train[i][j].w2=Fuzzydata[class1[i]][j].w2;
			Train[i][j].a=Fuzzydata[class1[i]][j].a;
			Train[i][j].b=Fuzzydata[class1[i]][j].b;
		}
		Train_out[i]=output[class1[i]];
	}
    for(i=36;i<=84;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class2[i-35]][j].w1;
            Train[i][j].w2=Fuzzydata[class2[i-35]][j].w2;
			Train[i][j].a=Fuzzydata[class2[i-35]][j].a;
			Train[i][j].b=Fuzzydata[class2[i-35]][j].b;
		}
		Train_out[i]=output[class2[i-35]];
	}
	for(i=85;i<=128;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class3[i-84]][j].w1;
            Train[i][j].w2=Fuzzydata[class3[i-84]][j].w2;
			Train[i][j].a=Fuzzydata[class3[i-84]][j].a;
			Train[i][j].b=Fuzzydata[class3[i-84]][j].b;
		}
		Train_out[i]=output[class3[i-84]];
	}
	for(i=129;i<=154;i++)
	{
		for(j=1;j<=L;j++)
		{
			Train[i][j].w1=Fuzzydata[class4[i-128]][j].w1;
            Train[i][j].w2=Fuzzydata[class4[i-128]][j].w2;
			Train[i][j].a=Fuzzydata[class4[i-128]][j].a;
			Train[i][j].b=Fuzzydata[class4[i-128]][j].b;
		}
		Train_out[i]=output[class4[i-128]];
	}

    

	//生成测试样本集
	int temp[310+1];
	for(i=1;i<=310;i++)
		temp[i]=i;
	for(i=1;i<=35;i++)
	{
		temp[class1[i]]=0;
	}
    for(i=1;i<=49;i++)
	{
		temp[class2[i]]=0;
	}
	for(i=1;i<=44;i++)
	{
		temp[class3[i]]=0;
	}
	for(i=1;i<=26;i++)
	{
		temp[class4[i]]=0;
	}
	int stest[156+1];
	k=1;
	for(i=1;i<=310;i++)
		if(temp[i]!=0)
		{
			stest[k]=temp[i];
			k++;
		}
	
	FuzzyNum **Test;
	int *Test_out;
	Test=new FuzzyNum *[TestNum+1];
	mcheck(Test);
	for(i=1;i<=TestNum;i++)
	{
		Test[i]=new FuzzyNum[L+1];
		mcheck(Test[i]);
	}
	Test_out=new int[TestNum+1];
	mcheck(Test_out);
	for(i=1;i<=156;i++)
	{
		for(j=1;j<=L;j++)
		{
			Test[i][j].w1=Fuzzydata[stest[i]][j].w1;
			Test[i][j].w2=Fuzzydata[stest[i]][j].w2;
			Test[i][j].a=Fuzzydata[stest[i]][j].a;
			Test[i][j].b=Fuzzydata[stest[i]][j].b;
		}
		Test_out[i]=output[stest[i]];
	}
	


	//对prototype部分进行训练
	//WeightOut(prototype,N,L);
	pecfuh(prototype,N,TrainNum,L,Train,Train_out);
	//mpecfuh(prototype,N,TrainNum,L,Train,Train_out);
	//WeightOut(prototype,N,L);
	//mlvq(prototype,N,TrainNum,L,Train);
	//plvq(prototype,N,TrainNum,L,Train);


	//对exemplar部分进行训练
	cout<<"==================================="<<endl;
	cout<<"开始准备对exemplar部分进行训练."<<endl;
	
	int *order;
	order=new int[TrainNum+1];
	mcheck(order);
		
	int c;
	int M=0; //表示exemplar部分的结点个数
	
	int errornum=1;

    while(errornum!=0)
	{
		errornum=0;
	    myrand(TrainNum,order);
     	for(i=1;i<=TrainNum;i++)
		{
	    	c=feedforward(prototype,N,exemplar,M,Train[order[i]],L);
	    	if(c!=Train_out[order[i]])
			{
		    	errornum++;
		    	M=fence(prototype,N,&exemplar,M,Train[order[i]],L,Train_out[order[i]]);
			}
		}
	}

	cout<<"exemplar部分的训练已经完成."<<endl;
    cout<<"==================================="<<endl;

  //用测试样本进行测试
	cout<<"==================================="<<endl;
	cout<<"开始对神经网络进行测试"<<endl;
	int count=0;
	int count1=0;
	int count2=0;
	int count3=0;
	int count4=0;
	for(i=1;i<=TestNum;i++)
	{
		c=feedforward(prototype,N,exemplar,M,Test[i],L);
		if(c!=Test_out[i])
		{
			if(Test_out[i]==1)count1++;
			if(Test_out[i]==2)count2++;
			if(Test_out[i]==3)count3++;
			if(Test_out[i]==4)count4++;
		}
	}
	cout<<"对神经网络测试完毕."<<endl;
    cout<<"==================================="<<endl;
	count=count1+count2+count3+count4;
	cout<<"总的测试准确率为:"<<1-(double)count/TestNum<<endl;
	cout<<"第一类测试准确率为:"<<1-(double)count1/35<<endl;
	cout<<"第二类测试准确率为:"<<1-(double)count2/49<<endl;
	cout<<"第三类测试准确率为:"<<1-(double)count3/44<<endl;
    cout<<"第三类测试准确率为:"<<1-(double)count4/26<<endl;
	cout<<"生成的exemplar结点的个数为:"<<M<<endl;
    cout<<"==================================="<<endl;
	//回收分配的空间
	for(j=1;j<=N;j++)
	{
		delete [](prototype[j].w);
		delete [](prototype[j].g);
	}
	delete []prototype;

	for(i=1;i<=DataNum;i++)
		delete [](data[i]);
	delete []data;

	delete []max;
	delete []min;

	for(i=1;i<=DataNum;i++)
		delete [](Fuzzydata[i]);
	delete []Fuzzydata;

	delete output;

	for(i=1;i<=TrainNum;i++)
		delete [](Train[i]);
	delete []Train;
	delete []Train_out;

	for(i=1;i<=TestNum;i++)
		delete [](Test[i]);
	delete []Test;
	delete []Test_out;

	delete []order;

    
	ExemNode *p,*q;
	p=exemplar;
	q=exemplar->next;
	while(p!=NULL)
	{
		delete p;
		p=q;
		if(q!=NULL)q=q->next;
	}
	
}

⌨️ 快捷键说明

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