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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度账号提示异常风险怎么办 刷xp框架卡米怎么办 全民k歌歌曲下架怎么办 全民k歌伴奏下架怎么办 苹果手机图片的图标打不开怎么办 电脑页面加载不出来怎么办 电脑主页面加载不出来怎么办 桌面图标不见了怎么办右键无反应 手机一直闪退该怎么办 点击华为设置闪退怎么办 小白摄像头获取视频文件失败怎么办 为什么解压文件老提示失败怎么办 b站sd卡写入失败怎么办 手机检测不到sd卡怎么办 华为sd卡不可用怎么办 u盘延缓写入失败怎么办 手机提示sd卡不可用怎么办 显示sd卡不可用怎么办 小米手机检测不到sd卡怎么办 小米手机sd卡写入失败怎么办 没有检测到sd卡怎么办 e站图片配额用尽怎么办 内存卡密码忘了怎么办 电脑上酷狗音乐播放失败怎么办 播放失败不支持该文件怎么办 手机山寨云资源失效怎么办 支付密码输错了怎么办 微信密码锁定了怎么办 电脑网易云音乐闪退怎么办 逆战耳机电流声怎么办 肠道感染一直吃药治不好怎么办 如果24小时以后还没到账该怎么办 在游戏平台充值没到账该怎么办 充值豪华黄钻没到账该怎么办 起点签到签满了怎么办 ipad锁屏声音小怎么办 扣扣邮箱文件超大了怎么办 网易邮箱图片已过期怎么办 邮箱里面的文件过期了怎么办 邮箱发的文件过期了怎么办 邮箱发送的文件过期怎么办