如何将多项式拟合到一些误差条数据中
How to fit polynomial into some error bars data
我需要拟合数据,例如x, y, CI(其中 CI 是 y 的置信度指数)在 Matlab 中。
现在,我使用这个代码:
pf = polyfit(x, y, 2);
x1 = min(x):.1:max(x);
y1 = polyval(pf, x1);
figure
hold on
errorbar(x, y, CI, 'ko');
plot(x1, y1, 'k');
hold off
当然,拟合出现了一些误差条,而且是正确的。
我想得到一条更接近置信度低的点的拟合曲线,舍弃置信度高的点。
谢谢,再见,
贾科莫
您要找的是加权最小二乘法。您可以使用函数 lscov
计算它们。它的帮助页面中有一个很好的例子,但我会尽量让它更清楚。
让我们构造一条带有损坏点的简单抛物线
x = (0:0.1:1)';
y = 0.5*x.^2;
y(5) = 3*y(5);
并赋予一些权重
w = ones(size(y));
w(5) = 0.1;
接下来构建 Vandermonde 矩阵 () 并求解系统
%// V = [x.^2 x ones(size(x))];
V = bsxfun(@power, x, 2:-1:0);
coeff = lscov(V, y, w);
带权重和不带权重的估计系数是
x^2 x 1
with weights [0.4797 0.0186 -0.0004]
no weights [0.3322 0.1533 -0.0034]
请注意,在您的情况下 w
必须反转。
如果您不喜欢构建 Vandermonde 矩阵,并且您拥有 Curve Fitting Toolbox 的许可证,则可以使用以下代码
ft = fittype('poly2');
opts = fitoptions('Method', 'LinearLeastSquares');
opts.Weights = w;
fitresult = fit(x, y, ft, opts);
你会得到同样的结果。
我需要拟合数据,例如x, y, CI(其中 CI 是 y 的置信度指数)在 Matlab 中。
现在,我使用这个代码:
pf = polyfit(x, y, 2);
x1 = min(x):.1:max(x);
y1 = polyval(pf, x1);
figure
hold on
errorbar(x, y, CI, 'ko');
plot(x1, y1, 'k');
hold off
当然,拟合出现了一些误差条,而且是正确的。
我想得到一条更接近置信度低的点的拟合曲线,舍弃置信度高的点。
谢谢,再见,
贾科莫
您要找的是加权最小二乘法。您可以使用函数 lscov
计算它们。它的帮助页面中有一个很好的例子,但我会尽量让它更清楚。
让我们构造一条带有损坏点的简单抛物线
x = (0:0.1:1)';
y = 0.5*x.^2;
y(5) = 3*y(5);
并赋予一些权重
w = ones(size(y));
w(5) = 0.1;
接下来构建 Vandermonde 矩阵 (
%// V = [x.^2 x ones(size(x))];
V = bsxfun(@power, x, 2:-1:0);
coeff = lscov(V, y, w);
带权重和不带权重的估计系数是
x^2 x 1
with weights [0.4797 0.0186 -0.0004]
no weights [0.3322 0.1533 -0.0034]
请注意,在您的情况下 w
必须反转。
如果您不喜欢构建 Vandermonde 矩阵,并且您拥有 Curve Fitting Toolbox 的许可证,则可以使用以下代码
ft = fittype('poly2');
opts = fitoptions('Method', 'LinearLeastSquares');
opts.Weights = w;
fitresult = fit(x, y, ft, opts);
你会得到同样的结果。