虽然跨年,但有没有专业人士帮我看一下误差逆向传播(BP)算法,自己写的和什么一样
#include<bits/stdc++.h>
using namespace std;
#define SIZE 1001//最大存储值
int n,ac[SIZE][SIZE],cc[SIZE][SIZE];
double w[SIZE][SIZE],v[SIZE][SIZE],x[SIZE],b[SIZE],y[SIZE],o[SIZE],r[SIZE],g[SIZE],e[SIZE];
int l,q,d;
double nq=0.01;
// 激活函数
double sigmoid(double x){
return 1.0/(1.0+exp(-x));
}
//训练方案:基础BP
int main(){
cin>>n;
srand(time(0));
//配置
d=2;//输入单元数量
q=5;//隐层数量
l=1;//输出单元数量
//输入测试数据
for(int i=0;i<n;i++){
for(int j=0;j<d;j++) cin>>ac[i][j];//输入学习样本
for(int j=0;j<l;j++) cin>>cc[i][j];//输出学习样本
}
//随机初始化
for(int i=0;i<q;i++) r[i]=((double)rand()/RAND_MAX)*2-1;
for(int i=0;i<l;i++) o[i]=((double)rand()/RAND_MAX)*2-1;
for(int i=0;i<q;i++) for(int j=0;j<l;j++) w[i][j]=w[j][i]=((double)rand()/RAND_MAX)*2-1;
for(int i=0;i<q;i++) for(int j=0;j<d;j++) v[i][j]=v[j][i]=((double)rand()/RAND_MAX)*2-1;
//DB训练
for(int i=0,j=0;j<5000;i++,j++,i%=n){
//尝试预测
for(int k=0;k<d;k++) x[k]=ac[i][k];
for(int k=0;k<q;k++){
b[k]=0;
for(int u=0;u<d;u++) b[k]+=v[k][u]*x[u];
b[k]+=r[k];
b[k]=sigmoid(b[k]);
}
for(int k=0;k<l;k++){
y[k]=0;
for(int u=0;u<q;u++) y[k]+=w[k][u]*b[u];
y[k]+=o[k];
y[k]=sigmoid(y[k]);
}
//根据尝试预测结果和实际结果的均方误差进行训练
for(int k=0;k<l;k++) g[k]=y[k]*(1-y[k])*(cc[i][k]-y[k]);
for(int k=0;k<q;k++){
e[k]=0;
for(int u=0;u<l;u++) e[k]+=w[k][u]*g[u];
e[k]=b[k]*(1-b[k])*e[k];
}
for(int k=0;k<q;k++) for(int u=0;u<l;u++) w[k][u]=w[k][u]+nq*g[u]*b[k];
for(int k=0;k<l;k++) o[k]=o[k]-nq*g[k];
for(int k=0;k<q;k++) for(int u=0;u<d;u++) v[k][u]=v[k][u]+nq*e[u]*x[k];
for(int k=0;k<q;k++) r[k]=r[k]-nq*e[k];
}
cout<<"训练完成\n";
cin>>n;//测试组数
for(int i=0;i<n;i++){
//输入输入数据
for(int j=0;j<d;j++) cin>>ac[i][j];
for(int k=0;k<d;k++) x[k]=ac[i][k];
//预测
for(int k=0;k<q;k++){
b[k]=0;
for(int u=0;u<d;u++) b[k]+=v[k][u]*x[u];
b[k]+=r[k];
b[k]=sigmoid(b[k]);
}
for(int k=0;k<l;k++){
y[k]=0;
for(int u=0;u<q;u++) y[k]+=w[k][u]*b[u];
y[k]+=o[k];
y[k]=sigmoid(y[k]);
}
for(int k=0;k<l;k++) cout<<y[k]<<" ";//预测结果
cout<<"\n";
}
}