径向基神经网络-算法原理与自实现
径向基
OLS算法代码DEMO
作者 : 老饼 日期 : 2022-06-17 02:21:40 更新 : 2022-06-29 01:27:11
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com



本文展现OLS(Orthogonal least squares)算法的Demo代码,

是 《OLS(Orthogonal least squares) 正交最小二乘算法》的实现

通过本代码,更细节了解OLS的细节,与查看OLS的效果。并验证算法理解的正确性。





  01. 代码说明  


代码由 数据生成变量初始化逐列添加 和 结果打印 四部分组成。


代码以随机生成一组数据为例,使用OLS算法,每步以误差下降最大化,贪婪式逐个添加变量,直到所有变量完全添加进来。
最后展示误差随着每个变量的添加,而逐步下降的过程。





  02. 具体代码  


matlab2014b亲测已跑通:


%代码说明:OLS(Orthogonal least squares) 正交最小二乘算法的Demo代码
%来自《老饼讲解神经网络》bp.bbbdata.com ,matlab版本:2014b,转载请保留
%-----------------------------------------------------
%---------数据生成-----------
rand('seed',70);
sn = 30; % 样本个数
n = 10;   % 列数
A=rand(sn,n); % 随机生成数据
y = A*rand(n,1); %生成y

% --------变量初始化----------------
S    = [];                            % 初始化已选池
R    = A;                             % 初始化待选池
sR   = A*(diag(1./sqrt(sum(A.*A)))) ; % 初始化标准待选池:A标准化
Erc  = [y'*y];                        % 初始化误差
dErc = [];                            % 初始化误差变化量

%-----------逐列选择--------------------
for i  = 1:n
    % ----计算误差下降量并找出本轮选择的列-----
    dE           = (y'*sR).^2;       % 计算待选池中各列下降的误差
    [max_dE,idx] = max(dE);          % 找出误差下降最大的列
    
    % -----更新已选池、待选池、标准待选池-----
    S         = [S,R(:,idx)];        % 添加到已选池
    R(:,idx)  = [];                  % 在待选池中移除
    sR        = sR - sR(:,idx)*sR(:,idx)'*sR./(sR(:,idx)'*sR(:,idx));  % 标准待选池与本次选出的列正交
    sR        = sR*(diag(1./sqrt(sum(sR.*sR)))) ;                      % 标准待选池单位化
    sR(:,idx) = [];                  % 移除本次选择的列 
    
    % -----计算本轮误差与并添加到误差记录-------
    x    = inv(S'*S)*S'*y;   % 最小二乘求解最佳x
    e    = sum((S*x-y).^2);  % 当前误差
    dErc = [dErc;max_dE];    % 记录本次下降误差
    Erc  = [Erc;e];          % 添加本次误差记录
end
% ----------打印结果----------------------------
dErc   % 打印误差下降记录
Erc(2:end,2) =Erc(1:end-1,1)-Erc(2:end,1)  % 打印误差记录与误差下降记录
plot([0,1:size(Erc,1)-1],Erc(:,1),'*-')   % 画出误差下降曲线





  03. 代码运行结果解说  


运行代码后,结果如下:

1、误差下降曲线






2、误差记录与误差变化量



从误差变化量可以看到,添加第1列时,误差下降了176.116,而后续越来越小,

说明算法是如我们所望,有效的,每次都贪婪式选择最大的误差下降。





  04. 疑惑分析  


  疑 惑  


而细心些,会留意到,在《误差记录与误差变化量》中,
添加第9个变量(倒算第二行)时,误差下降了0.0828,而第10个变量却下降了0.1694,为什么会这样呢?
不是每次都选择最大的误差下降了吗?为什么第10次下降的误差比第9次的还大?



  疑惑分析  



这是因为第10次有了第9次选出的列的参与,才能下降0.1694,
如果在第9步的时候,直接选择第10个变量,就不会下降0.1694误差了。


我们不妨在第9次时打印出两列的误差下降:


    

可以看到,如果在第9步选择另一个变量,误差只下降0.0348,反而不如0.082大。




  附 件  



在第9次打印出两列的误差下降量的代码:


    if(i==9)
        % 计算选择列1时的误差下降量
        S1=[S,R(:,1)];
        x1 = inv(S1'*S1)*S1'*y;
        de1 = Erc(end)-sum((S1*x1-y).^2)
        
        % 计算选择列2时的误差下降量
        S2=[S,R(:,2)];
        x2 = inv(S2'*S2)*S2'*y;
        de2 = Erc(end)-sum((S1*x2-y).^2)
    end


添加到for 循环的开始位置,如下:


 




 End 







联系小饼