📄 main.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 + -