机器学习笔记之LMS算法

对于一个基本的神经网络结构,我们可以容易得出其性能参数并求得最小值,但是需要求矩阵的逆矩阵,这在大规模神经网络的情况下显然是不可行的,
所以我们需要找到一种算法来求得性能参数曲面的最小值。关于LMS算法的理论推导就不贴在这了,有兴趣可以参考Martin T.Hagan等人编著的神经网络
设计这本书,里面讲的很详细。

机器学习笔记之LMS算法_第1张图片
下面就以上图所示模型为例,贴出LMS算法核心部分的伪代码:

for n=1:k                                          //以两输入为例
    a(n) =w1(n)*p1(n)+w2(n)*p2(n);                 //a(n)为实际神经元输出
    e(n)=t(n)-a(n);                                //e为误差,即期望输出与实际输出之差
    w1(n+1)=w1(n)+2*alpha*e(n)*p1(n);              //关于这两个式子可以参考教材推导过程
    w2(n+1)=w2(n)+2*alpha*e(n)*p2(n); 
end

下面将LMS算法应用于一个实际例子中(信号的预测)
机器学习笔记之LMS算法_第2张图片
y(k)=sin(kπ/5)
如图所示,该结构为一个信号预测网络,由y(k-1)与y(k-2)预测y(k)的值
可求得性能参数空间
这里写图片描述
MATLAB程序代码如下:

clc;
clear; 
close all; 
[h1,h2]=meshgrid(-2:0.1:4,-4:0.1:2);
J=0.5*h1.^2+0.5*h2.^2+0.809*h1.*h2-0.809*h1-0.309*h2+0.5;
figure(1)
contour(h1,h2,J);
xlabel('w1');
ylabel('w2');
title('误差性能曲面');
hold on
w1(1) = 0;
w2(1) = 0;
alpha=0.5;                    
for n=1:43
    y(n) = sin(n*pi/5);
end
for n=3:43                                      //做了40次迭代
    t(n-2) = y(n);
    v1(n-2) =w1(n-2)*y(n-1)+w2(n-2)*y(n-2);     
    e(n-2)=t(n-2)-v1(n-2);  
    w1(n-1)=w1(n-2)+2*alpha*e(n-2)*y(n-1);     
    w2(n-1)=w2(n-2)+2*alpha*e(n-2)*y(n-2); 
end
plot(w1,w2,'-')
hold off
figure(2)
plot(w1)
hold on
plot(w2,'r')
hold off
title('权重变化曲线')
figure(3)
plot(v1,'r')
hold on
plot(y)
hold off
title('输出与期望信号对比图')

结果如下:
机器学习笔记之LMS算法_第3张图片
图上蓝色线为每次迭代后权值的坐标值,该性能参数曲面的最小值在(1.6179,-0.9999)处,所以可由图得出该算法是收敛的。
机器学习笔记之LMS算法_第4张图片
由图可得,w1和w2分别收敛于最小值坐标处。
机器学习笔记之LMS算法_第5张图片
该图可以得出,输出信号逐渐逼近期望信号。

你可能感兴趣的:(机器学习)