?? 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 + -