采用感知器学习规则,训练步骤如下:
Step 1:
对各权值w0j(0), w2j(0), …, w nj(0), j=1, 2, …, m (m 为计算层的节点数)赋予较小的
非零随机数,设置p=1;
Step 2:
输入样本对{X p,d p},其中X p = (-1, x1
p, x2
p , …, x n
p), d p = (d1
p, d2
p , …, d n
p)为期望
的输出向量(教师信号),上标p 表示样本对的模式序号,设样本总数为P,则p = 1, 2, …, P;
Step 3:
计算各节点的实际输出p ( ) sgn( T ( ) p ), 1,2,...,
j j o t W t X j m
Step 4:
调整各节点对应的权值,( 1) ( ) [ p p ( )] p
j j j j W t W t d o t X
η为学习率,用于控制调整速度,η值太大会影响训练的稳定性,太小则使训练的1 2 ( , ,..., ..., )T
j m 输出层O o o o o
输入层 1 2 ( , ,..., ,..., ) j m W W W W W
0 1 2 ( , , ,..., ,..., )T
i n X x x x x x
单层感知器模型
1 ... ... j m o o o
1 j m W W W
0 1 2 ... ... i n x x x x x
2
收敛速度变慢,一般取0<η≤1;
Step 5:
p=p+1,如果p ≤P,返回到Step2 ,否则转到Step 6 ;
Step 6:
如果感知器对所有样本的实际输出与期望输出相等,则停止;否则设置p=1,返回Step2。
四、实验步骤:
1. 用单层感知器实现“与”运算
“与”运算真值表:
x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1
得到输入样本和对应的期望输出:
X1=[-1, 0, 0] d1=0
X2=[-1, 0, 1] d2=0
X3=[-1, 1, 0] d3=0
X4=[-1, 1, 1] d4=1
(1) 打开Matlab
双击桌面,打开Matlab 主程序
(2) 建立新文件
通过菜单选择File New M-File 或者点击左上角建立一个新文件
(3) 编程
*提示,在Matlab 主窗口输入help+空格+命令,可以看到关于该命令使用方法即作用的的具体说明
流程:
Step1:
function main() %建立函数,可用其他名字
close all %关闭所有figure
rand('state',sum(100*clock)) %随机数种子用时钟进行初始化
Step 2:
设置样本数量P,对输入样本和期望输出赋值
设置感知器参数(输入样本维数,输出维数,最大训练次数,学习率%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
%关于赋值的例程(黑色字体为程序,蓝色字体为Matlab 运行结果):
a=1; %单值赋值(注意:A 与a 是两个不同变量)
A=2;%分号:只运算不显示逗号或者结尾没有符号:即运算又显示
M=[1,2;3,4]; %矩阵赋值
>> M=[1,2;3,4];
>> M,
M =
1 2
3 4
>> M(1,:)%矩阵的第一行
ans =
1 2
>> M(:,1)%矩阵的第一列
ans =
3
>> M(:,1)=[0 0];%可单独操作一列一行或者一个元素(如M(1,1)=0;)>> M
M =
0 2
0 4
>> Err=[];%Err 初始为空
Err=[Err 1];%加入新的元素
Err=[Err 2];%再次加入
Err=[Err 4];%向量的元素可以以这种方式不断增加
Err
Err =
1 2 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%
Step 3:感知器训练
权值初始化
设置阈值
合并阈值与权值得到扩展权值
从1 到最大迭代次数,不断迭代计算
每次均依次输入样本1-4,由o p-d p 得到误差,计算新的权向量
使用单极点二值变换函数
1 0
( )
0 0
x
f x
x
记录下每次调整后的权值
每次迭代计算后,计算并记录总误差,如果总误差为0,则停止迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%
%关于循环和矩阵运算和其他一些涉及到运算的例程:
>>M=[];
for i=1:5
M=[M;[i,i.^2]];
4
end
M
M =
1 1
3 9
4 16
5 25
>> M.*M %点乘
ans =
1 1
4 16
9 81
16 256
25 625
>> M' %“' ”为转置运算
ans =
1 2 3 4 5
1 4 9 16 25
>> M*M' %叉乘,
ans =
2 6 12 20 30
6 20 42 72 110
12 42 90 156 240
20 72 156 272 420
30 110 240 420 650
>> a=1:5;
for i=1:5
i
if a(i)==3,break,end %如果a(i)=3 则跳出循环end
i =
1
i =
2
i =
3
>> x=0.1;
if x>=0
f=1;
5
else
f=0;
end
f,
f =
1
>> x=0.1;
f=(x>=0)%逻辑运算
f =
1
>> x=-0.1;
f=(x>=0)
f =
>> rand(1,5)%产生一个一行5 列的随机数矩阵
ans =
0.1576 0.9706 0.9572 0.4854 0.8003
>> sum([1,2,3]) %求和运算
ans =
6
>> abs(-5) %绝对值运算
ans =
5 %%%%%%%%%%%%%%%%%%%%%%%%%%% Step 4:显示结果
画出收敛曲线,即每次迭代后的总误差
画出权值的变化曲线
画出样本的分布和分界线w1x1+w2x2-T=0 %%%%%%%%%%%%%%%%%%%%%%%%%%% %关于结果显示和画图的例程
>> figure%画图
hold on%每次画图都画在同一个图上,不覆盖
grid on%显示网格
x=1:10;
f=x.^2;
plot(x,f,'b--');%具体看help plot
axis([0 10 0 120]);%设置轴的范围
xlabel('Inputx')%设置x 轴的标签
ylabel('Outputy')%设置y 轴的标签
disp(['f=[',num2str(f),']'])
f=[1 4 9 16 25 36 49 64 81 100]
6
0 1 2 3 4 5 6 7 8 9 10
20
40
60
80
100
120
Inputx
Outputy %%%%%%%%%%%%%%%%%%%%%%%%%%% 关于本题的显示示例:
The final Error is: 0.
The curren Epoch is: 3.
The Final W is:
0.72157
0.48814
The Final T is: 0.8.
The Result is:
x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1
0 2 4 6 8 10 12 14
0.65
0.7
0.75
0.8
0.85
W1
0 2 4 6 8 10 12 14
0.55
0.6
0.65
0.7
0.75
W2
权值的收敛曲线
7
1 1.5
2 2.5 3
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Epoch
Error
误差的收敛曲线
-1 -0.5 0 0.5 1 1.5 2
-1
-0.5
0.5
1
1.5
2
Inputx
Outputy
样本分布及分界线示意
(4) 保存文件
通过菜单选择File Save,或者点击左上角,或者使用快捷键Ctrl+S
(5) 运行及调试程序
点击上方,或者使用快捷键F5。
针对提示的错误的位置修改程序,直到正确运行。
*注意检查变量矩阵的字母大小写,矩阵叉乘是否需要转置。
(6) 存储图像
在图上通过菜单选择File Save,或者使用快捷键Ctrl+S
再Edit Copy Figure,将图粘贴到word 上作为实验报告的依据。
(7) 设置阈值T=0.1,改变学习率观察收敛曲线的收敛情况,对每个不同的学习率,分别运行程序10 次,将所用迭代次数的平均值填入下表:
学习率η0.01 0.05 0.1 0.5 1 2 10
迭代次数
*提示:可以利用for 循环直接接到该表结果
(8) 设置学习率η=0.1,改变学习率观察收敛曲线的收敛情况,对每个不同的阈值T,分别运行程序10 次,将所用迭代次数的平均值填入下表:
阈值T 0.01 0.05 0.1 0.5 1 2 10
迭代次数
(9) 设置学习率η=0.1, 设置阈值T=0.1,运行程序10 次,记录下迭代次数平均值,再将变换函数改为单极点Sigmoid 函数,再运行程序10 次,记录下迭代次数平均值。
变换__