當前位置:
首頁 > 最新 > 使用多層感知機解決XOR問題

使用多層感知機解決XOR問題

我們知道,單層的感知機可以進行線性分類,首個有關感知機的成果,由Rosenblatt於1958年發表在《ThePerceptron: A Probabilistic Model for Information Storage and Organization inthe Brain》里。1962年,他又出版了《Principles of Neurodynamics:Perceptrons and the theory of brain mechanisms》一書,向大眾深入解釋感知機的理論知識及背景假設。此書介紹了一些重要的概念及定理證明,例如感知機收斂定理。

雖然最初被認為有著良好的發展潛能,但感知機最終被證明不能處理諸多的模式識別問題。1969年,Marvin Minsky和Seymour Papert在《Perceptrons》書中,仔細分析了以感知機為代表的單層神經網路系統的功能及局限,證明感知機不能解決簡單的異或(XOR)等線性不可分問題,但Rosenblatt和Minsky及Papert等人在當時已經了解到多層神經網路能夠解決線性不可分的問題。

Marvin Minsky和Seymour Papert及XOR問題

由於Rosenblatt等人沒能夠及時推廣感知機學習演算法到多層神經網路上,又由於《Perceptrons》在研究領域中的巨大影響,及人們對書中論點的誤解,造成了人工神經領域發展的長年停滯及低潮,直到人們認識到多層感知機沒有單層感知機固有的缺陷及反向傳播演算法在80年代的提出,才有所恢復。1987年,書中的錯誤得到了校正,並更名再版為《Perceptrons -Expanded Edition》。

我們給出代碼如下:

close all; clear all; clc;

%% Define 4 clusters of input data

K = 100; % number of samples of each class

% define 4 clusters of input data

q = .6; % offset of classes

A = [rand(1,K)-q; rand(1,K)+q];

B = [rand(1,K)+q; rand(1,K)+q];

C = [rand(1,K)+q; rand(1,K)-q];

D = [rand(1,K)-q; rand(1,K)-q];

% plot clusters

figure(1)

plot(A(1,:),A(2,:),"k+")

hold on

grid on

plot(B(1,:),B(2,:),"bd")

plot(C(1,:),C(2,:),"k+")

plot(D(1,:),D(2,:),"bd")

% text labels for clusters

text(.5-q,.5+2*q,"Class A")

text(.5+q,.5+2*q,"Class B")

text(.5+q,.5-2*q,"Class A")

text(.5-q,.5-2*q,"Class B")

%% Define output coding for XOR problem

% encode clusters a and c as one class, and b and d as another class

a = -1; % a | b

c = -1; % -------

b = 1; % d | c

d = 1; %

%% Prepare inputs & outputs for network training

% define inputs (combine samples from all four classes)

P = [A B C D];

% define targets

T = [repmat(a,1,length(A)) repmat(b,1,length(B)) ...

repmat(c,1,length(C)) repmat(d,1,length(D)) ];

% view inputs |outputs

%[P" T"]

%% Create and train a multilayer perceptron

% create a neural network

net = feedforwardnet([5 3]);

% train net

net.divideParam.trainRatio = 1; % training set [%]

net.divideParam.valRatio = 0; % validation set [%]

net.divideParam.testRatio = 0; % test set [%]

% train a neural network

[net,tr,Y,E] = train(net,P,T);

% show network

view(net)

%% plot targets and network response to see how good the network learns the data

figure(2)

plot(T","linewidth",2)

hold on

plot(Y","r--")

grid on

legend("Targets","Network response","location","best")

ylim([-1.25 1.25])

%% Plot classification result for the complete input space

% generate a grid

span = -1:.005:2;

[P1,P2] = meshgrid(span,span);

pp = [P1(:) P2(:)]";

% simulate neural network on a grid

aa = net(pp);

% translate output into [-1,1]

%aa = -1 + 2*(aa>0);

% plot classification regions

figure(1)

mesh(P1,P2,reshape(aa,length(span),length(span))-5);

colormap cool

view(2)

待分類樣本如下:

訓練結果如下:

感知機的結構如下:

最後學習結果如下:

分類結果如下:

以上就是今天推送的內容,歡迎討論。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 蟹先森愛學習 的精彩文章:

TAG:蟹先森愛學習 |