单个人工神经元的实现

人工神经元

神经元是构成神经网络的最基础单元

网络结构:

人工神经网络由神经元模型构成,这种由许多神经元组成的信息处理网络具有并行分布结构。

输入数据采用二维数组data[][]存储,输入4组输入数据(0,0) (0,1) (1,0) (1,1)。

计算人工神经元的程序的处理步骤如下:
单个人工神经元对于输入信号计算输出值的计算步骤
( 1 )初始化权重和阈值。
( 2 ) 读入输入数据。
( 3 )对于所有的输入数据进行如下计算。
      ( 3-1 )将输入值和对应的权重相乘后合并。
      ( 3-2 )减去阈值。
      ( 3-3 )利用传递函数来计算输出值。

 运行环境VS2019

  1 /*
  2   单个人工神经元
  3   输入数(2输入)
  4 传递函数的种类(阶梯函数、sigmoid函数)
  5 各个输入所对应的权重Wi;
  6 阈值v
  7 */
  8 /*Visual Studio的互换性保证 */
  9 #define _CRT_SECURE_NO_WARNINGS
 10 
 11 
 12 #include<stdio.h>
 13 #include<stdlib.h>
 14 #include<math.h>
 15 
 16 #define INPUT 2  /*输入数*/ 
 17 #define MAXINPUT 100    /*数据的最大个数*/
 18 
 19 
 20 //初始化权重
 21 void init_weight(double W[])
 22 {
 23     /*给权重和阈值固定的值*/
 24     W[0] = 1;
 25     W[1] = 1;
 26     W[2] = 1.5;//存放阈值
 27 }
 28 
 29 int getdata(double data[][INPUT])
 30 {
 31     int number = 0;
 32     int j = 0;
 33 
 34     printf("请输入数据
");
 35     //数据输入
 36     while (scanf("%lf", &data[number][j]) != EOF)
 37     {
 38         ++j;
 39         if (j >= INPUT)
 40         {/*下一个数据*/
 41             j = 0;
 42             ++number;
 43         }
 44 
 45     }
 46     printf("输入数据完成
");
 47     return number;
 48 }
 49 
 50 
 51 double f(double u)
 52 {
 53     /*阶梯函数的计算*/
 54     if (u >= 0) return 1.0;
 55     else return 0.0;
 56 
 57     /*sigmoid函数的计算*/
 58    // return 1.0/(1.0+exp(-u)) ;
 59 }
 60 
 61 
 62 double forward(double W[INPUT+1], double data[INPUT])
 63 {
 64     int i;/*循环的控制*/
 65     double u, z;/*中间的计算值u和输出值o*/
 66 
 67     /*计算主体*/
 68     u = 0;
 69     for (i = 0; i < INPUT; ++i)
 70         u += data[i] * W[i];
 71     u -= W[i];/*阈值的处理*/
 72     /*输出值的计算*/
 73     z = f(u);
 74     return z;
 75 }
 76 
 77 
 78 
 79 
 80 int main()
 81 {
 82     double W[INPUT + 1];
 83     double data[MAXINPUT][INPUT];  //数据
 84     double z;//输出
 85     int number;//数据个数
 86 
 87     init_weight(W);
 88     /*读入输入数据*/
 89     number = getdata(data);
 90     printf("数据的个数:%d
", number);
 91 
 92     /*计算的主体*/
 93     for (int i=0;i<number; ++i)
 94     {
 95         printf("%d ", i);
 96         for (int j = 0; j < INPUT; ++j)
 97             printf("%lf ", data[i][j]);
 98         z = forward(W, data[i]);
 99         printf("%lf
", z);
100     }
101 
102     return 0;
103 
104 }

  结果与AND逻辑运算相同

要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while。

在VS中,三组<Ctrl+z>和Enter 键,跳出while循环。

原文地址:https://www.cnblogs.com/liweikuan/p/14192791.html