最简单的神经网络算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 {

相关文档
最新文档