[转]感知器算法

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

感知器算法

2015-04-13 13:26 521人阅读 评论(0) 收藏 举报

 分类:

机器学习(10) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

引例:判断一个人是否长得帅??? 有如下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

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

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

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

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

时间: 2024-10-25 17:13:19

[转]感知器算法的相关文章

Stanford大学机器学习公开课(三):局部加权回归、最小二乘的概率解释、逻辑回归、感知器算法

(一)局部加权回归 通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting).如下图的左图.而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕,因为它导致数据的 过拟合(overfitting),不符合数据真实的模型.如下图的右图. 下面来讲一种非参数学习方法——局部加权回归(LWR).为什么局部加权回归叫做非参数学习方法呢?首先,参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖

人工神经网络之感知器算法

感知器作为人工神经网络中最基本的单元,有多个输入和一个输出组成.虽然我们的目的是学习很多神经单元互连的网络,但是我们还是需要先对单个的神经单元进行研究. 感知器算法的主要流程: 首先得到n个输入,再将每个输入值加权,然后判断感知器输入的加权和最否达到某一阀值v,若达到,则通过sign函数输出1,否则输出-1. 为了统一表达式,我们将上面的阀值v设为-w0,新增变量x0=1,这样就可以使用w0x0+w1x1+w2x2+…+wnxn>0来代替上面的w1x1+w2x2+…+wnxn>v.于是有: 从

感知器算法初探

今天学了感知器算法:Perceptron Learning Algorithm (PLA) 觉得自己应该回去重新学学线性代数QAQ 依旧是自己的理解为主…… 感知器算法是一种线性分类器,对于一个样本,它具有x={x1, x2, ..., xn}这些特征,每个特征具有一个权值w={w1, w2, ..., wn},所以这个样本的特征向量为X=∑xi*wi.分类集为y={y1, y2, ..., yn},所以设分类函数为y=f(X),感知器的目的是求一个函数g≍f. 假设现在有一系列样本,样本共两个

感知器算法

在logistic方法中,g(z)会生成[0,1]之间的小数,但如何是g(z)只生成0或1? 所以,感知器算法将g(z)定义如下: 同样令,和logistic回归的梯度上升算法类似,学习规则如下: 尽管看起来和之前的学习算法类似,但感知器算法是一种非常简便的学习算法,临界值和输出只能是0或1,是比logistic更简单的算法.后续讲到学习理论是,会将其作为基本的构造步骤.

感知器算法--python实现

写在前面: 参考: 1  <统计学习方法>第二章感知机[感知机的概念.误分类的判断]   http://pan.baidu.com/s/1hrTscza 2   点到面的距离 3   梯度下降 4   NumPy-快速处理数据    属性shape:表示几行几列:   dot(a,b) 计算数组.矩阵的乘积 感知器算法: Python实现: #coding:utf-8 import numpy as np class Perceptron(object): def __init__(self)

机器学习——感知器算法实现

本次也是用processing3.0+写的,其官方网站https://processing.org/,建议直接看reference的例子进行学习. 感知器算法用的是我们老师给的ppt,实现的是二维的感知器,为了方便看,实际上多维的也是一样的: 运行效果是: 为了试验方便,我这是用了点击取点,键盘按一下t,大小写均可,下一个点的就是正例,按一下f,大小写均可,下一个点就是负例. 按s是开始进行学习度为1的迭代.结束会直接出直线,按2会出学习率为2的直线,迭代次数会打在程序底下,值是2. 代码仅供参

机器学习之感知器算法原理和Python实现

(1)感知器模型 感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数. (2)感知器学习规则 输入训练样本X和初始权重向量W,将其进行向量的点乘,然后将点乘求和的结果作用于激活函数sign(),得到预测输出O,根据预测输出值和目标值之间的差距error,来调整初始化权重向量W.如此反复,直到W调整到合适的结果为止. (3)算法的原始形式 (4)Python代码实现 1 import

手写一个机器学习的入门算法-感知器算法

用4x+5y=2000作为分界线制造了100个点: 初始分界线为0,0: 经过1000轮纠正后,结果是: 22 x+31 y = 11876 对比结果4 x + 5 y = 2000 还是比较接近的.   刚开始更新w的那行代码搞错了,以为是用predict去纠正,其实应该用sample的真实值去纠正.   import random; def find_split(points): w=(0,0,0) for _ in range(1,2000): print 'w='+str(w); for

感知器算法(二分类问题)

下面是实验结果: main.m <span style="font-family:Times New Roman;font-size:14px;">data=[0 0 0;0 1 1;1 0 1;1 1 2;2 1 1;1 2 3;2 2 4;3 2 1]; data1=[6 6 7;6 7 2;7 6 6;7 7 8;7 8 9;8 6 7;8 7 6;8 8 8;8 9 5;9 7 7;9 8 9;9 9 5]; plot3(data(:,1),data(:,2),da