爱吧机器人网 » 技术 > 神经网络 > 正文

改进的BP神经网络算法(C语言源码)

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"
/*********************************************
inpoints 为输入神经元个数,可改变
outpoints为输出神经元个数
defaultpoints为隐层神经元个数
datagrough为样本数据个数
**********************************************

******以下数据定义可以修改*****/
#define A 0
#define a 1
#define b 1
#define c 1
#define ALFA 0.85
#define BETA 0.2 //学习率0~1
#define Total 20000
#define inpoints 9
#define outpoints 5
#define defaultpoints 28
#define datagrough 44
#define forecastdata 4

/**********定义所需变量********/
double InpointData[datagrough][inpoints],OutpointData[datagrough][outpoints]; /* 输入输出数据 */
double InpointData_MAX[inpoints],InpointData_MIN[inpoints]; /* 每个因素最 大数据 */
double OutpointData_MAX[outpoints],OutpointData_MIN[outpoints]; /* 每个因素最小数据 */
double w[defaultpoints][inpoints],limen[defaultpoints],v[outpoints][defaultpoints]; /* 连接权值、阈值 */
double dlta_w[defaultpoints][inpoints],dlta_limen[defaultpoints],dlta_v[outpoints][defaultpoints]; /* 连接权、阈值修正值 */
double defaultOutpoint[defaultpoints],Outpoint_dp[outpoints],Outpoint_ep[datagrough];
/**************************读数据文件******************************/
void ReadData()
{
FILE *fp1,*fp2;
int i,j;
if((fp1=fopen("D:\data\训练输入.txt","r"))==NULL)
{
printf("1can not open the filen");
exit(0);
}
for(i=0;i<datagrough;i++)
for(j=0;j<inpoints;j++)
fscanf(fp1,"%lf",&InpointData[i][j]);
fclose(fp1);

if((fp2=fopen("D:\data\训练输出.txt","r"))==NULL)
{
printf("2can not open the filen");
exit(0);
}
for(i=0;i<datagrough;i++)
for(j=0;j<outpoints;j++)
fscanf(fp2,"%lf",&OutpointData[i][j]);
fclose(fp2);
}
/*****************************************************/

/*****************************************归一化******************************************************/
void unitary()
{
int i,j;
int k=0;
for(j=0;j<inpoints;j++) //找出每列的最大、最小值存放在数组InpointData_MAX[j]、InpointData_MIN[j]中
{
InpointData_MAX[j]=InpointData[0][j];
InpointData_MIN[j]=InpointData[0][j];
for(i=0;i<datagrough;i++)
if(InpointData_MAX[j]<InpointData[i][j])
InpointData_MAX[j]=InpointData[i][j];
else if(InpointData_MIN[j]>InpointData[i][j])
InpointData_MIN[j]=InpointData[i][j];
}

for(j=0;j<outpoints;j++) //找出每列的最大、最小值存放在数组OutpointData_MAX[j]、OutpointData_MIN[j]中
{
OutpointData_MAX[j]=OutpointData[0][j];
OutpointData_MIN[j]=OutpointData[0][j];
for(i=0;i<datagrough;i++)
if(OutpointData_MAX[j]<OutpointData[i][j])
OutpointData_MAX[j]=OutpointData[i][j];
else if(OutpointData_MIN[j]>OutpointData[i][j])
OutpointData_MIN[j]=OutpointData[i][j];
}
/***************将数据归一处理,处理之后的数据全部在[0,1]之间*************************/
for(j=0;j<inpoints;j++)
for(i=0;i<datagrough;i++)
if(InpointData_MAX[j]==0)
InpointData[i][j]=0;
else
InpointData[i][j]=(InpointData[i][j]-InpointData_MIN[j]+A)/(InpointData_MAX[j]-InpointData_MIN[j]+A);

for(j=0;j<outpoints;j++)
for(i=0;i<datagrough;i++)
if(OutpointData_MAX[j]==0)
OutpointData[i][j]=0;
else
OutpointData[i][j]=(OutpointData[i][j]-OutpointData_MIN[j]+A)/(OutpointData_MAX[j]-OutpointData_MIN[j]+A);

}
/*****************************************************/

/*********************初始化,随机赋初值**************************/
void Initialization()
{
int i,j;
srand((unsigned)time(NULL)); //头文件名 #include <time.h>

for(i=0;i<defaultpoints;i++) //给输入层到隐层的连接权赋随机值LianJie_w[i][j],这些值在[0,1]
for(j=0;j<inpoints;j++)
{
w[i][j]=(rand()*2.0/RAND_MAX-1)/2;
dlta_w[i][j]=0;
}

for(i=0;i<defaultpoints;i++)
{
limen[i]=(rand()*2.0/RAND_MAX-1)/2;
dlta_limen[i]=0;
}

for(i=0;i<outpoints;i++) //给隐层到输出层的连接权赋初值
for(j=0;j<defaultpoints;j++)
{
v[i][j]=(rand()*2.0/RAND_MAX-1)/2;
dlta_v[i][j]=0;
}
}
/**********************求单样本的计算输出误差*******************************/
void out_sub1(int t)
{
int i,j;
double defaultInpoint[defaultpoints];
double Outpoint_y[outpoints];
Outpoint_ep[t]=0;
for(i=0;i<defaultpoints;i++)
{
double sum=0;
for(j=0;j<inpoints;j++)
sum+=w[i][j]*InpointData[t][j];
defaultInpoint[i]=sum+limen[i];
defaultOutpoint[i]=1/(a+b*exp(-1*c*defaultInpoint[i]));//求O[i]
}

for(j=0;j<outpoints;j++)//求Y[i]
{
Outpoint_y[j]=0;
for(i=0;i<defaultpoints;i++)
Outpoint_y[j]+=v[j][i]*defaultOutpoint[i];
Outpoint_dp[j]=OutpointData[t][j]-Outpoint_y[j];
Outpoint_ep[t]+=Outpoint_dp[j]*Outpoint_dp[j]/2;
}
}
/*****************************反算权值******************************************/
void out_sub2(int t)
{
int i,j,k;
double s;
for(i=0;i<defaultpoints;i++)
{
s=0;
for(j=0;j<outpoints;j++)
{
dlta_v[j][i]=ALFA*dlta_v[j][i]+BETA*Outpoint_dp[j]*defaultOutpoint[i]; //
s+=v[j][i]*Outpoint_dp[j];
v[j][i]+=dlta_v[j][i];
}
dlta_limen[i]=ALFA*dlta_limen[i]+BETA*defaultOutpoint[i]*(1-defaultOutpoint[i])*s;//
limen[i]+=dlta_limen[i];
for(k=0;k<inpoints;k++)
{
dlta_w[i][k]=ALFA*dlta_w[i][k]+BETA*defaultOutpoint[i]*(1-defaultOutpoint[i])*s*InpointData[t][k];//
w[i][k]=w[i][k]+dlta_w[i][k];
}
}
}
/*******************************************************/
void forecast()
{
int i,j,t,k=0;
double e,e1[forecastdata]={0}; //训练误差
double sss;
double InputData_x[forecastdata][inpoints],tp[forecastdata][outpoints];
double defInpoint,defOutpoint[defaultpoints],y[forecastdata][outpoints];//y[forecastdata][outpoints]为网络检验输出
FILE *fp1,*fp3;
if((fp1=fopen("D:\data\预测输入.txt","r"))==NULL) //检验数据输入
{
printf("3can not open the filen");
exit(0);
}
for(i=0;i<forecastdata;i++)
for(j=0;j<inpoints;j++)
fscanf(fp1,"%lf",&InputData_x[i][j]);
fclose(fp1);

if((fp3=fopen("D:\data\预测输出.txt","r"))==NULL) //实际检验结果输出
{
printf("31can not open the filen");
exit(0);
}
for(i=0;i<forecastdata;i++)
for(j=0;j<outpoints;j++)
fscanf(fp3,"%lf",&tp[i][j]);
fclose(fp3);

for(j=0;j<inpoints;j++) // 检验数据归一化
for(i=0;i<forecastdata;i++)
if(InpointData_MAX[j]==0)
InputData_x[i][j]=0;
else
InputData_x[i][j]=(InputData_x[i][j]-InpointData_MIN[j]+A)/(InpointData_MAX[j]-InpointData_MIN[j]+A);

for(j=0;j<outpoints;j++)
for(i=0;i<forecastdata;i++)
if(OutpointData_MAX[j]==0)
tp[i][j]=0;
else
tp[i][j]=(tp[i][j]-OutpointData_MIN[j]+A)/(OutpointData_MAX[j]-OutpointData_MIN[j]+A);

do
{
Initialization(); //初始化连接权值w[i][j],limen[i],v[k][i]
k=0;
do
{
e=0;
for(t=0;t<datagrough;t++)
{
out_sub1(t); //正向计算网络输出
out_sub2(t); //反向计算,修正权值
e+=Outpoint_ep[t]; //计算输出误差
}
k++;
}while((k<Total)&&(e>0.1));
sss=0; //中间参数
for(t=0;t<forecastdata;t++)
{
e1[t]=0;
for(i=0;i<defaultpoints;i++)
{
double sum=0;
for(j=0;j<inpoints;j++)
sum+=w[i][j]*InputData_x[t][j];
defInpoint=sum+limen[i];
defOutpoint[i]=1/(a+b*exp(-1*c*defInpoint));
}
for(j=0;j<outpoints;j++)
{
y[t][j]=0;
for(i=0;i<defaultpoints;i++)
y[t][j]+=v[j][i]*defOutpoint[i];
e1[t]+=(y[t][j]-tp[t][j])*(y[t][j]-tp[t][j])/2;
y[t][j]=y[t][j]*(OutpointData_MAX[j]-OutpointData_MIN[j]+A)+OutpointData_MIN[j]-A;
}
sss+=e1[t];
}
sss=sss/forecastdata;
printf(" %lf %lfn",e,sss);
}while(sss>0.12);
}
/********************************************************/


