LMS最小均方算法

来源:互联网 发布:windows字体大小设置 编辑:程序博客网 时间:2024/06/02 20:34

LMS算法

一、LMS算法

全称 Least mean square算法。中文是最小均方算法。

感知器和自适应线性元件在历史上几乎是同时提出的,并且两者在对权值的调整的算法非常相似。它们都是基于纠错学习规则的学习算法。感知器算法存在如下问题:不能推广到一般的前向网络中;函数不是线性可分时,得不出任何结果。而由美国斯坦福大学WidrowHoff在研究自适应理论时提出的LMS算法,由于其容易实现而很快得到了广泛应用,成为自适应滤波的标准算法。

均方差这个概念的公式如下所示: 

这里写图片描述 1 
上述公式中的R表示正确的预期结果,C表示当前计算结果。这个便是LMS算法中终止算法的核心公式。 
如何得到当前计算结果C的公式如下所示: 
这里写图片描述 2 
i
表示输入值,W表示输入端所对应的权值,对这两个值进行乘法运算后,并求和。对于求和的结果可以进行一定处理,比如大于0O便为1;否则就为-1 
用于调整输入端权值的公式如下所示: 
这里写图片描述 3 
在算法运行时,不断利用公式(2)进行输入端的权值调整,使权值越来越接近正确值。其中w便是输入端所对应的权值,I是输入值,它表示学习参数,一般为小于1的正数。 

LMS算法步骤:

1,、设置变量和参量:

X(n)为输入向量,或称为训练样本

W(n)为权值向量

b(n)为偏差

d(n)为期望输出

y(n)为实际输出

η为学习速率

n为迭代次数

2、初始化,赋给w(0)各一个较小的随机非零值,令n=0

3、对于一组输入样本x(n)和对应的期望输出d,计算

e(n)=d(n)-Xn^W(n)

W(n+1)=W(n)+ηX(n)e(n)

4、判断是否满足条件,若满足算法结束,若否n增加1,转入第3步继续执行。

二、代码

 LMS(Least Mean Squre)算法
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
输入参数:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     xn   
输入的信号序列      (列向量)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     dn   
所期望的响应序列    (列向量)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     M    
滤波器的阶数        (标量)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     mu   
收敛因子(步长)      (标量)     要求大于0,小于xn的相关矩阵最大特征值的倒数    
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     itr  
迭代次数            (标量)     默认为xn的长度,M<itr<length(xn)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
输出参数:
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     W    
滤波器的权值矩阵     (矩阵)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%          
大小为M x itr,
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     en   
误差序列(itr x 1)    (列向量)  
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif%     yn   
实际输出序列             (列向量)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
参数个数必须为4个或5
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifif nargin == 4                 % 4
个时递归迭代的次数为xn的长度 
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    itr = length(xn);
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifelseif nargin == 5             % 5
个时满足M<itr<length(xn)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    if itr>length(xn) | itr<M
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif        error('
迭代次数过大或过小!');
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    end
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifelse
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    error('
请检查输入参数的个数!');
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifend
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
初始化参数
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifen = zeros(itr,1);             % 
误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifW  = zeros(M,itr);             % 
每一行代表一个加权参量,每一列代表-次迭代,初始为0
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
迭代计算
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giffor k = M:itr                  % 
k次迭代
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    x = xn(k:-1:k-M+1);        % 
滤波器M个抽头的输入
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    y = W(:,k-1).' * x;        % 
滤波器的输出
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    en(k) = dn(k) - y ;        % 
k次迭代的误差
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    % 
滤波器权值计算的迭代式
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    W(:,k) = W(:,k-1) + 2*mu*en(k)*x;
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifend
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
求最优时滤波器的输出序列
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifyn = inf * ones(size(xn));
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.giffor k = M:length(xn)
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    x = xn(k:-1:k-M+1);
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    yn(k) = W(:,end).'* x;
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gifend