BP网络模型的实现(C#)
来源:互联网 发布:什么是淘宝微淘广播 编辑:程序博客网 时间:2024/05/02 00:58
最近几天又学了C#,是一次比较系统的接触面向对象,现在对他的理解还不是很深入.
所以神经网络模型这几天没怎么看,所以今天就C#来实现一下BP网络模型,一举两得.一些东西看起来挺简单的,但最后实现起来还不是那么简单.特别是C#,因为是第一次接触,所以一些语法性的东西经常用着用着就混淆起来了.不过总的来说还可以.总算是把一个网络模型给实现了.因为对面向对象的思想的理解还有待提高,所以这次只用到了封装,函数重载.这两个,继承等一些重要的东西都还没怎么看.所以这个程序可以修改的地方肯定是比较多的.完全可以把他做得更好.
话说回来,我实现这个网络模型的最大的目的还是要理解它,因为到时候我做毕业论文时,可能不需要我自己去建立一个网络,MATLAB中有现成的东西。我更需要从理论上去理解他.
using System;
namespace ANN
{
class Ann
{
public int[,] W;//输出层权矩
public int[,] V;//输入层权矩阵
public double ebs = 0.0;//初始化精度控制参数
public double alpha = 0.0;//学习率
public double E = 0.0;//循环控制参数
public int M = 0;//循环最大次数
public int N = 0;//循环次数控制参数
public static int s1 = 0;
public static int s2 = 0;
public static int S1 = 0;
public static int S2 = 0;
public double[] Y;//样本期望输出
public void rnd(int[,] temp)
{
int i = 0,j = 0;
string I1,I2;
start:
try
{
Console.WriteLine("Please input I:");
I1 = Console.ReadLine();
s1 = Convert.ToInt32( I1 );
Console.WriteLine("Please input J");
I2 = Console.ReadLine();
s2 = Convert.ToInt32( I2 );
}
catch(System.FormatException e)
{
Console.WriteLine("{0} Exception caught.", e);
goto start;
}
System.Random w = new Random();
for(i = 0;i < s1;i++)
{
for(j = 0;j < s2;j++)
{
temp[i,j] = w.Next(1,11);
}
}
}
public void Init()
{
int i = 0;
int num1 = 100,num2 = 100;
int [,] temp = new int[num1,num2];
string T1;
string[] TE = new String[s2];
rnd( temp );
S1 = s1;
S2 = s2;
W = temp;
for(i = 0;i < s1;i++)
for(int j = 0; j < s2;j++)
Console.Write("{0} ",W[i,j]);
Console.Write("/n");
rnd( temp );
V = temp;
for(i = 0;i < s1;i++)
for(int j = 0; j < s2;j++)
Console.Write("{0} ",V[i,j]);
Console.Write("/n");
Console.WriteLine("Please input ebs:");
T1 = Console.ReadLine();
ebs = Convert.ToDouble( T1 );
Console.WriteLine("Please input alpha:");
T1 = Console.ReadLine();
alpha = Convert.ToDouble( T1 );
Console.WriteLine("Please input Maxtime:");
T1 = Console.ReadLine();
M = Convert.ToInt32( T1 );
E = ebs + 1;
Console.WriteLine("Please input Y");
for(i = 0;i < S2;i++)
TE[i] = Console.ReadLine();
for(i = 0;i < S2;i++)
Y[i] = Convert.ToDouble(TE[i]);
}
public void Mlt(out int[] X,out double[] s)
{
int i = 0,j = 0;
string[] tp;
s = new double[s2];
X = new int[s1];
tp = new String[s1];
Console.WriteLine("Please input X:");
for(i = 0;i < s1;i++)
tp[i] = Console.ReadLine();
for(i = 0;i < s1;i++)
X[i] = Convert.ToInt32( tp[i] );
for(j = 0;j < s2;j++)
for(i = 0;i < s1;i++)
s[j] = s[j] + X[i]*V[i,j];
}
public void fun1(double[] net,out double[] O)
{
O = new double[net.Length];
for(int i = 0; i < net.Length;i++)
O[i] = (1 + 10*net[i]);
}
public void Mlt(double[] O,out double[] S)
{
int i = 0,j = 0;
S = new double[S2];
for(j = 0;j < S2;j++)
for(i = 0;i < S1;i++)
S[j] = S[j] + O[i]*W[i,j];
}
public void CauOut(double[] O2,out double[] delta0)//计算输出层的权修改量以及输出误差E
{
delta0 = new double[S2];
for(int i = 0;i < S2;i++)
{
delta0[i] = (1 - O2[i]) * (Y[i] - O2[i]);
}
for(int i = 0;i < S2;i++)
{
E = E + (Y[i] - O2[i])*(Y[i] - O2[i]);
}
}
public void CauHide(out double[] deltah)//计算隐藏层权修改量
{
double Z = 0.0;
deltah = new double[S1];
for(int i = 0;i < S1;i++)
{
Z = 0.0;
for(int j = 0;j < S2;j++)
{
Z = Z + W[i,j]*deltah[j];
}
deltah[i] = Z;
}
}
public void RevisionOut(double[] delta0,double[] O1)//修改输出层权矩阵
{
for(int k = 0;k < S1;k++)
{
for(int i = 0;i < S2;i++)
W[k,i] = W[k,i] + (int)(alpha * O1[k] * delta0[i]);
}
}
public void RevisionHide(double[] deltah,double[] O1)//修改隐藏层权矩阵
{
for(int k = 0;k < s1;k++)
{
for(int i = 0;i < s2;i++)
{
V[k,i] = V[k,i] + (int)(alpha * O1[k] * deltah[i]);
}
}
}
}
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
int[] X;
double[] net1;
double[] O1,O2;
double[] net2;
double[] delta0,deltah;
Ann ann = new Ann();
ann.Init();
/*Console.WriteLine("O1 =");
for(int i = 0;i < O1.Length;i++)
Console.Write("{0} ",O1[i]);
Console.Write("/n");
Console.WriteLine("O2 =");
for(int i = 0;i < O2.Length;i++)
Console.Write("{0} ",O2[i]);
Console.Write("/n");*/
while (ann.E > ann.ebs && ann.N < ann.M)
{
ann.N = ann.N + 1;
ann.E = 0;
ann.Mlt(out X,out net1);
ann.fun1(net1,out O1);
ann.Mlt(O1,out net2);
ann.fun1(net2,out O2);
ann.CauOut(O2,out delta0);
ann.CauHide(out deltah);
ann.RevisionOut(delta0,O1);
ann.RevisionHide(deltah,O1);
}
}
}
}
- BP网络模型的实现(C#)
- 简单的bp网络模型
- bp网络实现预测
- BP网络的设计
- BP网络之C#实现
- BP网络之C#实现
- 具有模糊字母识别能力的bp网络实现
- 基于Levenberg-Marquardt训练算法的BP网络Python实现
- 基于Levenberg-Marquardt训练算法的BP网络Python实现
- 基于Levenberg-Marquardt训练算法的BP网络Python实现
- 基于Levenberg-Marquardt训练算法的BP网络Python实现
- BP神经网络的预测模型
- bp神经网络c语言实现
- BP神经网络-- C语言实现
- BP神经网络C代码实现
- BP神经网络-- C语言实现
- 【C++】神经网络BP算法实现
- BP神经网络的实现
- 让leeon不再眷念马桶——书评《精通正则表达式》
- C++ 数据类型的转换
- 英文哲理短文《苹果树》
- Asp.net Ajax 中文乱码错误
- pageload重复执行的问题
- BP网络模型的实现(C#)
- (转)Javascript中最常用的55个经典技巧
- 下载
- c#调用dll
- 几个月的总结
- StreamWriter StreamReader
- keytool - 密钥和证书管理工具
- 基于VS2003/VS2005的Office插件开发
- 将Sql Server对象的当前拥有者更改成目标拥有者