BP网络模型的实现(C#)

最近几天又学了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);
   }
  }
 }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值