Perceptron Learning Algorithm

感知机学习算法,在1943年被生物学家MeCulloch和数学家Pitts提出以后,面临一个问题:参数需要依靠人工经验选定,十分麻烦。因此人们希望找到一种能够自己选定参数的方法。1957年,Frank Rosenblatt提出了Perceptron,是一种人工网络模型,并在这个基础上,提出了Perceptron学习算法,用于自动选定参数。




这里思考一个问题:为什么这个更新法则会成功收敛到正确的权值呢?在卡内基梅隆大学编写的《机器学习》中有提及这个问题。大致意思如下

为了得到直观的感觉,考虑一些特例。假定训练样本已经被感知器正确分类。这时,(Tj−Yj)(T_j-Y_j)是0,这使得ΔWij\Delta W_{ij}为0,所以权值没有修改。而如果当目标输出是+1+1时,感知器输出一个00,这种情况下为使感知器输出一个+1+1而不是00,权值必须被修改以增大WXWX的值。例如,如果Xi>0X_i>0,那么增大WijW_{ij}会使得感知器更接近正确分类的实例。注意,这种情况下训练法则会增长WijW_{ij},因为(T_j-Y_j)、η\eta和XiX_i都是正。例如,如果Xi=0.8X_i=0.8,η=0.1\eta=0.1,TJ=1T_J=1且Yj=−1Y_j=-1,那么权更新就是ΔWij=η(Tj−Yj)=0.16\Delta W_{ij} = \eta(T_j-Y_j) = 0.16。另一方面,如果Tj=−1T_j=-1而Yj=1Y_j=1,那么和正的XiX_i关联的权值会减小而不是增大。同理当Xi<0X_i时,也有上面的收敛的性质。
事实上可以证明,在有限次地使用感知器训练法则后,上面的训练过程会收敛到一个能正确分类所有训练样例的权向量。前提是训练样例线性可分,并使用了一个充分小的η\eta(参加Minskey & Papert 19691)

需要注意的是,这个模型只能用于线性可分的数据,对于非线性可分的数据,上述的学习算法将无限循环。

MATLAB 实现

原理很简单,代码实现起来也不难。我们直接上代码
需要说明的是,我们的数据集,包括两个部分:数据和标签。Perceptron.m中的X,大致应该长这样:

X=[x1x2⋯L]

X = \begin{bmatrix} x_1 & x_2 & \cdots & L \end{bmatrix}
举个例子(逻辑运算OR)

X=⎡⎣⎢⎢⎢010100110111⎤⎦⎥⎥⎥

X = \begin{bmatrix} 0 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 1 & 1 \\ \end{bmatrix}
最后一列,只有0或者1,表示两类

Perceptron.m

function [ w, t ] = Perceptron( X, f, step, init_w, init_t )
%PRO Summary of this function goes here
%   X: data set with label
%   f: active function
%   step: step size
%   init_w:
%   init_t:if nargin < 5init_t = 0;endif nargin < 4init_w = [];init_t = 0;endif nargin < 3step = 0.1;init_w = [];init_t = 0;endlabel = X(:,end);data = X(:,1:end-1);[n_data,n_fea] = size(data);n_w = size(init_w);if n_w ~= n_feainit_w = ones(n_fea,1);n_w = n_fea;endw = init_w;t = init_t;while trueresult = f(data*w - t);result = label-result;index = find(result ~= 0);n_index = numel(index);if n_index == 0breakendfor i=1:n_indexdis = result(index(i));for j=1:n_ww(j) = w(j) + step*dis*data(index(i),j);endt = t - step*dis;endend
end

demo.m 对Perceptron函数进行了简单的测试

clc;c1 = [1 1];
c2 = [5 7];n_L1 = 50; % number of item with label 1
n_L2 = 20; % number of item with label 2A = zeros(n_L1,3);
A(:,3) = 1;
B = zeros(n_L2,3);
B(:,3) = 0;% create random point
for i=1:n_L1A(i,1:2) = c1 + rand(1,2);
end
for i=1:n_L2B(i,1:2) = c2 + rand(1,2);
end%%
% show points
scatter(A(:,1), A(:,2),[],'r');
hold on
scatter(B(:,1), B(:,2),[],'g');%%
% do perceptron
X = [A;B];
%X = [0 0 0;0 1 1;1 0 1;1 1 1];
[w, t] = Perceptron(X,@threshhold_func)%%
% plot the result
A = w(1);
B = w(2);
C = -t;
if B==0%生成100个-C/A放在向量x中.x=linspace(-C/A,-C/A,100);%从-A)-(|A|+|B|+|C|)到|A|+|B|+|C|等距离生成100个值放在向量y中.?y=linspace(-abs(A)-abs(B)-abs(C),abs(A)+abs(B)+abs(C),100);
else%x从-A)-(|A|+|B|+|C|)到|A|+|B|+|C|,取步长为0.01.x=-abs(A)-abs(B)-abs(C):0.01:abs(A)+abs(B)+abs(C);y=(-A.*x-C)./B;
end
hold on
plot(x,y)%%
% test
test_A = zeros(n_L1,3);
test_A(:,3) = 1;
test_B = zeros(n_L2,3);
test_B(:,3) = 0;
for i=1:n_L1test_A(i,1:2) = c1 + rand(1,2);
end
for i=1:n_L2test_B(i,1:2) = c2 + rand(1,2);
end
test_X = [test_A;test_B];
data = test_X(:,1:2);
label = test_X(:,end);
result = data*w - t;
index = find((label - result)~=0);
n_index = numel(index);
fprintf('正确率:%f\n', (n_index/(n_L1+n_L2)));