void main()
{
int i,j,k;
FILE *fp2;
ReadData(); //读训练数据:输入和输出
unitary(); //归一化,将输入输出数据归一,结果在[0,1]中
forecast(); //检验误差
if((fp2=fopen("D:\data\计算权值.txt","w"))==NULL) //文件输出训练好的权值
{
printf("6can not open the filen");
exit(0);
}
for(i=0;i<defaultpoints;i++)
{
for(k=0;k<inpoints;k++)
fprintf(fp2," %lf ",w[i][k]);
fprintf(fp2,"n");
}
fprintf(fp2,"n");
for(i=0;i<defaultpoints;i++)
fprintf(fp2," %lf ",limen[i]);
fprintf(fp2,"nn");
for(i=0;i<defaultpoints;i++)
{
for(j=0;j<outpoints;j++)
fprintf(fp2," %lf ",v[j][i]);
fprintf(fp2,"n");
}
fclose(fp2);

}


上一篇:人工神经网络matlab源程序代码
下一篇:BP人工神经网络改进算法C语言
精选推荐
改变保险市场的格局:无人机如何通过更快的估算、响应时间和利益交付来使消费者受益
改变保险市场的格局:无人机如何通过更快的估算、响应时间和利益交付来

[2018-12-08]  市场研究公司IHS Markit预测,到2020年,专业无人机市场将通过农业,能源和建筑等行业利用测量,制图,规划等技术实现77 1%的复合年增长率(CAGR)。与此同时,消费者无人......

研究人员融合人类与AI的创造力 显著提高了深度学习的表现
研究人员融合人类与AI的创造力 显著提高了深度学习的表现

[2019-10-12]  由加拿大人工智能领域研究主席、滑铁卢大学系统设计工程教授Alexander Wong领导的一个团队开发了一种新型紧凑型神经网络家族,可以在智能 ...

人工智能民主化能否实现取决于科技巨头
人工智能民主化能否实现取决于科技巨头

[2017-12-29]  我们经常听到像谷歌和微软这样的公司说他们希望人工智能民主化。这是一个很好的词,民主化。 但这些公司如何界定“民主化”还不清楚,像AI本身一样,它似乎有点炒作的味道...

智能农业:种地的事儿未来全交给这些机器人吧
智能农业:种地的事儿未来全交给这些机器人吧

[2019-12-07]  SRC公司创始人Sam与温波尔庄园农场经理Callum Weir以及监控机器人Tom总部位于英国的农业科技初创公司SRC(Small Robot Company),正在 ...

人工智能准确预测患者一年内的死亡风险,原理却无法解释
人工智能准确预测患者一年内的死亡风险,原理却无法解释

[2019-11-13]  图片来自BURGER PHANIE SCIENCE PHOTO LIBRARY美国最新研究显示,人工智能通过查看心脏测试结果,以高达85%以上的准确率预测了一个人在一 ...

深度神经网络揭示了大脑喜欢看什么
深度神经网络揭示了大脑喜欢看什么

[2019-11-06]  爱吧机器人网编者按:近日,《自然-神经科学》发表了一篇论文,研究人员创建了一种深度人工神经网络,能够准确预测生物大脑对视觉刺激所产 ...

美国人工智能公司Skymind进入福建全面开展业务
美国人工智能公司Skymind进入福建全面开展业务

[2017-12-11]  人工智能在当今这个时代对大家来说想必是非常熟悉的,这也是我国近十几年来一直追求的目标,未来的时间里这也将是全人类追求的目标。就目前来看,近年来,人工智能或在我国迎......

科学家从蟑螂获得启发 教机器人更好地走路
科学家从蟑螂获得启发 教机器人更好地走路

[2017-12-11]  Weihmann指出:“我特别感到惊讶的是,动物运动稳定机制的变化与腿部协调的变化是一致的。昆虫的慢运行非常稳定,因为它的重心很低,三条腿总是以协调的方式运动。...

本周栏目热点

飞桨火力全开,重磅上线3D模型:PointNet++、PointRCNN!

[2020-03-26]  11 年前的「阿凡达」让少年的我们第一次戴上 3D 眼镜,声势浩大的瀑布奔流而下,星罗棋布飘浮在空中的群山,无一不体现着对生命的敬意, ...

从基础概念到数学公式,这是一份520页的机器学习笔记(图文并茂)

[2018-06-19]  近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 520 页的学习教程(英文版),详细、明了地介绍了机器学习中的相关概念、数学知识和各......

50行代码玩转生成对抗网络GAN模型!(附源码)

[2018-07-30]  本文为大家介绍了生成对抗网络(Generate Adversarial Network,GAN),以最直白的语言来讲解它,最后实现一个简单的 GAN 程序来帮助大家加深理解。...

神经网络和模糊逻辑的工作流

[2016-11-20]   行业观察 神经网络 和模糊逻辑的工作流 null 来源:神州数码erp 发布时间: 2009-10-14 9:06:01 关键词: 工作流,协同,B2B,OA  以下 ...

深度神经网络揭示了大脑喜欢看什么

[2019-11-06]  爱吧机器人网编者按:近日,《自然-神经科学》发表了一篇论文,研究人员创建了一种深度人工神经网络,能够准确预测生物大脑对视觉刺激所产 ...