#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 file\n");
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 file\n");
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 file\n");
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 file\n");
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 %lf\n",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 file\n");
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,"\n\n");
for(i=0;i<defaultpoints;i++)
{
for(j=0;j<outpoints;j++)
fprintf(fp2," %lf ",v[j][i]);
fprintf(fp2,"\n");
}
fclose(fp2);
}
改进的BP神经网络算法(C语言源码)
来源:互联网 发布日期:2011-12-04 19:24:01 浏览:51908次
导读:BP神经网络算法,C语言编写 用户可以修改输入、输出、隐层神经元, 可以根据网络输出误差调整各网络参数(学习率、动量因子、检验误差、训练误差、学习次数)...
相关内容
AiLab云推荐
最新资讯
- 为开发AI芯片,传特斯拉已要求三星、SK海力士提供HBM4样片
- 英特尔演示资料显示未来将推 AI 芯片 Jaguar Shores
- AI 驱动的芯片设计-AI前沿讲习班(CAAI-AIDL)第十四期活动成功举办
- 台系厂商安霸的智驾芯片风口,终于来了
- 登上Nature的AI芯片设计屡遭质疑,谷歌发文反击,Jeff Dean:质疑者连预训练都没做
- 中国版脑机接口手术来了!比马斯克的更安全
- 从断供中国芯片始,三星或加速衰落,韩国距发展中国家有多远
- 树莓派 Raspberry Pi CM5 计算模块提前曝光,延续上代外形设计
- 超越硅极限:纳米3D晶体管或成AI低功耗未来之钥
- 谷歌安卓 15 QPR2 新增 Linux 终端,可在虚拟机中运行Linux 应用
本月热点
热门排行
-
存储芯片年涨七成不算完:AI需求接棒,大厂持续加注
阅读量:18036
-
美大选逼近!传大陆芯片设计业计划从台积电转单三星
阅读量:13772
-
黄仁勋对话扎克伯格:新款芯片样品本周发送,AI行业还有5年产品创新期
阅读量:12017
-
马斯克:Neuralink 今年预计完成 10 例脑机接口植入手术
阅读量:11857
-
应对先进封装挑战,芯碁微装直写光刻技术助力本土创新突破
阅读量:11516
-
黑芝麻智能登陆港交所:智能汽车AI芯片第一股,拥抱广阔机遇
阅读量:11389
推荐内容
- 2024山东国际玻璃工业技术展览会
- 2024第二十二届中国广州国际汽车展览会
- 2024年阿尔及利亚国际暖通空调制冷展览会ALGERIA
- 2024第12届中国(青岛)国际茶产业博览会(华巨臣茶博会)
- 2024阿尔及利亚国际建材展
- 2024 第二十三届新加坡国际石油及天然气展览会暨研讨会
- 2024年荷兰阿姆斯特丹船舶游艇设备展览会METS TRADE
- 2024第12届巴基斯坦(卡拉奇)国际防务与军警展
- 2024年俄罗斯莫斯科电力、电网技术展览会
- 2024(京津冀)水果产销对接会
- 2024第二十一届北方(烟台)国际果业博览会(北方果博会 NIFIE)
- 2024第十六届中国(上海)振威国际化工装备博览会(CTEF)
- 2024第七届欧洲(德国不来梅)国际空间技术展
- 2024第十七届上海国际电池工业展览会(振威电池展 CNIBF)
- 2024第二十届上海国际充电设施产业展览会(振威充电设施展 evse)
- 2024第十一届浙江义乌国际智能装备博览会
- 2024第89届全国药品交易会(药交会 PHARMCHINA)
- 2024年中国北京国际高端食品饮料博览会
- 2024年中国(北京)国际有机绿色食品展览会
- IADE2024第三届突尼斯(杰尔巴)国际航空航天与防务展
- 2024年土耳其温室农业展土耳其畜牧机械展GrowTech Eurasia
- 2024中国北京名酒节暨世界葡萄酒博览会
- 2024第十三届杭州国际跨境电商交易博览会(跨交会 ICBE)
- 2024中国健康营养博览会(秋季)(NHNE)
- 2024乌兹别克斯坦食品及包装展 UZ PROD &INTER PACK
- 日本第45届国际建筑建材与家居材料展
- 2024中国国际制造业数智化博览会
- 2024第29届深圳国际服装供应链博览会(秋季)(FS展 Fashion Source)暨AW深圳原创设计时装周
- 2024越南(胡志明)轴承展览会
- 2024越南(胡志明)橡胶机械及塑料展览会
- 2024越南(胡志明)五金机械展览会
- 2024秋季中国(广州)国际茶业博览会
- 2024越南(胡志明)电机及线圈展览会
- 2024越南(胡志明)电线电缆展览会
- 2024越南(胡志明)润滑油及应用技术展览会
- 2024越南(胡志明)焊接与切割展览会
- 2024越南(胡志明)电池产品展览会
- 2024中国国际天然提取物和健康食品配料展览会(FIC-健康展2024)暨第23届全国秋季食品添加剂和配料展览会
- 2024厦门国际眼镜业展览会(厦门眼镜展)
- 2024第十八届中国宁波中小工厂展览会
- 2024越南(胡志明市)国际工业技术装备及产品展览会
- 2024深圳国际照明展览会
- 2024越南(胡志明)煤矿技术设备展览会
- 2024第20届越南胡志明国际工业展览会
- 2024第二十二届中国(北京)国际医疗旅游展览会(正和医疗旅游展 CMTF)
- 2024越南(胡志明)金属及冶金展览会
- 2024年越南国际制药装备及医疗器械展览会
- 2024越南国际表面处理及涂料涂装展览会
- 2024越南(胡志明)国际复合材料展览会
- 2024越南(胡志明)工程机械设备展览会
- 2024越南(胡志明)锅炉及压力容器展览会
- 2024越南(胡志明)化工展览会
- 2024越南(胡志明)工业自动化及仪器仪表展览会
- 2024越南(胡志明)机床工具展览会
- 2024越南(胡志明)金属加工及焊接技术展览会
- 2024越南(胡志明)铝工业展览会