📄 neuralnetwork.cpp
字号:
AfxMessageBox("正确!");
count++;
}
}
right_ratio=(double)count/(double)test_num;
}
void NeuralNetwork::Clonal_Muta()
{
//i.j为克隆规模循环和抗体规模循环
//m,n为权值维数循环
for (int j=0;j<10;j++)
{
//变异第一个权值矩阵
for (int m=0; m<number_hidden;m++)
{
for (int n=0;n<number_input;n++)
{
weight_1_muta[m][n][j]=weight_1[m][n]+alpha*mrand(-1,1);
}
}
//变异第二个权值矩阵
for (m=0; m<number_output;m++)
{
for (int n=0;n<number_hidden;n++)
{
weight_2_muta[m][n][j]=weight_2[m][n]+alpha*mrand(-1,1);
}
}
}
}
NeuralNetwork::train()
{
double min_w,max_w;
min_w=-1;
max_w=1;
double err_sum_temp=0;
int count=0;
double min_err;
int min_pos=0;
total_training_epoch=0;
for (int p=0;p<sample_num-1;p++)
{
for (int q=p;q<sample_num;q++)
{
for (int n=0;n<character_num;n++)
{
data_norm_temp[q-p][n]=data_norm[q][n];
}
if (p==q)
data_out_temp[q-p]=3;
else
data_out_temp[q-p]=1;
}
sample_num_temp=sample_num-p;
GetBinary();
Init_weight(min_w,max_w);
do
{
feed();
alpha=1-exp(-err_sum);
Clonal_Muta();
feed_muta();
min_err=err_sum_muta[0];
min_pos=0;
for (int m=1;m<10;m++)
{
if (err_sum_muta[m]<=min_err)
{
min_err=err_sum_muta[m];
min_pos=m;
}
}
for (int i=0;i<number_hidden;i++)
{
for (int j=0;j<number_input;j++)
{
weight_1[i][j]=weight_1_muta[i][j][min_pos];
}
}
for ( i=0;i<number_output;i++)
{
for (int j=0;j<number_hidden;j++)
{
weight_2[i][j]=weight_2_muta[i][j][min_pos];
}
}
total_training_epoch++;
err_sum=min_err/(sample_num_temp*output_num);
} while ((total_training_epoch<epoch)&&(err_sum>0.001));//
CString ss,ss1;
output_combine();
ss.Format("第%d次训练结束!训练次数为 %d\n训练正确率为%f", p+1,total_training_epoch,right_ratio);
AfxMessageBox(ss);
ss.Format("file_w1_%d.txt",p+1);
ss1.Format("file_w2_%d.txt",p+1);
SaveWeightAsFile(ss,ss1);
total_training_epoch=0;
}
}
void NeuralNetwork::feed_muta()
{
double output_of_hidden_muta[max_sample][max_node][10];//隐含层节点的输出
double sum=0;
for (int m=0;m<10;m++)
{
for (int i=0;i<sample_num_temp;i++)
{
for (int j=0;j<number_hidden;j++)
{
for (int h=0;h<number_input;h++)
{
sum=sum+weight_1_muta[j][h][m]*data_norm_temp[i][h];
}
output_of_hidden_muta[i][j][m]=sum;
output_of_hidden_muta[i][j][m]=sigmoid(output_of_hidden_muta[i][j][m]);
sum=0;
}
}
}
for (m=0;m<10;m++)
for (int i=0;i<sample_num_temp;i++)
{
for (int j=0;j<number_output;j++)
{
for (int h=0;h<number_hidden;h++)
{
sum=sum+weight_2_muta[j][h][m]*output_of_hidden_muta[i][h][m];
}
output_of_output_muta[i][j][m]=sum;
output_of_output_muta[i][j][m]=sigmoid(output_of_output_muta[i][j][m]);
sum=0;
}
}
double err_temp=0;//
double err_sum_temp=0;
for (m=0;m<10;m++)
{
for (int i=0;i<sample_num_temp;i++)
{
for (int j=0;j<number_output;j++)
{
err_temp=err_temp+fabs(output_of_output_muta[i][j][m]-data_out_binary[i][j]);
}
err_sum_temp=err_sum_temp+err_temp;
err_temp=0;
}
err_sum_muta[m]=err_sum_temp;
err_sum_temp=0;
}
}
NeuralNetwork::output_combine()
{
int out=0;
int data=0,data1=0;
double dd;
CString ss;
int count=0;
for (int i=0;i<sample_num_temp;i++)
{
for (int j=0;j<number_output;j++)
{
if (output_of_output[i][j]>=0.5)
data=1;
else if (output_of_output[i][j]<0.5)
data=0;
out=out+data*pow(2,output_num-j-1);
data=0;
}
output_com[i]=out;
if (output_com[i]==data_out_temp[i])
{
count++;
}
out=0;
}
right_ratio=(double)count/(double)sample_num_temp;
}
BOOL NeuralNetwork::SaveDatanormAsFile(CString filename)
{
FILE *fp;
fp=fopen(filename,"w");
if (fp==NULL)
{
AfxMessageBox("没有此文件");
return FALSE;
}
for (int i=0;i<sample_num;i++)
for (int j=0;j<character_num;j++)
fprintf(fp,"%f\n",data_norm[i][j]);
fclose(fp);
return TRUE;
}
void NeuralNetwork::LoadDatanorm(CString filename)
{
CFile fp;//文件变量
DWORD len;//文件长度
char buf[10000];
CString cweight;
//读取
fp.Open(filename,CFile::modeRead);
len=fp.GetLength();
fp.Read(buf,len);
fp.Close();
cweight.Empty();
for (int i=0;i<(int)len;i++)
cweight=cweight+buf[i];
double data;//临时保存数据
int count=0;
int numb_sam=0;
int numb_cha=0;
CString ss;
for (i=0;i<(int)len;i++)
{
if (cweight.Mid(i,1)!="\n")
count++;
if (cweight.Mid(i,1)=="\n")
{
data=atof(cweight.Mid(i-count-1,count));//
count=0;
numb_cha++;
if ((fmod((numb_cha-1),character_num)==0)&&((numb_cha-1)!=0))
{
numb_sam++;
numb_cha=1;
}
data_norm[numb_sam][numb_cha-1]=data;
ss.Format("data_norm[%d][%d]=%f",numb_sam,numb_cha-1,data_norm[numb_sam][numb_cha-1]);
AfxMessageBox(ss);
}
}
}
BOOL NeuralNetwork::GetTestData(CString filename)
{
CFile fp;
CString sdata;
DWORD len;//记录文件长度
char buf[5000];//读取的字符串
fp.Open(filename,CFile::modeRead);
len=fp.GetLength();
fp.Read(buf,len);
fp.Close();
sdata.Empty();
for (int i=0;i<int(len);i++)
{
sdata=sdata+buf[i];
}
int di=0;
int character_num1=0,character_num2;
sample_num_test=0;
int data_len=sdata.GetLength();
while (di<data_len)
{
if (sdata.Mid(di,1)==' ')
{
data_file[sample_num][character_num1]=atof(sdata.Mid(di-5,5));
character_num1++;
}
if (sdata.Mid(di,1)=='\n')
{
data_file[sample_num][character_num1]=atof(sdata.Mid(di-6,5));
sample_num_test++;
if ((sample_num>1) && (character_num2!=character_num1))
{
AfxMessageBox("数据错误,数据不完整,请检查!");
return 0;
}
character_num2=character_num1;
character_num1=0;
}
di++;
}
character_num_test=character_num2;
if (character_num_test!=character_num)
{
AfxMessageBox("测试数据的属性个数与神经网络输入不符!");
return FALSE;
}
//将样本分离为输入和输出样本
CString ss;
for (i=0;i<sample_num_test;i++)
{
for (int j=1;j<=character_num;j++)
{
data_in[i][j-1]=data_file[i][j];
}
data_out[i]=data_file[i][0];
}
//将输出分解为二进制数
int tem_bi;
for (i=0;i<sample_num;i++)
{
for (int j=0;j<output_num;j++)
{
tem_bi=(int)data_out[i]>>(int)(output_num-j-1);
data_out_binary[i][j]=(tem_bi&1);
}
}
return TRUE;
}
CString NeuralNetwork::LoadInfo(CString filename, int num)
{
CFile fp;//文件变量
DWORD len;//文件长度
char buf[10000];
CString info;
//读取信息
fp.Open(filename,CFile::modeRead);
len=fp.GetLength();
fp.Read(buf,len);
fp.Close();
info.Empty();
for (int i=0;i<(int)len;i++)
info=info+buf[i];
int numb=0;
int numb1=0;
CString nums;
nums.Format("#%d",num);
numb=info.Find(nums,0);
if (numb==-1)
{
AfxMessageBox("没有找到该故障编号!");
return "0";
}
numb1=info.Find("#",numb);
return info.Mid(numb,numb1-numb);
}
void NeuralNetwork::normnofile()
{
int i=0,j=0;
double ddd;
CString ss;
for (i=0;i<sample_num;i++)
{
for (j=0;j<character_num;j++)
{
ddd=data_in[i][j];
if ((ddd<=28.3) && (ddd>27.7))
{
data_norm[i][j]=1;
}
if ((ddd==1))
{
data_norm[i][j]=1;
}
if ((ddd<=27.7) && (ddd>0.3) && (ddd!=1))
{
data_norm[i][j]=(28.3-data_in[i][j])/27.4;
}
if ((ddd<=0.3) && (ddd>-0.3))
{
data_norm[i][j]=0;
}
if ((ddd<=-0.3) && (ddd>-27.7))
{
data_norm[i][j]=(-27.7-data_in[i][j])/27.4;
}
if ((ddd<=-27.7) && (ddd>=-28.3))
{
data_norm[i][j]=-1;
}
if (ddd<-28.3)
{
data_norm[i][j]=-2;
}
if (ddd>28.3)
{
data_norm[i][j]=2;
}
}
}
}
NeuralNetwork::GetBinary()
{
/* max_out=data_out_[0];
for (int i=1;i<sample_num;i++)
{
if (data_out[i]>max_out)
max_out=data_out[i];
}
//确定输出维数
if (max_out<1)
AfxMessageBox("输出维数小于或等于0,错误!");
else if (max_out==2)
output_num=1;
else if ((max_out==3)||(max_out==4))
output_num=2;
else if ((max_out>4)&&(max_out<=8))
output_num=3;
else if ((max_out>8)&&(max_out<=16))
output_num=4;
else if ((max_out>16)&&(max_out<=32))
output_num=5;
else if ((max_out>32)&&(max_out<=64))
output_num=6;
else if ((max_out>64)&&(max_out<=128))
output_num=7;
/* if (max_out<1)
AfxMessageBox("输出维数小于或等于0,错误!");
else if (max_out<10)
output_num=1;
else if (max_out>=10)
output_num=2;
number_output=output_num;
number_hidden=NUM_HIDDEN;
//将输出分解为二进制数*/
int tem_bi;
output_num=2;
for (int i=0;i<sample_num_temp;i++)
{
for (int j=0;j<output_num;j++)
{
tem_bi=(int)data_out_temp[i]>>(int)(output_num-j-1);
data_out_binary[i][j]=(tem_bi&1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -