⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.cpp

📁 B-P算法对函数的拟合程序
💻 CPP
字号:
//B-P算法对函数y=0.4sin(2*PI*x)+0.5的拟合

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <math.h> 
#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));
}
///////////////////////////////////////////////////////////////////////////
//赋值函数
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; //计算教师的值
		//printf("x[%d]=%f,     ",k,x[k] }
	}
}
////////////////////////////////////////////////////////////
//计算隐单元输出,输出单元
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;
}
	///////////////////////////////////////////////////////////
	//主函数
void main()
{
	char s;
	int i;
	float Ez;
	fuzhi();
	Ez=1;
	while(Ez/2>0.01)
	{
		jisuan();
		wucha();
		xiugai();
		Ez=shuchu();
		n++;
	} 
	printf("n=%d,Ez=%f\n",n,Ez);
	for(i=0;i<M;i++)
		printf("w1[%d]=%f,     w2[%d]=%f,    q[%d]=%f,\n",i,w1[i],i,w2[i],i,q[i]);
	printf("p=%f,\n",p);
}
//////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -