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

📄 test.cpp

📁 人工只能的重要分之之一就是神经网络
💻 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 + -