求DEBUG机器学习算法
  • 板块灌水区
  • 楼主Quenna
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/31 20:48
  • 上次更新2024/12/31 23:59:51
查看原帖
求DEBUG机器学习算法
697421
Quenna楼主2024/12/31 20:48

虽然跨年,但有没有专业人士帮我看一下误差逆向传播(BP)算法,自己写的和什么一样

输入格式:

  • 样例数目n
  • n行,每行三个数,D个条件,L个答案
  • 测试数目m
  • m行,每行三个数,D个条件

输出格式:

  • m行,每行L个答案,对应m个测试
#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";
	}
}

2024/12/31 20:48
加载中...