Matlab中使用LOWESS拟合二维数据却生成3D图的问题求助
Matlab LOWESS拟合后出现3D图的问题解决
问题描述
首次在Matlab中尝试用局部加权回归算法(LOWESS)拟合一维数组x和y组成的二维数据点,基于带噪声的高斯曲线还原原始分布,但执行figure; plot(f);时得到的是3D图,而非期望的2D图。
原代码如下:
clearvars; close all; clc; n = 10; fit_frac = 0.2; x = zeros(n, 1); x(1:end) = 1:n; dx = 0.1; x = x*dx; xcenter = (n + 1)/2*dx; x = x - xcenter; % Gaussian initial signal y = exp(-x.^2./sqrt(2)); % add an offset of 1%; y = y + 0.01.*max(y).*(rand(n, 1)*2 - 1); % datain = [x, y]; argfrac = fit_frac.*ones(n, 1); % f = fit(data(cid).w_store.', data(cid).p_store.', 'lowess'); f = fit(datain, argfrac, 'lowess');
问题根源
你调用fit函数的参数格式错误。Matlab的fit函数对于单变量拟合(x为自变量,y为因变量),正确的参数传递方式是分开传入x和y。当前代码中,datain = [x,y]被当作包含两个自变量的矩阵,argfrac被当作因变量,因此拟合出的是二元函数,绘图时默认显示3D图。
解决方案
修改fit函数的调用逻辑,将x和y分别作为前两个参数,同时通过'Span'参数指定LOWESS的拟合比例:
修正后的完整代码
clearvars; close all; clc; n = 10; fit_frac = 0.2; x = zeros(n, 1); x(1:end) = 1:n; dx = 0.1; x = x*dx; xcenter = (n + 1)/2*dx; x = x - xcenter; % Gaussian initial signal y = exp(-x.^2./sqrt(2)); % add an offset of 1%; y = y + 0.01.*max(y).*(rand(n, 1)*2 - 1); % 正确调用fit函数:x为自变量,y为因变量,指定LOWESS方法及拟合比例 f = fit(x, y, 'lowess', 'Span', fit_frac); % 绘制2D拟合结果,同时显示原始数据点 figure; plot(f, x, y); legend('拟合曲线', '原始数据'); xlabel('x'); ylabel('y'); title('LOWESS拟合带噪声高斯曲线');
核心修改说明
- 替换
fit(datain, argfrac, 'lowess')为fit(x, y, 'lowess', 'Span', fit_frac):x是一维自变量数组,y是对应的因变量数组,符合单变量拟合的参数要求'Span'参数直接接收fit_frac值,无需生成全1数组传递,这是LOWESS方法指定拟合比例的标准方式
修改后拟合出的是单变量函数,调用plot(f)或plot(f, x, y)都会生成2D图,完美还原原始高斯分布的拟合效果。
内容的提问来源于stack exchange,提问作者Many
相关产品推荐
相关产品推荐

