神經網路之感知器演算法簡單介紹和MATLAB簡單實現
Perceptron Learning Algorithm
感知機學習演算法,在1943年被生物學家MeCulloch和數學家Pitts提出以後,面臨一個問題:引數需要依靠人工經驗選定,十分麻煩。因此人們希望找到一種能夠自己選定引數的方法。1957年,Frank Rosenblatt提出了Perceptron,是一種人工網路模型,並在這個基礎上,提出了Perceptron學習演算法,用於自動選定引數。
這裡思考一個問題:為什麼這個更新法則會成功收斂到正確的權值呢?在卡內基梅隆大學編寫的《機器學習》中有提及這個問題。大致意思如下
為了得到直觀的感覺,考慮一些特例。假定訓練樣本已經被感知器正確分類。這時,
( 是0,這使得Tj−Yj)ΔWij 為0,所以權值沒有修改。而如果當目標輸出是+1 時,感知器輸出一個0 ,這種情況下為使感知器輸出一個+1 而不是0 ,權值必須被修改以增大WX 的值。例如,如果Xi>0 ,那麼增大Wij 會使得感知器更接近正確分類的例項。注意,這種情況下訓練法則會增長Wij ,因為(T_j-Y_j)、η 和Xi 都是正。例如,如果Xi=0.8 ,η=0.1 ,TJ=1 且Yj=−1 ,那麼權更新就是ΔWij=η(Tj−Yj)=0.16 。另一方面,如果Tj=−1 而Yj=1 ,那麼和正的Xi 關聯的權值會減小而不是增大。同理當Xi<0 時,也有上面的收斂的性質。
事實上可以證明,在有限次地使用感知器訓練法則後,上面的訓練過程會收斂到一個能正確分類所有訓練樣例的權向量。前提是訓練樣例線性可分,並使用了一個充分小的η (參加Minskey & Papert 19691)
需要注意的是,這個模型只能用於線性可分的資料,對於非線性可分的資料,上述的學習演算法將無限迴圈。
MATLAB 實現
原理很簡單,程式碼實現起來也不難。我們直接上程式碼
需要說明的是,我們的資料集,包括兩個部分:資料和標籤。Perceptron.m中的X,大致應該長這樣:
舉個例子(邏輯運算OR)
最後一列,只有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)));
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
最後,給出老師課件上的例子,可以自己試試看計算過程是不是一致的。
- 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池化) 定位