📄 b.cpp
字号:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#define K 2
#define M 8 //隐节点个数
#define N 4 //学习样本个数
//////////////////////////////////////////////////////////
double x[N][K]={0,0,0,1,1,0,1,1}; //x输入
double y[N]; //y输出
double t[N]; //t教师
double h[M][N]; // 记录隐单元的输出
double b[N]; //输出误差
double b1[M][N]; //记录隐单元误差
double w1[K][M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //输入与第一隐层的权
double w2[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层与输出层的权
double q[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层的阈值
double p=0.3; //输出层的阈值
double r=0.2; //步长
//int s=0; //记录训练次数
//////////////////////////////////////////////////////////////////////////
double f(double u)
{
return 1/(1+exp(-u));
}
///////////////////////////////////////////////////////////////////////////
//赋值函数
void fuzhi(void)
{
t[0]=0;t[1]=1;t[2]=1;t[3]=0;
}
////////////////////////////////////////////////////////////
//计算隐单元输出,输出单元
void jisuan(void)
{
int i,j,n;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
for(n=0;n<K;n++)
h[i][j]+=w1[n][i]*x[j][n];
h[i][j]=f(h[i][j]-q[i]);
}
for(j=0;j<N;j++)
{
for(i=0;i<M;i++)
y[j]+=w2[i]*h[i][j];
y[j]=f(y[j]-p);
}
}
///////////////////////////////////////////////////////////
//计算误差
void wucha(void)
{
int i,j;
for(j=0;j<N;j++) b[j]=y[j]*(1-y[j])*(t[j]-y[j]); //输出
for(i=0;i<M;i++)
for(j=0;j<N;j++)
b1[i][j]=b[j]*w2[i]*h[i][j]*(1-h[i][j]);//隐单元
}
//////////////////////////////////////////////////////////////
//权的修改
void xiugai(void)
{
double c=0,d=0; //临时变量
int i,j,n;
for( i=0;i<M;i++)
{
c=0;
for( j=0;j<N;j++)
c+=b[j]*h[i][j];
w2[i]+=r*c;
}
c=0;
for(j=0;j<N;j++) c+=b[j]*(-1);
p+=c*r;
for(i=0;i<M;i++)
{c=0;
for(n=0;n<K;n++)
{
for(j=0;j<N;j++)
c+=b1[i][j]*x[j][n];
w1[n][i]+=r*c;
}
}
for(i=0;i<M;i++)
{d=0;
for(j=0;j<N;j++)
d+=b1[i][j]*(-1);
q[i]+=r*d;
}
}
////////////////////////////////////////////////////////////
//计算输出的总误差
double shuchu(void)
{
double e=0;
for(int j=0;j<N;j++) e+=(t[j]-y[j])*(t[j]-y[j]);
return e;
}
///////////////////////////////////////////////////////////
//主函数
void main()
{
int s=0;
double Ez;
fuzhi();
do{ ++s;
jisuan();
wucha();
xiugai();
Ez=shuchu()/2;
}while(Ez>0.001);
cout<<"学习次数:"<<s<<" \n";
//for(int j=0;j<N;j++) cout<<y[j]<<" ";
cout<<"样本00 输出"<<y[0]<<"\n 01 输出"<<y[1]<<"\n 10 输出"<<y[2]<<"\n 11 输出"<<y[3]<<"\n";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -