打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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);
   }
  }
 }
}
 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
三个数最大数
ASP.NET MVC 4.0 学习1-C#基础语法
C#基础知识整理:C#类和结构(1)
C#Static类和Static构造函数
静态类和静态类成员 (C#)
V6.21抽象类封装计算方法实现面向对象计算器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服