1. 程式人生 > >神經網路之感知器演算法簡單介紹和MATLAB簡單實現

神經網路之感知器演算法簡單介紹和MATLAB簡單實現

Perceptron Learning Algorithm

感知機學習演算法,在1943年被生物學家MeCulloch和數學家Pitts提出以後,面臨一個問題:引數需要依靠人工經驗選定,十分麻煩。因此人們希望找到一種能夠自己選定引數的方法。1957年,Frank Rosenblatt提出了Perceptron,是一種人工網路模型,並在這個基礎上,提出了Perceptron學習演算法,用於自動選定引數。
Perceptron
neuron model
learning algorithm
learning algorithm
這裡思考一個問題:為什麼這個更新法則會成功收斂到正確的權值呢?在卡內基梅隆大學編寫的《機器學習》中有提及這個問題。大致意思如下

為了得到直觀的感覺,考慮一些特例。假定訓練樣本已經被感知器正確分類。這時,(

TjYj)是0,這使得ΔWij為0,所以權值沒有修改。而如果當目標輸出是+1時,感知器輸出一個0,這種情況下為使感知器輸出一個+1而不是0,權值必須被修改以增大WX的值。例如,如果Xi>0,那麼增大Wij會使得感知器更接近正確分類的例項。注意,這種情況下訓練法則會增長Wij,因為(T_j-Y_j)、ηXi都是正。例如,如果Xi=0.8η=0.1TJ=1Yj=1,那麼權更新就是ΔWij=η(TjYj)=0.16。另一方面,如果Tj=1Yj=1,那麼和正的Xi關聯的權值會減小而不是增大。同理當Xi<0時,也有上面的收斂的性質。
事實上可以證明,在有限次地使用感知器訓練法則後,上面的訓練過程會收斂到一個能正確分類所有訓練樣例的權向量。前提是訓練樣例線性可分
,並使用了一個充分小的η(參加Minskey & Papert 19691

需要注意的是,這個模型只能用於線性可分的資料,對於非線性可分的資料,上述的學習演算法將無限迴圈。

MATLAB 實現

原理很簡單,程式碼實現起來也不難。我們直接上程式碼
需要說明的是,我們的資料集,包括兩個部分:資料和標籤。Perceptron.m中的X,大致應該長這樣:

X=[x1x2L]
舉個例子(邏輯運算OR)
X=010100110111
最後一列,只有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 < 5 init_t = 0; end if nargin < 4 init_w = []; init_t = 0; end if nargin < 3 step = 0.1; init_w = []; init_t = 0; end label = X(:,end); data = X(:,1:end-1); [n_data,n_fea] = size(data); n_w = size(init_w); if n_w ~= n_fea init_w = ones(n_fea,1); n_w = n_fea; end w = init_w; t = init_t; while true result = f(data*w - t); result = label-result; index = find(result ~= 0); n_index = numel(index); if n_index == 0 break end for i=1:n_index dis = result(index(i)); for j=1:n_w w(j) = w(j) + step*dis*data(index(i),j); end t = t - step*dis; end end 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 2

A = zeros(n_L1,3);
A(:,3) = 1;
B = zeros(n_L2,3);
B(:,3) = 0;

% create random point
for i=1:n_L1
    A(i,1:2) = c1 + rand(1,2);
end
for i=1:n_L2
    B(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_L1
    test_A(i,1:2) = c1 + rand(1,2);
end
for i=1:n_L2
    test_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)));

result

threshhold_func.m 閾值啟用函式

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

最後,給出老師課件上的例子,可以自己試試看計算過程是不是一致的。
OR1
OR2

  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簡單實現

Perceptron Learning Algorithm 感知機學習演算法,在1943年被生物學家MeCulloch和數學家Pitts提出以後,面臨一個問題:引數需要依靠人工經驗選定,十分麻煩。因此人們希望找到一種能夠自己選定引數的方法。1957年,Fran

神經網路感知準則,delta準則

