使用多層感知機解決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:蟹先森愛學習 |