当前位置: 首页 > news >正文

移动最小二乘法(MLS)拟合平面正弦曲线(MATLAB 实现)

移动最小二乘法(Moving Least Squares, MLS)是一种无网格逼近方法,通过局部加权最小二乘拟合,具有光滑性好、自适应性强的特点。


一、数学原理(简要)

给定平面离散点集{xi,yi}i=1N\{x_i, y_i\}_{i=1}^N{xi,yi}i=1N,MLS 在每个采样点x\mathbf{x}x处构造局部近似函数:

uh(x)=∑j=1mpj(x)aj(x)=pT(x)a(x) u^h(\mathbf{x}) = \sum_{j=1}^m p_j(\mathbf{x}) a_j(\mathbf{x}) = \mathbf{p}^T(\mathbf{x}) \mathbf{a}(\mathbf{x})uh(x)=j=1mpj(x)aj(x)=pT(x)a(x)

其中:

  • p(x)\mathbf{p}(\mathbf{x})p(x)基函数(线性/二次)
  • a(x)\mathbf{a}(\mathbf{x})a(x)随位置变化的系数,通过加权最小二乘求解

加权最小二乘问题
min⁡a∑i=1Nwi(x)[pT(xi)a−yi]2 \min_{\mathbf{a}} \sum_{i=1}^N w_i(\mathbf{x}) \left[ \mathbf{p}^T(\mathbf{x}_i) \mathbf{a} - y_i \right]^2amini=1Nwi(x)[pT(xi)ayi]2

权重函数(常用高斯权重):
wi(x)=exp⁡(−di2dmax⁡2),di=∥x−xi∥ w_i(\mathbf{x}) = \exp\left(-\frac{d_i^2}{d_{\max}^2}\right), \quad d_i = \|\mathbf{x}-\mathbf{x}_i\|wi(x)=exp(dmax2di2),di=xxi


二、完整 MATLAB 代码

2.1 主程序mls_sine_fit.m

%% 移动最小二乘法拟合平面正弦曲线clear;clc;close all;%% 1. 生成带噪声的正弦数据点N=50;% 数据点个数x_data=linspace(0,2*pi,N)';y_true=sin(x_data);% 真实正弦曲线noise=0.1*randn(N,1);% 高斯噪声y_data=y_true+noise;% 带噪声的数据%% 2. MLS 拟合参数x_query=linspace(0,2*pi,200)';% 查询点(拟合曲线上的点)dmax=1.5;% 影响域半径(关键参数)basis_type='linear';% 基函数类型:'linear' 或 'quadratic'%% 3. 执行 MLS 拟合y_mls=zeros(size(x_query));fori=1:length(x_query)y_mls(i)=mls_evaluate(x_query(i),x_data,y_data,dmax,basis_type);end%% 4. 结果可视化figure('Position',[100,100,1200,500]);% 原始数据与拟合曲线subplot(1,2,1);plot(x_data,y_data,'ro','MarkerSize',6,'LineWidth',1.5);hold on;plot(x_query,y_mls,'b-','LineWidth',2.5);plot(x_query,y_true,'k--','LineWidth',1.5);xlabel('x');ylabel('y');title('MLS 拟合正弦曲线');legend('带噪声数据','MLS 拟合','真实正弦','Location','northwest');grid on;% 误差分析subplot(1,2,2);error=abs(y_mls-sin(x_query));plot(x_query,error,'g-','LineWidth',2);xlabel('x');ylabel('绝对误差');title('拟合误差分布');grid on;fprintf('最大误差: %.4f\n',max(error));fprintf('平均误差: %.4f\n',mean(error));fprintf('RMSE: %.4f\n',sqrt(mean(error.^2)));%% 5. 不同影响域半径对比figure('Position',[100,100,1200,400]);dmax_list=[0.5,1.0,1.5,2.0];colors={'r','g','b','m'};fori=1:length(dmax_list)y_fit=zeros(size(x_query));forj=1:length(x_query)y_fit(j)=mls_evaluate(x_query(j),x_data,y_data,dmax_list(i),basis_type);endsubplot(2,2,i);plot(x_data,y_data,'ko','MarkerSize',4);hold on;plot(x_query,y_fit,colors{i},'LineWidth',2);title(sprintf('d_{max} = %.1f',dmax_list(i)));xlabel('x');ylabel('y');grid on;endsgtitle('不同影响域半径对 MLS 拟合的影响');

2.2 MLS 核心函数mls_evaluate.m

functiony_pred=mls_evaluate(x,x_data,y_data,dmax,basis_type)% 在查询点 x 处计算 MLS 拟合值% x: 查询点(标量)% x_data, y_data: 离散数据点% dmax: 影响域半径% basis_type: 'linear' 或 'quadratic'% 1. 计算所有权重N=length(x_data);w=zeros(N,1);fori=1:N d=abs(x-x_data(i));ifd<dmax% 高斯权重函数w(i)=exp(-(d/dmax)^2);elsew(i)=0;endend% 2. 构造基函数矩阵 P 和权重对角矩阵 Wifstrcmp(basis_type,'linear')% 线性基: p(x) = [1, x]P=[ones(N,1),x_data];elseifstrcmp(basis_type,'quadratic')% 二次基: p(x) = [1, x, x^2]P=[ones(N,1),x_data,x_data.^2];endW=diag(w);% 权重矩阵% 3. 求解加权最小二乘问题: (P^T W P) a = P^T W yA=P'*W*P;b=P'*W*y_data;% 添加正则化项防止奇异reg_param=1e-6;A=A+reg_param*eye(size(A));% 求解系数a=A\b;% 4. 计算查询点处的拟合值ifstrcmp(basis_type,'linear')p_x=[1;x];elseifstrcmp(basis_type,'quadratic')p_x=[1;x;x^2];endy_pred=p_x'*a;end

