📄 test.cpp
字号:
//B-P算法对函数y=0.4sin(2*PI*x)+0.5的拟合
#include<iostream>
#include<math.h>
using namespace std;
#define M 8 //隐节点个数
#define N 20 //学习样本个数
#define PI 3.14159
//////////////////////////////////////////////////////////
static float x[N]; //x输入
static float y[N]; //y输出
static float t[N]; //t教师
static float h[M][N]; // 记录隐单元的输出
static float b[N]; //输出误差
static float b1[M][N]; //记录隐单元误差
float w1[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //输入与第一隐层的权
float w2[M]={0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1}; //第一隐层与输出层的权
float q[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层的阈值
float p=0.3; //输出层的阈值
float r=0.2; //步长
int n=0; //记录训练次数
float f(float u)
{
return 1/(1+exp(-u));
}
////////////////////////////////////////////////////////////////////////////
float stdo(float t)
{
return 0.4*sin(2*PI*t)+0.5;
}
//////////////////////////////////////////////////////////////////////////
float test(float t)
{
float a[N];
float r=0;
for(int i = 0;i < M;i++)
a[i] = f(w1[i]*t-q[i]);
for(int i=0;i< M;i++)
r+=w2[i]*a[i];
r=f(r-p);
return r;
}
///////////////////////////////////////////////////////////////////////////
//赋值函数
void fuzhi(void)
{
int k;
for(k=0;k<N;k++) x[k]=(float)k/20; // 输入值
for(k=0;k<N;k++) {
t[k]=0.4*sin(2*PI*x[k])+0.5; //计算教师的值
cout<<"x["<<k<<"]"<<"的期望输出是:"<<t[k]<<endl; }
}
////////////////////////////////////////////////////////////
//计算隐单元输出,输出单元
void jisuan(void)
{
int i,j;
static float a[N]; //存放中间结果
for( i=0;i< M;i++)
for( j=0;j< N;j++)
h[i][j]=f(w1[i]*x[j]-q[i]); //计算隐单元输出
for(j=0;j< N;j++)
{
a[j]=0; //注意初值
for(i=0;i< M;i++)
a[j]+=w2[i]*h[i][j];
y[j]=f(a[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)
{
float c,d; //临时变量
int i,j;
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;
d=0;
for(j=0;j< N;j++) {
c+=b1[i][j]*x[j];
d+=b1[i][j]*(-1);
}
w1[i]+=r*c;
q[i]+=r*d;
}
}
////////////////////////////////////////////////////////////
//计算输出的总误差
float shuchu(void)
{
float E=0;
for(int j=0;j< N;j++) E+=(t[j]-y[j])*(t[j]-y[j]);
return E;
}
///////////////////////////////////////////////////////////
//主函数
int main()
{
char s;
float r;
float Ez;
fuzhi();
do{
++n;
jisuan();
wucha();
xiugai();
Ez=shuchu();
} while(Ez/2>0.001);
for(int j=0;j< N;j++) cout<<"y["<<j<<"]为:"<<y[j]<<"对应的标准输出为"<<t[j]<<endl;
while(1)
{
cout<<"是否继续测试?(Y/N):";
cin>>s;
if(s=='n'||s=='N') break;
cout<<"请输入任意的x:"<<endl;
cin>>r;
cout<<r<<"对应的标准结果为:"<<stdo(r)<<endl;
cout<<r<<"BP网络计算结果为:"<<test(r)<<endl;
}
cin>>s;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -