单个人工神经元的实现
人工神经元
神经元是构成神经网络的最基础单元
网络结构:
人工神经网络由神经元模型构成,这种由许多神经元组成的信息处理网络具有并行分布结构。
输入数据采用二维数组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("请输入数据\n"); 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("输入数据完成\n"); 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\n", 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\n", z); 100 } 101 102 return 0; 103 104 }
结果与AND逻辑运算相同
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while。
在VS中,三组<Ctrl+z>和Enter 键,跳出while循环。