一个简单的ANN算法

本文介绍了一种使用神经网络实现奇偶数分类的方法,包括初始化权重、激活函数、计算输出向量、调整权重以及测试已训练好的神经网络。通过不断迭代训练,神经网络能够准确区分奇数和偶数。
  1. [code=C/C++]  
  2.   
  3. #include <stdio.h>  
  4. #include <time.h>  
  5.   
  6. int M[10] = {0};                                //权值  
  7. int X[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};    //输入向量  
  8. int Y[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};     //理想输出向量 注:1 表示奇数; 0 表示偶数  
  9. int O[10] = {0};                                //保存输出向量  
  10. int ST = 52;                                    //阈值,默认值:52  
  11.   
  12. //初始化权值  
  13. void initM()  
  14. {  
  15.     srand((unsigned int)time(0));  
  16.       
  17.     for (int x=0; x<10; ++x)  
  18.     {  
  19.         //初始化权值所使用的随机数在 0 - 99 之间  
  20.         M[x] = rand()%100;  
  21.     }  
  22. }  
  23.   
  24. //激活函数  
  25. int active(int m, int x)  
  26. {  
  27.     int o = m * x;  
  28.       
  29.     if (o > ST)  
  30.     {  
  31.         return 0;  
  32.     }  
  33.     else  
  34.     {  
  35.         return 1;  
  36.     }  
  37. }  
  38.   
  39. //计算输出向量  
  40. void calcY()  
  41. {  
  42.     for (int x=0; x<10; ++x)  
  43.     {  
  44.         O[x] = active(M[x], X[x]);  
  45.     }  
  46. }  
  47.   
  48. //根据实际输出向量和理想输出向量调整权向量,返回实际输出和理想输出不匹配的数目  
  49. int adjustM()  
  50. {  
  51.     int err = 0;  
  52.     for (int x=0; x<10; ++x)  
  53.     {  
  54.         if (O[x] != Y[x])  
  55.         {  
  56.             err++;  
  57.               
  58.             if (1 == O[x])  
  59.             {  
  60.                 M[x] += X[x];  
  61.             }  
  62.             else  
  63.             {  
  64.                 M[x] -= X[x];  
  65.             }  
  66.         }  
  67.     }  
  68.       
  69.     return err;  
  70. }  
  71.   
  72. //打印权向量  
  73. void printM()  
  74. {  
  75.     printf("/n最终训练结果:/n");  
  76.     for (int x=0; x<10; ++x)  
  77.     {  
  78.         printf("M[%i] = %i/n", x, M[x]);  
  79.     }  
  80. }  
  81.   
  82. //测试已经训练好的ANN  
  83. void test(int input)  
  84. {  
  85.     if ( 0==active(M[input], X[input]) )  
  86.     {  
  87.         printf("%d 是 偶数 ", input+1);  
  88.     }  
  89.     else  
  90.     {  
  91.         printf("%d 是 奇数 ", input+1);  
  92.     }  
  93.       
  94.     printf("/n/n");  
  95. }  
  96.   
  97. //主函数入口  
  98. int main()  
  99. {  
  100.     printf("请输入阈值:");  
  101.     scanf("%d", &ST);  
  102.     printf("/n");  
  103.       
  104.     initM();  
  105.       
  106.     int n = 0;  
  107.     //一直训练直到能够100%正确为止  
  108.     while (1)  
  109.     {  
  110.         n++;  
  111.         calcY();  
  112.         int err = adjustM();  
  113.         if (0 >=err)  
  114.         {  
  115.             //能够100%正确地回答问题了,结束训练  
  116.             break;  
  117.         }  
  118.         printf("第%0.2d次训练后的结果中存在的错误数 %d/n", n,err);  
  119.     }  
  120.       
  121.     printM();  
  122.     printf("/n阈值=%d 训练次数=%d/n/n", ST, n);  
  123.       
  124.     while (true)  
  125.     {  
  126.         int a = 0;  
  127.         printf("请输入范围为1~10的数字:");  
  128.         scanf("%d", &a);  
  129.         if (1 > a || 10 < a)  
  130.         {  
  131.             break;  
  132.         }  
  133.           
  134.         test(a-1);  
  135.     }  
  136.       
  137.     return 0;  
  138. }  
  139.   
  140. [/code] 
### 如何理解和实现人工神经网络 (ANN) 算法 #### 什么是人工神经网络? 人工神经网络(Artificial Neural Network, ANN)是从生物学中的神经元网络得到启发的一种计算模型。它通过模拟人类大脑的工作机制来解决复杂的模式识别和数据分析问题。具体来说,它是从信息处理的角度对人脑神经元网络进行抽象建模的结果[^2]。 #### 生物学背景 生物神经网络由大量的神经元构成,这些神经元之间通过突触相互连接并传递信号。受此启发,人工神经网络也被设计成由多个节点组成的层次化结构,其中每个节点代表一个人工神经元。这种结构能够完成输入到输出之间的复杂映射关系[^1]。 #### 数学基础 在数学上,人工神经网络可以被看作是一个多层的非线性变换系统。每一层都包含若干个神经元,而每一个神经元接收来自前一层的加权输入,并经过激活函数的作用后产生输出。常见的激活函数有 Sigmoid 函数、ReLU (Rectified Linear Unit)、Tanh 等。 #### 训练过程 为了使神经网络具备解决问题的能力,通常需要对其进行训练。这涉及到两个主要步骤:正向传播和反向传播。 - 正向传播是指将输入数据依次传入各层直至获得最终输出的过程; - 反向传播则是利用误差反馈调整权重参数的方法,目的是最小化实际输出与目标值之间的差距。常用的优化算法包括梯度下降及其变种形式如 Adam 和 RMSprop。 以下是基于 Python 的简单实现代码示例: ```python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.W1 = np.random.randn(input_size, hidden_size) self.b1 = np.zeros(hidden_size) self.W2 = np.random.randn(hidden_size, output_size) self.b2 = np.zeros(output_size) def sigmoid(self, z): return 1 / (1 + np.exp(-z)) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 y_pred = self.sigmoid(self.z2) return y_pred def compute_loss(self, y_true, y_pred): m = y_true.shape[0] loss = -(np.sum(y_true * np.log(y_pred) + (1-y_true)*np.log(1-y_pred))) / m return loss def backward(self, X, y_true, learning_rate=0.01): m = X.shape[0] delta_z2 = (y_pred - y_true) * y_pred * (1 - y_pred) dW2 = np.dot(self.a1.T, delta_z2) / m db2 = np.sum(delta_z2, axis=0) / m delta_a1 = np.dot(delta_z2, self.W2.T) delta_z1 = delta_a1 * self.a1 * (1-self.a1) dW1 = np.dot(X.T, delta_z1) / m db1 = np.sum(delta_z1, axis=0) / m # 更新参数 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 ``` 上述代码展示了一个具有单隐藏层的人工神经网络框架,其中包括初始化随机权重矩阵 `W` 和偏置项 `b`, 定义了sigmoid作为激活函数以及实现了简单的二分类交叉熵损失函数计算方法[^3]。 #### 隐藏层数量的选择 关于如何选择合适的隐层数目及每层神经元数目这一问题并没有固定答案,因为这是取决于特定应用场景的一个经验性决策过程。一般而言,增加更多的隐藏层可能会提高模型表达能力但也容易引起过拟合现象;因此建议从小规模开始试验逐步扩大直到找到最佳配置为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值