threshhold_func.m 阈值激活函数

function [ r ] = threshhold_func( x, t )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes hereif nargin < 2t = 0;endr = zeros(numel(x),1);index = find(x > t);r(index) = 1;
end

最后,给出老师课件上的例子,可以自己试试看计算过程是不是一致的。


  1. Minsky M L, Papert S. Perceptrons : an introduction to computational geometry[M]// Perceptrons: An Introduction to Computational Geometry. The MIT Press, 1969:3356-62. ↩

神经网络之感知器算法简单介绍和MATLAB简单实现相关推荐

  1. matlab与python实现神经网络_Adaline神经网络简单介绍和MATLAB简单实现

    Adaline神经网络 Adaline利用了最小二乘法的思想,相较于感知机神经网络,对于数据的线性可分的要求更低一些,可以允许一些异常数据. 上面描述了迭代求解的过程,但是在 x0(k+1) 这里没看 ...

  2. Adaline神经网络简单介绍和MATLAB简单实现

    Adaline神经网络 Adaline利用了最小二乘法的思想,相较于感知机神经网络,对于数据的线性可分的要求更低一些,可以允许一些异常数据. 上面描述了迭代求解的过程,但是在x0(k+1)x_0(k+ ...

  3. 【模式识别】C++实现感知器算法

    一.问题描述 编写一个感知器算法程序,用此程序求解下列模式分类的解向量: ω1:{(0 0 0),(1 0 0),(1 0 1),(1 1 0)} ω2:{(0 0 1),(0 1 1),(0 1 0 ...

  4. 人工神经网络—感知器算法的意义

    感知器算法的意义 1. 回顾 2. 感知器算法的意义 2.1 机器学习算法的框架的提出 2.2 框架的介绍 2.3 感知器算法的优势 3. 结尾 参考资料 1. 回顾 在上一讲中,我们讲到了Rosen ...

  5. 神经网络感知器算法调整原理是什么

    算法调整原理 如果点分类正确,则什么也不做. 如果点分类为正,但是标签为负,则分别减去 αp,αq, 和 α 至 w_1, w_2,w1​,w2​, 和 bb 如果点分类为负,但是标签为正,则分别将α ...

  6. 机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)

    目录 一.神经元的数学模型 ​ 二.感知器算法(SVM算法前身) 1.目的 2.流程 >>>问题1:下图w和b的调整是什么意思? 3.算法的有效性验证 1)原算法 2)增广矩阵 3) ...

  7. 人工神经网络—感知器算法

    感知器算法 1. 回顾 2. 感知器算法 2.1 感知器算法的实现步骤 2.2 算法能停得下来吗? 2.3 基于增广向量的感知器算法 2.4 感知器算法收敛定理 3. 感知器算法收敛的MATLAB程序 ...

  8. 如何利用 C# 实现神经网络的感知器模型?

    前几天我们介绍了 如何利用 C# 对神经网络模型进行抽象,在这篇图文中,我们抽象了单个神经元 Neuro,网络层 Layer,网络结构 Network,激活函数 IActivationFunction ...

  9. Perceptron Algorithm 感知器算法及其实现

    Rosenblatt于1958年发布的感知器算法,算是机器学习鼻祖级别的算法.其算法着眼于最简单的情况,即使用单个神经元.单层网络进行监督学习(目标结果已知),并且输入数据线性可分.我们可以用该算法来 ...

最新文章

  1. 词法作用域和动态作用域
  2. 不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹
  3. 安装杀毒软件是保障计算机安全,安装杀毒软件是保障计算机安全的唯一措施
  4. Linux中切换用户(su命令)
  5. radio select的 option使用
  6. yolov5 解码使用GPU进行加速
  7. =、:=、?=、+=
  8. php gmssl,centos7 php7 gmssl编译安装
  9. nat123内网穿透
  10. 增量式解析大型XML文件
  11. 2019ug最新版本是多少_UG在2019年隆重发布最新版本,让你我都想不到的是..........
  12. connect etimedout php,npm error: tunneling socket could not be established, cause=connect ETIMEDOUT
  13. The Bean Validation API is on the classpath but no implementation could be found
  14. 专升本高数——第八章 多元函数积分学【学习笔记】
  15. 经典算法电话号码的字母组合
  16. Android仿微信群聊头像合成
  17. 一周信创舆情观察(2.22~2.28)
  18. 欧元一个神创造的货币
  19. Alertmanager 使用阿里云电话告警。
  20. 经典Hadoop书籍介绍

热门文章

  1. python中for循环运行不起_python中for循环不能正常工作
  2. 简单 黑苹果dsdt教程_黑苹果笔记本:关于DSDT亮度表的分析与修改
  3. java继承时父类常量覆盖吗_Java父类继承中的static和final用法
  4. java调用ole ie_SWT中通过Automatioin的方式访问IE(升级版)
  5. mysql update commit吗_MySQL需要commit么
  6. php是什么电器元件,电阻器是电子、电器设备中常使用的一种基本电子元件
  7. 计算机excel图表考试题库,2016年职称计算机考试Excel操作题库
  8. python中side什么意思_python – 在PySide中区分信号源
  9. .net core 文件流保存图片_如何将图片打包成PDF文件进行保存?
  10. hyperv动态内存Linux,Linux 之动态分配内存方式