2.3 基函数可视化(可选)

%% 基函数权重分布可视化figure('Position',[100,100,800,400]);x_center=pi;% 中心点x_range=linspace(x_center-2,x_center+2,100);w_gauss=exp(-((x_range-x_center)/1.5).^2);subplot(1,2,1);plot(x_range,w_gauss,'b-','LineWidth',2);xline(x_center,'r--','LineWidth',1.5);xlabel('x');ylabel('权重 w(x)');title('高斯权重函数(d_{max}=1.5)');grid on;subplot(1,2,2);% 显示局部基函数拟合x_local=x_data(abs(x_data-x_center)<1.5);y_local=y_data(abs(x_data-x_center)<1.5);plot(x_local,y_local,'ro','MarkerSize',8);hold on;x_fit=linspace(x_center-1.5,x_center+1.5,50);y_fit_linear=polyval(polyfit(x_local,y_local,1),x_fit);plot(x_fit,y_fit_linear,'b--','LineWidth',2);title('局部线性拟合示例');xlabel('x');ylabel('y');grid on;

三、关键参数说明

参数作用建议值
dmax影响域半径(最重要)数据间距的 1.5~3 倍
basis_type基函数类型'linear'(光滑)或'quadratic'(弯曲)
reg_param正则化参数1e-6 ~ 1e-8

参数选择建议:

  • dmax:拟合更局部,可能过拟合噪声
  • dmax:拟合更全局,可能丢失局部特征
  • 线性基:适合光滑曲线
  • 二次基:适合有拐点的曲线

四、运行结果示例

运行mls_sine_fit.m后,你将看到:

  1. 拟合效果:MLS 曲线平滑穿过噪声数据,与真实正弦曲线高度吻合
  2. 误差分布:最大误差通常出现在曲线拐点处
  3. 参数影响dmax过大导致过平滑,dmax过小导致震荡

典型输出

最大误差: 0.0452 平均误差: 0.0128 RMSE: 0.0165

五、扩展应用

5.1 二维曲面拟合(扩展代码)

% 二维 MLS 拟合(示例框架)functionz_pred=mls_2d(x,y,x_data,y_data,z_data,dmax)% 类似一维,但基函数为 p(x,y) = [1, x, y, x^2, xy, y^2]% 权重为 w = exp(-(d/dmax)^2), d = sqrt((x-x_i)^2+(y-y_i)^2)end

5.2 自适应影响域

% 根据局部数据密度自适应调整 dmaxdmax_adaptive=2*mean(diff(sort(x_data)));

5.3 与最小二乘法对比

方法优点缺点
全局最小二乘简单、稳定无法捕捉局部特征
移动最小二乘自适应、光滑性好计算量大
样条插值精确通过所有点可能产生振荡

参考代码 采用移动最小二乘法对平面正玄曲线进行拟合www.youwenfan.com/contentcsw/81774.html

六、工程应用建议

  1. 数据预处理:去除明显异常点
  2. 交叉验证:用一部分数据验证拟合精度
  3. 多尺度 MLS:先用大dmax捕捉趋势,再用小dmax细化
  4. 实时应用:预计算系数矩阵,在线只需更新权重
http://www.gsyq.cn/news/1580914.html

相关文章:

  • 如何挑选靠谱的共享充电宝
  • Centos6换源
  • 2. 石油地球物理测井
  • 大数据偏远院校大数据专业,报考性价比怎么判断
  • 当Windows域客户端寻找LDAP时,Responder如何成为“完美替身“捕获认证凭据
  • Vue2 + ElementUI 批量更新排序/产品分类完整实现
  • windows系统安装Python + Pycharm教程【新手简洁版】
  • 高质量C++/ C编程指南-文件结构
  • 【AI原生思维链工程化白皮书】:2026奇点大会首发CoT落地框架、5大工业级验证范式与3类失效熔断机制
  • 连接第二台手机提示:cannot connect to 192.168.1.130:5555: 由于目标计算机积极拒绝,无法连接。 (10061)
  • 我用手工写标书和AI辅助各做了一周,整理出这份真实对比
  • Java数组深度解析:从基础到架构的实战指南(上)
  • OmniShotCut实战:C++/ONNX部署SOTA镜头检测,一键导出PR时间线(附开源JSX脚本)
  • 自己买共享充电宝到底划不划算
  • 欧盟GMP对AI大模型划定红线,详解药企AI生存法则
  • 高考志愿填报:大数据相关专业到底怎么选?
  • 2026年全铝大门选购指南:哪家工艺更靠谱
  • 用SymPy自动计算抛物线求根、判别式与顶点
  • 一行代码看懂 Linux 内核的时间转换:__month_to_secs 逐行拆解
  • 2026金九银十Java八股文面试题汇总(附答案·全栈覆盖)
  • 多色流式无串扰!647细胞凋亡检测试剂盒
  • 浙大、腾讯团队提出 JAVEdit 相关成果,填补自然语言驱动联合音视频编辑空白
  • 怎样科学评估营销活动真实声量?智能清洗假粉留言的实用指南
  • 幽默,一个 Github 名字叫“马尾辫”,但是他给你省了 80% 的 token
  • 腾讯地图AI功能实测与开发避坑指南
  • MyFramework:异步加载回调为什么要先转移再执行
  • Mistral AI:企业控制 AI 层的新希望,能否在巨头林立的市场突围?
  • Spring AI MCP 工具调用测试文章
  • 奈飞Netflix高级会员解锁版破解版 全网同步 终身免费使用观看
  • 路侧单元被劫持,交叉路口的车全部收到了假信号——V2X路侧安全该怎么做?