?? 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 + -