首页 > 代码库 > [转]感知器算法

[转]感知器算法

 原文地址:http://blog.csdn.net/u014403897/article/details/45024609

感知器算法

技术分享 分类:

引例:判断一个人是否长得帅??? 有如下feature: 身高,体重,三围,颜值,学习成绩(帅的人学习成绩好的少...为何要这么一个扯淡的特征下面会讲解)等等。

假设有一个标准:每一个评分项给予多少分的权重,当所有feature与权重相乘的和大于某一个值的时候,那这个人就是帅哥!!

例子: 180*5+150*3+....>1000 帅哥! 小于则.....

感知器任务:通过已知的实例调节权重,使其能够预测出未知实例的结果。

符号表示:

if       (w1*x1+w2*x2+.......>b) return true

else        return false

由于b是常数,我们可以将b表示为-w0×X0,则可以表示为

 

if       (w1*x1+w2*x2+.......+w0×x0>0) return true

else        return false

训练方法:

当预测值等于我们期待的结果时: 什么也不用做

但当其小于的时候,说明我们增加的权值小了,赢补上一个正数数 例如所有xi××2的和数学表达推导如下:

w1*x1+a*x1*x1+w2*x2+a*x2*x2+......  住:a为学习速率因子,会影响学习速率

w的更新值相当于wi=wi+a×xi

当其大于时候应改为减号,归结起来应为如下表达式:

wi=wi+a*(y-h(x))*xi

伪代码表示:

 

[cpp] view plain copy
 
  1. while(循环结束条件)  {#此处可设为让样本循环执行多少次  
  2.     delta_w[ ]={0};  
  3.     for(每个样本){  
  4.         for(每个特征 i){  
  5.             delta_w[i]+=a*(y-h(x))*wi;  
  6.         }  
  7.     }  
  8.      for(每个特征 i){  
  9.             更新w权值  
  10.             wi+=dealta_w[i]  
  11.         }  
  12. }  

问题:

 

1.迭代的停止条件是什么?

答:自己定,可以是某个验证集取得理想结果的时候,或是向上述例子,单纯是循环多少次

2.当训练时候遇到正确样本会发生什么?

答:什么也不发生,当预测结果正确时候,就假定是最好感知器

3.每次迭代调整w或是所有样本迭代完全后调整w(上例)有区别么?

答:区别不大,也许w权值会有所变化,但实际效果没多大区别。

4.某轮迭代后结果一定变好么?

答:不一定,但总体趋势是变好的!

5.a的作用和取值问题

答:作用是控制学习速率,一般选0-1之间,过大不能学习到最优值,过小没有什么变化~~

C语言实现代码如下:

 

[cpp] view plain copy
 
  1. //此为预测函数  
  2. //注:此处x0皆为1,至少需要是一个定值  
  3. int predict(double x[ ] ,double w[ ],int feature){  
  4.     int sum=0;  
  5.     for(int i=0;i<feature;i++){  
  6.         sum+=w[i]*x[i];  
  7.     }  
  8.     if(sum>0) return 1;  
  9.     else return 0;  
  10. }  
  11. //此为调参函数  
  12. void train(double train_set[ ][ ],int y[ ],double w[ ],int feature_num,int sample_num,int a,int iterator_num){  
  13.     while(iterator_num--){  
  14.         double* dw=new double[feature_num];  
  15.         for(int i=0;i<sample_num;i++){  
  16.             for(int j=0;j<feature_num;j++){  
  17.                 dw[j]+=a*(y-predict(train_set[i]))*train_set[i][j];  
  18.             }  
  19.         }  
  20.     }  
  21.     for(int j=0,j<feature_num;j++){  
  22.         w[j]+=dw[j];  
  23.     }  
  24. }  

优化方法:找出训练后结果最好的一组w

 

                    由一个计数器,吧每次最好的记录即可!

缺点:只能解决线性可分问题

通过升维度来解决!但是并不一定能取得很好效果,如增加学习成绩这种特征...

更好的解决方法以后再讨论!

[转]感知器算法