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

本文详细介绍了最小二乘法及其加权版本在数据拟合中的应用,展示了如何通过加权最小二乘法对时间序列数据进行更精确的预测,特别是强调了近期数据的重要性。并提供了Matlab代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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')

加权最小二乘算法(Weighted Least Squares, WLS)是一种常用的数据拟合方法,它在最小二乘法的基础上引入了权重因子,用于调整不同数据点对拟合结果的贡献程度。在MATLAB中,可以使用以下步骤实现加权最小二乘算法: 1. 准备数据:将需要拟合的数据准备好,包括自变量和因变量。 2. 定义权重因子:根据实际需,为每个数据点定义一个权重因子,用于调整其对拟合结果的贡献程度。 3. 构建拟合模型:根据实际情况选择合适的拟合模型,例如线性模型、多项式模型等。 4. 定义目标函数:根据拟合模型和权重因子,定义目标函数,通常是残差平方和。 5. 最小化目标函数:使用MATLAB中的优化函数(如fmincon、lsqnonlin等)来最小化目标函数,得到拟合结果。 以下是一个示例代码,演示了如何使用加权最小二乘算法拟合数据: ```matlab % 准备数据 x = [1, 2, 3, 4, 5]; y = [2, 4, 6, 8, 10]; % 定义权重因子 weights = [1, 1, 1, 2, 2]; % 构建拟合模型 fun = @(c, x) c(1) * x; % 定义目标函数 obj = @(c) sum(weights .* (y - fun(c, x)).^2); % 初始参数猜测 c0 = 1; % 最小化目标函数 c = fmincon(obj, c0); % 输出拟合结果 disp(['拟合参数 c = ', num2str(c)]); % 绘制拟合曲线 xx = linspace(min(x), max(x), 100); yy = fun(c, xx); plot(x, y, 'o', xx, yy); ``` 这段代码中,我们假设数据点的权重因子分别为[1, 1, 1, 2, 2],拟合模型为一次线性模型。通过最小化目标函数,得到拟合参数c,并绘制出拟合曲线。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值