Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4460946
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: C/C++

2014-09-24 11:20:15

文章来源:http://blog.csdn.net/helloaya/article/details/4224425

人工神经网络算法是模拟 人的神经网络的一种算法.

该算法像人一样,具有一定的学习能力。  人工神经网络可以学会它所能表达的任何东西.

该算法在模拟人类抽象思维方面较传统的算法具有优势,如图像识别 (人脸识别,车牌识别), 声音识别方面已经有成熟的运用。

 

举个简单的例子可以说明人工神经网络和传统算法的差别所在 (等会也要实现):

假设要解决这个问题: 写一个程序, 判断 0, 1, 2, 3 ... 9 这10个数的奇偶性

1. 如果是传统算法, 则是模拟人的逻辑思维,对这个问题进行形式化和逻辑化 :

if (input 模  2  == 零) {

    input 是 偶数

} else {

    input 是 奇数

}

2. 如果是ANN算法,则要提供一组正确的数据对处理这个问题的神经网络ANN进行训练 :

未进行训练的神经网络,就像刚出生的婴儿一样,什么都不懂。这个时候, 你要教他 0 是偶数,  1是奇数....,

教完之后问ANN懂了没有,懂了则停止训练 (网络已经形成),不懂则继续训练.

while (1) {

    训练;

    if (测试通过)  {

         跳出循环;

    } 

}

训练完之后,这个ANN以后便能够正确处理 奇偶性判断的问题了.

处理上面这个问题,只需要模拟一个神经元即可,再复杂的问题,可能需要多个神经元,再再复杂,需要多层多神经元的配合来实现 (以后再研究)

 

下面是实现:

  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 {  
  89.         printf ("%d 是 奇数/n", input);  
  90.     }  
  91. }  
  92.   
  93. int main ()  
  94. {  
  95.     int n = 0;  
  96.     initM ();  
  97.   
  98.     /** 一直训练直到能够100%正确为止 **/  
  99.     while (1) {  
  100.         n ++;  
  101.         calcY ();  
  102.         int err = adjustM ();  
  103.         if (0  >= err) {  
  104.             /** 能够 100 %正确地回答问题了,结束训练 **/  
  105.             break;  
  106.         }  
  107.         printf ("错误数 %d/n", err);  
  108.     }  
  109.   
  110.     printM ();  
  111.     printf ("阈值 %d 训练次数 %d/n", ST, n);  
  112.   
  113.   
  114.     while (1) {  
  115.         int a = 0;  
  116.         scanf ("%i", &a);  
  117.         if (0 > a || 9 < a) {  
  118.             break;  
  119.         }  
  120.   
  121.         test (a);  
  122.     }  
  123.     return 0;  
  124. }  
测试, 选择 阈值 52 作为测试,经过25次训练之后,能够给100 % 回答问题.
  1. M[0] = 53  
  2. M[1] = 26  
  3. M[2] = 40  
  4. M[3] = 11  
  5. M[4] = 59  
  6. M[5] = 4  
  7. M[6] = 21  
  8. M[7] = -1  
  9. M[8] = 68  
  10. M[9] = 4  
  11. 阈值 52 训练次数 25  
阅读(975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~