BP网络练习(二)

原创 2012年03月25日 23:07:22

上次用MATLAB做的,这次尝试用C写了下,有待改进!

#include <stdio.h>
#include <math.h>
double daoshu(double p)//求导数函数
{
	double d;
	d = 1/p;
	return d;
}
int main(int argc,char argv[])
{
	int n;
	double P[10] = {4,11,23,34,47,58,62,71,89,97},D[10],OUT[10];//10个样本
	for(n=0;n<10;n++)//目标结果:D=1/P
	{
		D[n] = daoshu(P[n]);
	}
	double w11 = 1,w12 = 1,w13 = 1,w21 = 1,w22 = 1,w23 = 1;//初始权值
	double v11,v12,v13,v2,y1,y2,y3,O;//加权和v,各层输出y,O
	int T = 0, epoch = 0;//周期T,输入样本次数epoch
	double E = 0,Ee = 0,e = 0;//平均方差E,方差e
	double Eta = 0.5,Delta11,Delta12,Delta13,Delta2;//步长Eta,梯度Delta
	while(epoch==0||(0.5*0.1*Ee>0.00001&&T<200))//开始训练;误差较大继续训练,周期较少继续训练
	{
		Ee = 0;//误差和归零
		for(n=0;n<10;n++)
		{
			//隐层加权求和
			v11 = w11*P[n];  
			v12 = w12*P[n];
			v13 = w13*P[n];
			//隐层输出
			y1 = 1/(exp(-v11)+1);
			y2 = 1/(exp(-v12)+1);
			y3 = 1/(exp(-v13)+1);
			//输出层加权求和
			v2 = w21*y1+w22*y2+w23*y3;
			//输出层输出
			O = 1/(exp(-v2)+1);
			//输出层误差
			e = D[n]-O;
			//样本方差累计
			Ee = Ee+0.5*pow(e,2);
			//输出层梯度
			Delta2 = e*O*(1-O);
			//输出层权值更新
			w21 = w21+Eta*Delta2*y1;
			w22 = w22+Eta*Delta2*y2;
			w23 = w23+Eta*Delta2*y3;
			//隐层梯度
			Delta11 = y1*(1-y1)*(Delta2*(w21+w22+w23));
			Delta12 = y2*(1-y2)*(Delta2*(w21+w22+w23));
			Delta13 = y3*(1-y3)*(Delta2*(w21+w22+w23));
			//隐层权值更新
			w11 = w11+Eta*Delta11*P[n];
			w12 = w12+Eta*Delta12*P[n];
			w13 = w13+Eta*Delta13*P[n];
			//样本输入数加一
			epoch++;
		}
		//周期数加一
		T++;
		//平均方差
		E = 0.5*0.1*Ee;
		if(T<200)
		printf("T = %d;E = %f\n",T,E);
	}
	//输出训练结果
	printf("E = %e\n epoch = %d  T = %d\n w11 = %f  w12 = %f  w13 = %f  w21 = %f  w22 = %f  w23 = %f\n\n",E,epoch,T,w11,w12,w13,w21,w22,w23);
	//仿真样本
	double Q[10] = {5,10,20,30,40,50,60,70,80,90};
	for(n=0;n<10;n++)
	{
		D[n] = daoshu(Q[n]);
	}
	printf("Q: ");
	for(n=0;n<10;n++)
	{
		printf("%f ",Q[n]);
	}
	printf("\n\n");
	//目标结果
	printf("D: ");
	for(n=0;n<10;n++)
	{
		printf("%f ",D[n]);
	}
	printf("\n\n");
	//仿真
	for(n=0;n<10;n++)
		{
			v11 = w11*P[n];  
			v12 = w12*P[n];
			y1 = 1/(exp(-v11)+1);
			y2 = 1/(exp(-v12)+1);
			v2 = w21*y1+w22*y2;
			OUT[n] = 1/(exp(-v2)+1);
		}
	//仿真结果
	printf("O: ");
	for(n=0;n<10;n++)
	{
		printf("%f ",OUT[n]);
	}
	printf("\n");
	getchar();
}


BP算法及例子

用如下图1的神经网络结构(正向神经网络结构为2-4-4-2-1 )去逼近函数: f(x1,x2) = (x1-1)^4 + 2×x2^2。 1)网络各神经元的激发函数为:s函数——F(x)...
  • wanglp094
  • wanglp094
  • 2012年07月01日 00:00
  • 4318

BP网络练习

利用BP算法及Sigmoid函数,研究函数的逼近问题: f(x)=1/x,  1 BP神经网络: clc;close all;clear; N = 7; P = rand(1,N); P =...
  • nevermoredanny
  • nevermoredanny
  • 2012年03月21日 23:55
  • 1706

deep learning 深度网络和BP反馈

Abstract:近两年,DeepLearning(DL)Deep\,Learning(DL)在国内逐渐活跃起来。DeepLearningDeep\,Learning主要应用于图像识别,目标检测等图像...
  • hlx371240
  • hlx371240
  • 2015年03月26日 17:16
  • 2008

通俗的例子去理解BP网络

最近因为论文需要,研究了下神经网络,重点看了BP网络。 学习过程中,我不得不感叹造物主的神奇和人类智慧的魅力,同时我也产生了一些想法想写出来跟大家交流。 大家在刚开始学习神经网络的时候可能会比较难...
  • u014557232
  • u014557232
  • 2015年12月20日 17:59
  • 777

BP网络的MATLAB仿真一般设置

P=[-1 -1 2 2;0 5 0 5]; t=[-1 -1 1 1]; net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingd'); ...
  • lily0806
  • lily0806
  • 2016年04月05日 11:04
  • 605

BP网络之C#实现

 using System;using System.IO;using System.Text;namespace BpANNet{  ///   /// BpNet 的摘要说明。  ///   pu...
  • qw_study
  • qw_study
  • 2007年02月07日 11:59
  • 3781

遗传算法加BP网络的一点感悟

这几天看机器学习中的神经网络,大神NG展示的
  • qinhl060343
  • qinhl060343
  • 2014年08月08日 11:50
  • 1356

BP神经网络推导过程详解

http://www.cnblogs.com/biaoyu/archive/2015/06/20/4591304.html BP神经网络推导过程详解       BP算法是...
  • a14206149
  • a14206149
  • 2016年03月02日 16:32
  • 1846

神经网络实现手写数字识别(MNIST)

一、缘起原本想沿着 传统递归算法实现迷宫游戏 ——> 遗传算法实现迷宫游戏 ——> 神经网络实现迷宫游戏的思路,在本篇当中也写如何使用神经网络实现迷宫的,但是研究了一下, 感觉有些麻烦不太好弄,所以就...
  • xuanwolanxue
  • xuanwolanxue
  • 2017年05月10日 18:20
  • 3307

神经网络学习 之 BP神经网络

上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,还不足以模拟人脑神经系统的功能。由这些人工神经元构建出来的网络,才能够具有学习、联想、记忆和模式识别的能力。BP网络就是一种简单的人工神经...
  • u013007900
  • u013007900
  • 2015年11月30日 21:17
  • 27811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BP网络练习(二)
举报原因:
原因补充:

(最多只允许输入30个字)