的
算法
——神经网络导论实验一
二〇一〇年十月十六日
1
一 实验目的
1 通过实验了解 Adaline的工作原理;
2 对比 LMS 的三种算法,并通过上机实验掌握具体实现方法;
3 与采用硬限幅函数的单个神经元模型进行对比,比较其异同。
二 实验原理
1 基本原理
我们已经知道,采用硬限幅函数的单个神经元,通过简单的学习算法可以完成线性可分
类的分类功能。但对于大多数的非线性可分类问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,则无法完成分类。为此我们转向采用具
有线性功能函数的神经元 Adaline方法。
设输入矢量
1 2[ , , ]Nx x xX ,加权矢量 1 2[ , , ]Nw w wW ,则神经元的输出为:
( )
T T
T T
I
y f I
WX XW
WX XW
按照最小二乘法,需要均方误差最小,即:
2 2
2
( ) [( ) ]
( ) 2T T
E E d y
E d
WRW PW
其中 [ ]TER X X 是输入向量的自相关矩阵, ( )E dP X 是输入向量和期望输出的互相关
向量,通过求梯度得到的最优权值为:
* 1W PR
这种算法需要大量的运算,比较难以实现。于是有了以下递推算法。
2 LMS 学习问题的严格递推学习算法
1) 任意设置初始加权矢量 (0)W ;
2) 对每一个时序变量 k,按照下式调整权值向量:
( 1) ( ) 2 [ ( ) ( )]k k E k k W W X
其中右侧第二项为误差均方梯度, 为步幅系数。
这种方法克服了矩阵求逆的困难,但是仍需大量的统计运算。
3 LMS 的随机逼近算法
将严格递推算法的递推公式修正为如下形式:
( 1) ( ) 2 ( ) ( )k k k k W W X
即得到了随机逼近算法。此时步幅系数 需要满足一定的条件才能保证学习的收敛性。
4 LMS 的最陡下降学习算法
将递推公式修正为如下形式:
( 1) ( ) 2 ( ) ( )p p
p
k k k k W W X
2
其中用误差平方和代替了误差均方。这种算法是严格递推和随机逼近的中和算法,如果 p值
取的很大,则相当于严格递推算法,相反,若 1p 那么,其相当于随机逼近算法。
三 实验内容
1 样本矢量1
根据给出的样本值(lms_samp.mat)的数据,得到样本如图 1 表示。其中红色和蓝色的
点分别是输入的两类样本,黑色的线是其理想分界线。
图 1 输入样本分布
2 LMS 算法2
1) 设阈值为零情况下
根据给出的数据在 MATLAB®下运算得到如下结果。
2.0106 1.1515
;
1.1515 1.7398
R
1.1058 1.0074 ;P
* 0.3517 0.3463 ;W
2
min( ) 0.2623E
2) 阈值待定的情况下
根据样本数据得到的运算结果如下。
-3 -2 -1 0 1 2 3
-3
-2
-1
0
1
2
3
3
2.0106 1.1515 0.0269
1.1515 1.7398 0.0422 ;
0.0269 0.0422 1.0000
R
1.1058 1.0074 0 ;P
* 0.3516 0.3469 , 0.0241; W
2
min( ) 0.2617E
根据给出的样本分布可以知道,认为阈值为零是合理的,从忽略阈值和计算阈值两种情
况的得到的结果来相比较可以知道,认为阈值为零确实是合理的。
3 随机逼近算法3
在步幅系数选择为 0.01 ,最小误差为
min 0.001 0.2633E 的条件下,在 MATLAB
下编程计算,得到某一次的相应结果如下。
权值向量
[0.3365 0.3365];W
均方误差曲线
图 2 随机逼近算法均方误差曲线
可以看到,经过 38 次的迭代算法,最后均方误差收敛到的计算阈值 0.2633。
4 不同的步幅系数对迭代步数的影响
表 1 给出了在不同的步幅系数的条件下测试随机逼近算法达到收敛时的迭代次数。
0 5 10 15 20 25 30 35 40
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
迭代次数 N
均
方
误
差
E
4
表 1 不同步幅系数下随机逼近法的迭代次数
1 2 3 4 5 平均迭代次数
0.002 299 237 259 240 265 260.00
0.008 63 55 65 47 92 64.40
0.020 18 17 27 20 16 19.60
0.100 5 20 24 2 19 14.00
0.300① 17 282 107 34 6 89.20
从表 1 可以看到,一般来说,步幅系数选择的越大,需要的迭代次数越少,这是因为,
在初始权值即初始分界线斜率确定的情况下,步幅系数越大,在每次迭代运算中,接近最佳
分界线的速度越快,这样,就会越快的收敛到最佳分界线即最佳权值附近。
但是,当步幅系数超过一定的值以后,就可能需要更多的迭代次数,甚至可能出现不收
敛的情况,原因也很简单,步幅系数给的太大,分界线斜率一次改变过多,就容易导致其“转
过头了”,反而需要更多的次数接近最佳权值。如果不幸的是这样过大的偏转可能导致其越
来越远的偏离最佳斜率,这样就导致了不收敛的情况。
5 最陡下降算法4
在步幅系数选择为 0.02 ,最小误差为
min 0.001 0.2633E 的条件下,在 MATLAB
下编程计算,得到某一次的相应结果如下。
权值向量 [0.3516 0.3240];W
均方误差曲线
图 3 最陡下降法的均方误差曲线
①
步幅系数为 0.3 时的结果中忽略了结果中不收敛时的迭代次数。
0 5 10 15 20 25 30
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
迭代次数 N
均
方
误
差
E
测试
序号 步幅
系数
5
可以看到,经过 29 次的迭代算法,最后均方误差收敛到的计算阈值 0.2632。
6 不同样本数目对迭代次数的影响
表 2 给出了在不同的样本数目下的最陡下降算法达到收敛时的迭代次数。
表 2 不同样本数目下的最陡下降法迭代次数
1 2 3 4 5
迭代次数
均值/方差
1 23 20 26 29 28 25.20/13.70
2 24 29 43 40 21 31.40/94.30
5 27 29 32 26 25 27.80/7.70
50 24 26 27 23 29 25.80/5.70
150 27 26 26 27 26 26.40/0.30
从测试的结果来看,在步幅系数确定的情况下,样本数选择逐渐增大时,收敛次数越趋
于稳定。对于这点的解释是,样本数选择比较少时,在步幅系数一定时,权值的改变量随机
性比较强,故而达到收敛的步数变化较大。当样本数增多时,每次权值的改变趋于期望,因
此收敛步数变化很小,迭代的过程比较稳定。
5 检验
带入测试样本到以上得到的权值中,得到检验结果如表 3,总体样本数为 200 个。
表 3 检验结果
算法 权值 W 判错次数 正确率
LMS 算法 [0.3517 0.3463] 10 95%
随机逼近算法 [0.3365 0.3365] 10 95%
最陡下降算法 [0.3516 0.3240] 10 95%
各种算法结果如图 4 所示。
图 4 检验样本和各种算法结果
-4 -3 -2 -1 0 1 2 3 4
-3
-2
-1
0
1
2
3
最陡下降算法
LMS算法
随机逼近算法
测试
序号 步幅
系数
6
0 5 10 15 20 25 30
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
迭代次数 N
均
方
误
差
E
1 2 3 4 5
0.26
0.28
0.3
0.32
0.34
0.36
0.38
迭代次数 N
均
方
误
差
E
0 100 200 300 400 500
0
1
2
3
4
5
x 10
50
迭代次数 N
均
方
误
差
E
6 Widrow 严格递推算法5
根据 Widrow 的严格递推算法,在误差
min 0.2633E 条件下,在不同的步幅系数条件
下,得到运算的均方误差曲线如下。
这些结果和步骤 4 得到的结果类似,当步幅系数增大的时候,迭代步数加快,但是步幅
系数过大的时候,会导致结果发散。
四 思考
1 实验中将线性函数换做硬限幅函数,会导致什么现象?
前面所叙述和应用的 LMS矩阵算法以及三种递推算法,都是基于传递函数是现行函数
( ) Ty f I I WX
得到的,线性函数的相比于硬限幅函数,在这里其最大的特点就是线性函数是可微的。LMS
算法基于上式右侧递推得到,三种递推算法的核心递推环节通过求导得到,因此,失去线性
函数的条件,而换成硬限幅函数作为传递函数,以上算法均无法进行。
图 5 =0.02
2 4 6 8 10
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
迭代次数 N
均
方
误
差
E
图 6 =0.05
图 7 =0.1 图 8 =0.35(不收敛)
图 5~8 不同步幅系数下 Widrow 严格递推算法的均方误差曲线
7
0 2 4 6 8 10 12 14 16 18 20
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
迭代次数 N
均
方
误
差
E
若采用硬限幅函数,那么我们只能运用硬限幅函数的权值递推式来求权值6
( 1) ( ) ( ) ( ) ( )k k d k y k k W W X
通过上式进行递推即可以得到权值,其中为步幅系数,传递函数为
1, 0
hardlims( )
1, 0
I
y I
I
得到权值为
[0.0509 0.0542]W
由此得到一组权值和典型的均方误差曲线如下图。
从采用硬限幅函数得到的均方误差曲线开看,其不会出现如使用线性函数一样表现的较
为平滑,而是突变,比较明显。迭代过程中常常会有均方误差增大的情况。
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
其原因在于,使用硬限幅函数以后,权值迭代式的 ( ) ( )d k y k 项非 0 即 2,所以
可能迭代多次,权值也不会发生变化,发生变化时一定是发生突变。
收敛情况与步幅系数相关,较小的步幅系数收敛较慢,太大则可能导致不收敛。在步幅
系数一定时,收敛的步数不稳定,变化较大。
2 比较随机逼近法和最陡下降法的均方误差曲线随时序变量变化的不同并解释原因。
通过上面的分析和图示很明显的可以看出,随着变量数目增多,均方误差曲线趋于平滑,
原因很简单,就是因为取的样本数目越多,权值改变量越趋于期望值,这样,就以一个更加
稳定的速率收敛到了最佳权值附近,故而曲线越平滑。
0 5 10 15 20 25 30
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
迭代次数 N
均
方
误
差
E
图 9 采用硬限幅函数的典型均方误差曲线
8
参考源代码
1 样本绘图代码
%% 画图
clear;clc;clf;
load('C:\Users\TX\Desktop\lms_tstsamp.mat');
for i = 1:length(tstsamp)
if tstsamp(i,3) == 1
plot(tstsamp(i,1), tstsamp(i,2), 'b*');hold on;
elseif tstsamp(i,3) ==-1
plot(tstsamp(i,1), tstsamp(i,2), 'ro');hold on;
end
end
for theta = 0:0.02:(2*pi-0.02)
xx1 = -1 + 1.7*cos(theta);
xx2 = xx1 + 2;
yy1 = -1 + 1.7*sin(theta);
yy2 = yy1 + 2;
plot(xx1, yy1, ':r');hold on;
plot(xx2, yy2, ':b');hold on;
end
f = @(x)(-x);
fplot(f,[-3 3],'k');hold on;
axis([-3 3 -3 3]);
axis equal;grid on;
2 LMS算法代码
%% LMS 算法
% 忽略阈值的结果
x = samp(1:200,1:2);
R(1:2, 1:2) = 0; P(1:2) = 0; d(1:200) = 0; dd=0;
for i = 1:200
d(i) = samp(i,3);
dd =dd + d(i)*d(i);
P = P + d(i)*x(i,1:2);
xx = (x(i,1:2))'*x(i,1:2);
R(1,1) = R(1,1) + xx(1,1); R(1,2) = R(1,2) + xx(1,2);
R(2,1) = R(2,1) + xx(2,1); R(2,2) = R(2,2) + xx(2,2);
end
R = R/200; P = P/200; dd = dd/200;
W = P*(inv(R));
E_min = dd - P*(W');
disp('W=');disp(W); disp('E_min=');disp(E_min);
%% LMS 算法
% 考虑阈值的结果
load('C:\Users\TX\Desktop\lms_samp.mat');
x = samp(1:200,1:2); x(:,3) = 1;
R(1:3, 1:3) = 0; P(1:3) = 0; d(1:200) = 0; dd=0;
for i = 1:200
d(i) = samp(i,3);
dd =dd + d(i)*d(i);
P = P + d(i)*x(i,1:3);
xx = (x(i,:))'*x(i,:);
for j = 1:9
R(j) = R(j) + xx(j);
end
end
R = R/200; P = P/200; dd = dd/200;
W = P*(inv(R));
E_min = dd - P*(W');
disp('W=');disp(W); disp('E_min=');disp(E_min);
3 随机逼近算法代码
9
%% 线性函数单个神经元 LMS算法
% P=1 时为随机逼近算法,P=样本数目(200)时为严格递推,P 在 1~200之间为最陡下降算法
clear;clc;clf; load('C:\Users\TX\Desktop\lms_samp.mat');
% w 权值,x 输入变量, d 目标输出,alpha 步幅系数,count 迭代计数
% err 单一样本差错,dy 样本误差,averError 样本误差期望
x(:,:) = samp(:,1:2); d = samp(:,3); nTimes = length(samp);
w(1:2) = 0; averError = 10; alpha = 0.02; dy(1:nTimes) = 0; count = 1;
P = 1; err(1:P) = 0; xerr(1:P,1:2) = 0;
while averError >= 0.2633
randSeries = randperm(200);
rndIndex = randSeries(1:P);
for iIndex = 1:length(rndIndex)
err(iIndex) = d(rndIndex(iIndex)) - w*(x(rndIndex(iIndex),:)');
xerr(iIndex,:) = err(iIndex)*x(rndIndex(iIndex),:);
end
w = w + 2*alpha*mean(xerr);
for iTimes = 1:nTimes
dy(iTimes) = d(iTimes) - w*(x(iTimes,:)');
end
averError(count) = mean(dy.^2);
count = count + 1;
if count >=500
break;
end
end
plot(averError); xlabel('迭代次数 N'); ylabel('均方误差 E'); grid on;
disp('权值');disp(w); disp('迭代次数');disp(count-1);
disp('最小均方误差');disp(averError(count-1));
4 最陡下降法代码
将随机逼近算法中的 P变量值改为 0~200之间任意值(如 5)即最陡下降算法。
5 Widrow 严格递推算法代码
将随机逼近算法中的 P变量值改为 200即 Widrow严格递推算法。
6 使用硬限幅函数的递推算法代码
%该算法同样由随机逼近算法稍作修改得到,仅将其中递推部分做了修改,其余不变。
clear;clc;clf; load('C:\Users\TX\Desktop\lms_samp.mat');
x(:,:) = samp(:,1:2); d = samp(:,3); nTimes = length(samp);
w(1:2) = 0; averError = 10; alpha = 0.02; dy(1:nTimes) = 0; count = 1;
while averError >= 0.18
rndIndex = unidrnd(200);
y = hardlims(w*x(rndIndex,:)');
w = w + alpha*(d(rndIndex) - y)*x(rndIndex,:);
for iTimes = 1:nTimes
dy(iTimes) = d(iTimes) - hardlims(w*(x(iTimes,:)'));
end
averError(count) = mean(dy.^2);
count = count + 1;
if count >=500
break;
end
end
plot(averError); xlabel('迭代次数 N'); ylabel('均方误差 E'); grid on;
disp('权值');disp(w); disp('迭代次数');disp(count-1);
disp('最小均方误差');disp(averError(count-1));