最小二乘、加权最小二乘 matlab实现

1. 定义

最小二乘:

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小 。

最小二乘法还可用于曲线拟合,其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

加权最小二乘法:

一般最小二乘法将时间序列中的各项数据的重要性同等看待,而事实上时间序列各项数据对未来的影响作用应是不同的。一般来说,近期数据比起远期数据对未来的影响更大。因此比较合理的方法就是使用加权的方法,对近期数据赋以较大的权数,对远期数据则赋以较小的权数。加权最小二乘法采用指数权数W。

此处不做推导,网上一大堆,可自行查阅。

 2. Matlab-Code

此处权重设置为:W(i,i) = 0.95^i;

若权重设置为W(i,i) = 1;,那么它就是普通的最小二乘 T.T!。

function [fitY] = weightedLeastSquares(X, Y, order, fitX)
% X/Y: data of coordinate-x/y, (需要处理的坐标数据)
% Polynomial of (order_num) order,(拟合多项式-阶数)
% return fitY (返回值为拟合后的Y坐标)
    k = size(X, 2);
    % Construct the matrix X0
    X0 = zeros(order + 1, k);

    for k0 = 1:k           
        for n0 = 1 : order+1
            X0(n0, k0) = X(k0)^(order + 1 - n0);
        end
    end
    X = X0';

    % Construction weight matrix (这里就是最重要的权重系数)
    % W : i/k  or  (i/k)^2  or  (i/k)^3
    W = zeros(k);
    for i = 1:k
%         W(i,i) = 1;
%         W(i,i) = i/k;
        W(i,i) = 0.95^i;
    end
   
    % Coefficients of eigenvalues 
    Coeff = (X'*W*X) \ X'*W*Y';

    % Coefficient initialization && Constructing polynomial equation
    fitY = Coeff(1) * fitX.^order; 
    for i = 2:1:order+1     
        fitY = fitY + Coeff(i)*fitX.^(order+1-i);
    end 
end

3. 测试

输入一组坐标,计算一二阶对应拟合结果。 

dataX = [1 2 3 5 7 9 10 11 13 ]';
dataY = [1 3 4 5 6 7 10 14 16 ]';
plot(dataX,dataY,'*k')
hold on, plot(1:14, weightedLeastSquares(dataX', dataY', 1, 1:14),'-.r')
hold on, plot(1:14, weightedLeastSquares(dataX', dataY', 2, 1:14),'-.b')

猜你喜欢

转载自blog.csdn.net/u013271656/article/details/100554278