zoukankan      html  css  js  c++  java
  • [转]感知器算法

     原文地址: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

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

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

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

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

  • 相关阅读:
    c++中ctype常用函数总结(isprint isblank..)
    c++的const总结(转)
    c++重载输入输出运算符
    c++中的友元重载
    c++函数模板二栈实现
    c++函数模板1
    c++中IO输入输出流总结<二>
    c++中IO输入输出流总结<一>
    四层与七层得区别(转)
    ORACLE操作
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6137062.html
Copyright © 2011-2022 走看看