最简单的神经网络算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最简单的人工神经网络实现
人工神经网络算法是模拟人的神经网络的一种算法.
该算法像人一样,具有一定的学习能力。人工神经网络可以学会它所能表达的任何东西.
该算法在模拟人类抽象思维方面较传统的算法具有优势,如图像识别(人脸识别,车牌识别),声音识别方面已经有成熟的运用。
举个简单的例子可以说明人工神经网络和传统算法的差别所在(等会也要实现):
假设要解决这个问题: 写一个程序,判断0, 1, 2, 3 ... 9 这10个数的奇偶性
1. 如果是传统算法,则是模拟人的逻辑思维,对这个问题进行形式化和逻辑化:
if (input 模 2 == 零) {
input 是偶数
} else {
input 是奇数
}
2. 如果是ANN算法,则要提供一组正确的数据对处理这个问题的神经网络ANN进行训练:
未进行训练的神经网络,就像刚出生的婴儿一样,什么都不懂。这个时候, 你要教他0 是偶数,1是奇数....,
教完之后问ANN懂了没有,懂了则停止训练(网络已经形成),不懂则继续训练.
while (1) {
训练;
if (测试通过) {
跳出循环;
}
}
训练完之后,这个ANN以后便能够正确处理奇偶性判断的问题了.
处理上面这个问题,只需要模拟一个神经元即可,再复杂的问题,可能需要多个神经元,再再复杂,需要多层多神经元的配合来实现(以后再研究)
下面是实现:
[cpp]view plaincopyprint?
1. /*****************************************
2. * 感知器判断数字奇偶性
3. *
4. * 关键点,阈值应该怎么定?
5. ****************************************/
6. #include
7. #include
8. #include
9.
10.
11. int M[10]; /** 权值 **/
12. int X[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; /** 输入向量 **/
13. int Y[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0}; /** 理想输出向量, 0 表示奇数, 1表示偶
数 **/
14. int O[10]; /** 保存输出向量 **/
15. int ST = 52; /** 阈值 **/
16.
17.
18.
19. /** 初始化权值 **/
20. void initM ()
21. {
22. int x = 0;
23. srand ((unsigned int)time(0));
24. for (x = 0; x < 10; ++x) {
25. /** 随机数在 0 - 99 之间 **/
26. M[x] = rand () % 100;
27. }
28. }
29.
30. /** 跃迁型激活函数 **/
31. int active (int m, int x)
32. {
33. int o = m * x;
34. if (o > ST) {
35. return 1;
36. } else {
37. return 0;
38. }
39. }
40.
41. /** 计算输出向量 **/
42. void calcY ()
43. {
44. int x = 0;
45. for (x = 0; x < 10; ++x) {
46. O[x] = active (M[x], X[x]);
47. }
48. }
49.
50.
51. /** 根据实际输出向量和理想输出向量调整权向量,
52. 返回实际输出和理想输出不匹配的数目 **/
53. int adjustM ()
54. {
55. int err = 0;
56. int x = 0;
57. for (x = 0; x < 10; ++x) {
58. if (O[x] != Y[x])
59. {
60. err ++;
61. if (0 == O[x]) {
62. M[x] += X[x];
63. } else {
64. M[x] -= X[x];
65. }
66. }
67. }
68. return err;
69. }
70.
71.
72. /** 打印权向量 **/
73. void printM ()
74. {
75. int x = 0;
76. for (x = 0; x < 10; ++x) {
77. printf ("M[%i] = %i/n", x, M[x]);
78. }
79. }
80.
81.
82. void test (int input)
83. {
84. printf ("[%i] [%i] ", M[input], X[input]);
85. if (active (M[input], X[input]))
86. {
87. printf ("%d 是偶数/n", input);
88. } else {