MATLAB 神经网络技术

 memo
 

前戏

加载MATLAB自带的噪声信号进行绘图。

1
2
3
4
>> clear all
>> close all
>> load noisdopp
>> plot(noisdopp)

绘制三元函数s=x²+y²+z²的可视化图形。

1
2
3
4
5
6
7
8
>> clear all;
>> x=linspace(-2,2,40);
>> y=x;
>> z=x;
>> [X,Y,Z]=meshgrid(x,y,z);
>> s=X.^2+Y.^2+Z.^2;
>> slice(X,Y,Z,s,[-1,0,1],[-1,0,1],[-1,0,1]);
>> colorbar

在MATLAB的命令窗口中输入help nnet,即可得到神经网络工具箱的有关版本信息及函数列表。

感知器神经网络

单层感知器网络不能模拟异或问题,这里用二层感知器神经网络模拟异或函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
>> clear all;
%初始化随机感知器层
>> pr1=[0 1;0 1]; %设置随机感知器层输入问题每个元素的值域
>> net1=newp(pr1,3);%定义随机感知器层
%指定随机感知器层权值初始化函数为随机函数
>> net1.inputWeights{1}.initFcn='rands';
%指定随机感知器层阈值初始化函数为随机函数
>> net1.biases{1}.initFcn='rands';
>> net1=init(net1);%初始化随机感知器层
>> iw1=net1.iw{1};%随机感知器层的权值向量
>> b1=net1.b{1};%随机感知器层的阈值向量
%随机感知器层仿真
>> p1=[0 0;0 1;1 0;1 1]';%随机感知器输入向量(训练样本)
>> [a1,pf]=sim(net1,p1);%随机感知器层仿真
%初始化第二感知器层
>> pr2=[0 1;0 1;0 1];%设置第二感知器层输入向量每个元素的值域
>> net2=newp(pr2,1);%定义第二感知器层
%训练第二感知器层
>> net2.trainParam.epochs=10;
>> net2.trainParam.show=1;
>> p2=ones(3,4);%初始化第二感知器层的输入向量
>> p2=p2.*a1;%随机感知器层的仿真输出结果作为第二感知器层的输入向量
>> t2=[0 1 1 0];%第二感知器层的目标向量
%训练第二感知器层
>> [net2,tr2]=train(net2,p2,t2);
>> disp('输出训练过程经过的每一步长为:')
输出训练过程经过的每一步长为:
>> epoch2=tr2.epoch %输出训练过程经过的每一步长

epoch2 =

0 1 2 3 4 5 6 7 8 9 10

>> disp('输出每一步训练结果的误差为:')
输出每一步训练结果的误差为:
>> perf2=tr2.perf %输出每一步训练结果的误差

perf2 =

Columns 1 through 9

0.5000 0.5000 0.5000 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500

Columns 10 through 11

0.2500 0.2500

>> disp('第二感知器层的权值向量为:')
第二感知器层的权值向量为:
>> iw2=net2.iw{1}

iw2 =

-1 -1 3

>> disp('第二感知器层的阈值向量为:')
第二感知器层的阈值向量为:
>> b2=net2.b{1}

b2 =

-1
%存储训练后的网络
>> save net36 net1 net2
%下面的代码实现二层感知器网络的仿真
>> clear all; %清除工作空间中的变量
>> load net36 net1 net2 %加载训练后的网络
%随机感知器仿真
>> p1=[0 0;0 1;1 0;1 1]'; %随机感知器层输入向量
>> a1=sim(net1,p1); %随机感知器层仿真结果
%输出感知器层仿真,并输出仿真结果
>> p2=ones(3,4);%初始化第二感知器层的输入向量
>> p2=p2.*a1;%随机感知器层的仿真输出结果作为第二感知器层的输入向量
>> a2=sim(net2,p2)
%运行程序,输出如下
a2 =

0 1 0 0
%由以上结果可看出所设计的网络可正确模拟“异或”函数的功能

设计一个感知器神经网络,完成下列分类,已知:p1=(0.5 -1)T,t1=0; p2=(1 0.5)T,t2=1;p3=(-1 0.5)T,t3=1;p4=(-1 -1),t4=0。

此单层感知器神经网络的结构:1个输入向量,包括2个元素、1个神经元,神经元的传输函数为hardlim。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>> clear all;
>> pr=[-1 1;-1 1];
>> net=newp(pr,1);
>> p=[0.5 -1;1 0.5;-1 0.5;-1 -1]';
>> t=[0 1 1 0];
>> [net,tr]=train(net,p,t);
>> a = sim(net,p)

a =

0 1 1 0

>> v=[-2 2 -2 2];
>> plotpv(p,a,v);
>> plotpc(net.iw{1},net.b{1});