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();
}


相关文章推荐

C# BP神经网络 类与实例(二) 完善版

在>这篇文章中,笔者转载了网友提供的一个类。非常感谢这位网友的无私奉献,使笔者得以快速的完成了软件的一个功能。貌似我找到的是网友对原作改动过的版本,使得该类存在着一些不足,笔者对其进行了相应改进。1....

神经网络和深度学习(二)——BP(Backpropagation Algorithm, 反向传播算法)

上一周主要看了 Neural Networks and Deep Learning  网上在线课程的第二章的内容 和 斯坦福大学 《机器学习》的公开课,学习了BP( Back Propagat...

cpp-BP神经网络与特征脸实现人脸表情识别(二)-实现人脸识别

我使用的是 yale 大学的人脸库 解压后将文件夹放入项目文件的文件夹中 链接:http://download.csdn.net/detail/mr_w1997/9752209 以下为笑脸的训练与...

Machine Learning第五讲[神经网络: 学习] --(二)实践中的BP算法

内容来自Andrew老师课程Machine Learning的第五章内容的Backpropagation in Practice部分。 一、Implementation Note: Unrolling...

基于BP神经网络的数字识别基础系统(二)

基于BP神经网络的数字识别基础系统(二)(接上篇)上一篇的链接:http://blog.csdn.net/z_x_1996/article/details/55670814上一篇提出的两个问题即 训练...

[转]考拉BP神经网络的matlab实现学习历程(二)

本节主要学习BP中几个容易混绕的概念和问题:什么是网络的泛化能力?过拟合是什么,怎么处理?学习速率有什么作用?神经网络的权值和阈值分别是个什么概念?用BP逼近非线性函数,如何提高训练精度?什么是网络的...

神经网络BP网络的练习参考

  • 2010年09月13日 20:56
  • 61KB
  • 下载

卷积神经网络(二):卷积神经网络CNN的BP算法

卷积神经网络CNN的BP算法

卷积神经网络(二):卷积神经网络CNN的BP算法

该文档参考了:http://www.cnblogs.com/tornadomeet/p/3468450.html 在此表示感谢。 一般而言,多类别神经网络的输出一般采用softmax形式,...

神经网络与深度学习(二)cpp-c++BP神经网络

读到作者用JAVA实现的神经网络解决异或等问题 以下为c++实现版本 接口略有不同 具体关键的更新的证明详见机器学习或大牛博客 有一个关键的地方是 权值的初始化 原本是都初始化0 但是楼主也意识到 这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BP网络练习(二)
举报原因:
原因补充:

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