📄 pecfuh.cpp
字号:
//该函数实现对prototype部分的训练
/* 输入参数包括:
prototype -- 指向prototype部分的指针
N -- prototype部分的结点个数
TrainNum -- 训练样本的个数
L -- 训练样本的维数
Train -- 训练样本集合
Train_out -- 训练样本的期望输出
*/
#include <iostream.h>
#include <stdio.h>
#include "FuzzyNN.h"
#include "feedfoward.h"
#include "tools.h"
#include <math.h>
void pecfuh(ProtoNode *prototype,int N,int TrainNum,int L,FuzzyNum **Train,int *Train_out)
{
double alpha0;
int i,j,k;
int def=5;
double alpha;
cout<<"==================================="<<endl;
cout<<"现在开始对神经网络进行第一趟的训练."<<endl;
cout<<"请输入学习速率的大小:"<<endl;
cin>>alpha0;
//初始化prototype部分
for(j=1;j<=N;j++)
{
for(i=1;i<=L;i++)
{
(prototype[j].w)[i].w1=frand(0.45,0.55);
(prototype[j].w)[i].w2=frand(0.45,0.55);
(prototype[j].w)[i].a=frand(0.45,0.55);
(prototype[j].w)[i].b=frand(0.45,0.55);
}
for(i=1;i<=N;i++)
if(i==j)(prototype[j].g)[i]=1;
else (prototype[j].g)[i]=0;
}
//WeightOut(prototype,N,L);
//对胜出结点的权值进行调整
int c;
for(k=1;k<=def;k++)
{
alpha=alpha0*(1-(k-1)/(double)def);
for(j=1;j<=TrainNum;j++)
{
c=feedforward(prototype,N,NULL,0,Train[j],L);
if(c==Train_out[j])
{
for(i=1;i<=L;i++)
{
(prototype[c].w)[i].w1+=alpha*(Train[j][i].w1-(prototype[c].w)[i].w2);
(prototype[c].w)[i].w2+=alpha*(Train[j][i].w2-(prototype[c].w)[i].w1);
(prototype[c].w)[i].a+=alpha*(Train[j][i].a+(prototype[c].w)[i].b);
(prototype[c].w)[i].b+=alpha*(Train[j][i].b+(prototype[c].w)[i].a);
}
}
else
{
for(i=1;i<=L;i++)
{
(prototype[c].w)[i].w1+=-alpha*(Train[j][i].w2-(prototype[c].w)[i].w1);
(prototype[c].w)[i].w2+=-alpha*(Train[j][i].w1-(prototype[c].w)[i].w2);
(prototype[c].w)[i].a+=alpha*(Train[j][i].b+(prototype[c].w)[i].a);
(prototype[c].w)[i].b+=alpha*(Train[j][i].a+(prototype[c].w)[i].b);
}
}
//WeightOut(prototype,N,L);
}
}
cout<<"神经网络第一趟训练完毕."<<endl;
cout<<"==================================="<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -