机器学习笔记之LMS算法

来源:互联网 发布:python r语言 编辑:程序博客网 时间:2024/05/21 06:18
对于一个基本的神经网络结构,我们可以容易得出其性能参数并求得最小值,但是需要求矩阵的逆矩阵,这在大规模神经网络的情况下显然是不可行的,所以我们需要找到一种算法来求得性能参数曲面的最小值。关于LMS算法的理论推导就不贴在这了,有兴趣可以参考Martin T.Hagan等人编著的神经网络设计这本书,里面讲的很详细。

这里写图片描述
下面就以上图所示模型为例,贴出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算法应用于一个实际例子中(信号的预测)
这里写图片描述
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 onw1(1) = 0;w2(1) = 0;alpha=0.5;                    for n=1:43    y(n) = sin(n*pi/5);endfor 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); endplot(w1,w2,'-')hold offfigure(2)plot(w1)hold onplot(w2,'r')hold offtitle('权重变化曲线')figure(3)plot(v1,'r')hold onplot(y)hold offtitle('输出与期望信号对比图')

结果如下:
这里写图片描述
图上蓝色线为每次迭代后权值的坐标值,该性能参数曲面的最小值在(1.6179,-0.9999)处,所以可由图得出该算法是收敛的。
这里写图片描述
由图可得,w1和w2分别收敛于最小值坐标处。
这里写图片描述
该图可以得出,输出信号逐渐逼近期望信号。

1 0
原创粉丝点击