【MATLAB技巧】【免费的小例程】线性拟合的多种方法:polyfit、矩阵、带权重、稳健回归

在这里插入图片描述

本文给出MATLAB进行线性拟合的详细示例及多种方法说明,附例程代码和运行结果

基础线性拟合(polyfit函数)

适用场景:单变量线性回归
代码实现

% 生成示例数据
x = [0, 0.5, 1, 2, 4, 6]';
y = [0, 0.21723, 0.43445, 0.99924, 2.43292, 4.77895]';

% 一阶多项式拟合(线性)
P = polyfit(x, y, 1);% P返回系数 [β1, β0]
y_fit = polyval(P, x);

% 绘图
plot(x, y, 'ko', 'MarkerFaceColor', 'k'); hold on;
plot(x, y_fit, 'r--', 'LineWidth', 2);
xlabel('x'); ylabel('y');
legend('原始数据', '拟合直线');

输出说明

  • P(1)为斜率(β1),P(2)为截距(β0)。
  • 结果误差可通过残差平方和评估:RSS = sum((y - y_fit).^2)

在这里插入图片描述

矩阵法求解正规方程

适用场景:多元线性回归(含截距项)
数学原理
通过最小二乘法求解参数向量:
β ^ = ( X T X ) − 1 X T Y \hat{\beta} = (X^T X)^{-1} X^T Y β^=(XTX)1XTY
其中设计矩阵 X X X需包含全1列以表示截距。

代码实现

clc; clear; close all;

% 数据矩阵构造(参考正规方程理论)
x = [0, 0.5, 1, 2, 4, 6]';
y = [0, 0.21723, 0.43445, 0.99924, 2.43292, 4.77895]';
% 正规方程求解(矩阵法)
beta_hat = (x'*x) \ (x'*y); % 核心公式:β = (X^T X)^{-1} X^T y

% 残差分析与误差计算
y_fit = x * beta_hat;
% 绘图
plot(x, y, 'ko', 'MarkerFaceColor', 'k'); hold on;
plot(x, y_fit, 'r--', 'LineWidth', 2);
xlabel('x'); ylabel('y');
legend('原始数据', '拟合直线');

优势:适用于多变量场景,可手动控制误差分析(如协方差矩阵计算)。
运行结果:
在这里插入图片描述

带权重的线性拟合

适用场景:数据存在异方差性(误差非均匀)
代码扩展

clc; clear; close all;
x = [0, 0.5, 1, 2, 4, 6]';
y = [0, 0.21723, 0.43445, 0.99924, 2.43292, 4.77895]';
y_error = [1,1,1,1,10,1]';
weights = 1 ./ y_error.^2;% 假设y_error为测量误差向量
% 加权最小二乘求解
W = diag(weights);  % 权重矩阵
beta_hat = (x' * W * x) \ (x' * W * y);
y_fit = x * beta_hat;

% 绘图
plot(x, y, 'ko', 'MarkerFaceColor', 'k'); hold on;
plot(x, y_fit, 'r--', 'LineWidth', 2);
xlabel('x'); ylabel('y');
legend('原始数据', '拟合直线');



说明

  • 加权最小二乘法通过调整weights参数实现,常用于仪器精度不同的数据。
    运行结果:

在这里插入图片描述

稳健回归(LIBRA工具箱)

适用场景:数据含异常值
实现步骤
下列代码含内嵌的函数,不能直接在命令行窗口运行,需要先粘贴到空脚本中,然后运行脚本

clc; clear; close all;
x = [0, 0.5, 1, 2, 4, 6]';
y = [0, 0.21723, 0.43445, 0.99924, 2.43292, 4.77895]';
beta_huber = huber_wls(x, y, 20);
y_fit = x * beta_huber;

% 绘图
plot(x, y, 'ko', 'MarkerFaceColor', 'k'); hold on;
plot(x, y_fit, 'r--', 'LineWidth', 2);
xlabel('x'); ylabel('y');
legend('原始数据', '拟合直线');

function beta = huber_wls(X, y, max_iter)
    % 初始化参数
    beta = X \ y;  % OLS初步估计
    c = 1.345;     % Huber参数
    
    for iter = 1:max_iter
        residuals = y - X*beta;
        sigma = 1.4826 * median(abs(residuals - median(residuals)));  % MAD估计
        r_std = residuals / sigma;
        
        % 计算Huber权重
        w = ones(size(r_std));
        outlier_idx = abs(r_std) > c;
        w(outlier_idx) = c ./ abs(r_std(outlier_idx));
        
        % 加权最小二乘更新
        W = diag(w);
        beta = (X'*W*X) \ (X'*W*y);
    end
end

优势:对离群点不敏感,适合实际工程数据。

运行结果:
在这里插入图片描述

误差分析与验证

  • 最大残差法:直接计算残差向量中绝对值最大的元素(如网页1中最大误差为0.0115);
  • 决定系数(R²)R_squared = 1 - sum((y - y_fit).^2)/sum((y - mean(y)).^2)
  • 置信区间:通过polyval的第二个输出参数delta可获得预测值的误差范围。

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值