這篇文章主要介紹神經網路中兩個基本單元,感知器和線性單元,以及他們的訓練法則。 所謂訓練法則就是定義一個或一組規則,通過這些規則能讓我們的到一組合適的權向量。 神經網路包括集中主要的基本單元,主要是感知器(preceptron)、線性單元(lin

深度學習(神經網路)單層感知(python)(一)

感知器介紹 感知器(Perceptron),是神經網路中的一個概念,在1950s由Frank Rosenblatt第一次引入。 單層感知器(Single Layer Perceptron)是最簡單的神經網路。它包含輸入層和輸出層,而輸入層和輸出層是直接相連的。

計算機潛意識- 單層神經網路感知

1.引子     1958年,計算科學家Rosenblatt提出了由兩層神經元組成的神經網路。他給它起了一個名字--“感知器”(Perceptron)(有的文獻翻譯成“感知機”,下文統一用“感知器”來指代)。   感知器是當時首個可以學習的人工神經網路。Rosenblatt現場演示了其學習識別簡單影象的過

Hinton Neural Networks課程筆記2b:第一代神經網路感知

感知機可以說是最簡單最經典的神經網路模型了,簡單而言就是對輸入加權求和之後,得到一個評價值和一個threshold比較,從而進行分類。只能求取線性分類面,極大依賴於特徵提取,但速度極快,適用於特徵維度很大的情況。 傳統模式識別框架 傳統統計模式識別的標準

深度神經網路反向傳播演算法

1.DNN反向傳播演算法簡介 回顧我們前面學到的監督問題,通常會遇到這種情況,假如有mmm個訓練樣本,分別為{(x1,y1),(x2,y2),(x3,y3),...,(xm,ym)}\{(x_1,y_1),(x_2,y_2),(x_3,y_3),...,(x_m

神經進化學的簡單介紹一個簡單的CPPN(Compositional Pattern Producing Networks)DEMO

最近迷上神經進化(Neuroevolution)這個方向,感覺是Deep Learning之後的一個很不錯的研究領域。該領域的一個主導就是仿照人的遺傳機制來進化網路引數與結構。注意,連網路結構都可以進化,就是不像是傳統的神經網路,結構是提前定義好的。 最近這個領域研究的

神經網路中的BP演算法(原理推導)

BP演算法介紹 BP演算法(Background Propagation Alogorithm), 即誤差逆傳播演算法,是訓練多層前饋神經網路的一種最經典的演算法,通過BP演算法可以學得網路的權重和閾值,且具有可靠的收斂性。 網路結構 首先對所用的符號和變

神經網路入門】用JAVA實現感知演算法

簡述 隨著網際網路的高速發展,A(AI)B(BigData)C(Cloud)已經成為當下的核心發展方向,假如三者深度結合的話,AI是其中最核心的部分。所以如果說在未來社會,每個人都必須要學會程式設計的話,那麼對於程式設計師來說,人工智慧則是他們所必須掌握的技術(科技發展真tm快)。 這篇文章介紹

機器學習與神經網路(二):感知介紹Python程式碼實現

前言:本篇博文主要介紹感知器的相關知識,採用理論+程式碼實踐的方式,進行感知器的學習。本文首先介紹感知器的模型,然後介紹感知器學習規則(Perceptron學習演算法),最後通過Python程式碼實現單層感知器,從而給讀者一個更加直觀的認識。 1.單層感知器模型 單層感知器

神經網路感知

  在神經網路中,我們主要使用的是一種稱為S型神經元的神經元模型。感知器就是我們所謂的“人工神經元”。那麼感知器怎麼工作的呢,接下來我們來談談。   1.感知器工作機制:       上圖中有x1,x2和x3輸入,一般情況下我們可以引入權重w1,w2和w3來表示輸入對輸出的重要性,這時可以計算

簡單易學的機器學習演算法——神經網路BP神經網路

%% BP的主函式 % 清空 clear all; clc; % 匯入資料 load data; %從1到2000間隨機排序 k=rand(1,2000); [m,n]=sort(k); %輸入輸出資料 input=data(:,2:25); output1 =data(:,1); %把輸出從1維變

續(利用tensorflow實現簡單的卷積神經網路-對程式碼中相關函式介紹)——遷移學習小記(三)

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

神經網路多層感知機MLP的實現(Python+TensorFlow)

用 MLP 實現簡單的MNIST資料集識別。 # -*- coding:utf-8 -*- # # MLP """ MNIST classifier, 多層感知機實現 """ # Import

神經網路BP演算法

文章轉載於http://www.cnblogs.com/charlotte77/p/5629865.html。  最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文

機器學習演算法自適應線性感知演算法

自適應線性感知器演算法 原理推導 python實現 import numpy as np import matplotlib.pyplot as plt #隨機生成x和y, n=100, m=2 x = np.random.randn(1

吳恩達機器學習(第十章)---神經網路的反向傳播演算法

一、簡介 我們在執行梯度下降的時候,需要求得J(θ)的導數,反向傳播演算法就是求該導數的方法。正向傳播,是從輸入層從左向右傳播至輸出層;反向傳播就是從輸出層,算出誤差從右向左逐層計算誤差,注意:第一層不計算,因為第一層是輸入層,沒有誤差。 二、如何計算 設為第l層,第j個的誤差。

吳恩達機器學習 - 神經網路的反向傳播演算法 吳恩達機器學習 - 神經網路的反向傳播演算法

原 吳恩達機器學習 - 神經網路的反向傳播演算法 2018年06月21日 20:59:35 離殤灬孤狼 閱讀數:373

卷積神經網路早期架構

文章目錄 早期架構 lenet5架構 小結 程式碼 Dan Ciresan Net 後續幾種網路的概要 早期架構 文件存放更新地址:https://gith

卷積神經網路OverFeat(2014)

文章目錄 OverFeat 前言 概要 模型 OverFeat 分類 多尺度卷積(FCN) 多尺度分類(offset池化) 定位