最小二乘曲线拟合matlab实现
2013-09-02 14:10
507 查看
曲线拟合[1]是一种常用的模型拟合方法,经常用在相机标定或其它传感器标定上。对于加性高斯噪声,最小二乘通常是一种最优的估计方法(PS:当外点存在时,通常可以采用其它robust estimator 或者采用ransac进行拟合)。本文演示最小二乘曲线拟合技术,所有代码可从点击此处下载。
对如下图所示的加噪声曲线,如何进行曲线拟合呢?
![](http://img.blog.csdn.net/20130902133547125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们可以采用d阶多项式去逼近它:
![](http://latex.codecogs.com/gif.latex?\LARGE&space;p(x)=a_0+a_1x+a_2x^2+...+a_dx^d)
系数
![](http://latex.codecogs.com/gif.latex?\LARGE&space;a_0)
到
![](http://latex.codecogs.com/gif.latex?\LARGE&space;a_d)
则由最小二乘确定。在本文,d取1,3,5.
随机数据的产生如下:
function [y_truth,y_observed] = unknown_model1(x)
y_truth = 0.001*x.^4 + x.^3-5*x.^2+0.5*x; %4阶的数据
y_observed = y_truth + randn(length(x),1)'; %观测到的数据包含单位高斯噪声
end
整个演示程序如下:
clc;
clear;
close all;
%% sample
x_all = 0:0.1:10;
[y_truth_all,y_all]=unknown_model1(x_all);
N = length(x_all);
%use the first half for training
x = x_all(1:N/2);
y = y_all(1:N/2);
y_truth = y_truth_all(1:N/2);
plot(x,y_truth,'g-x','LineWidth',1.5);
hold on;
plot(x,y,'m-x','LineWidth',1.5);
legend('model truth','observation');
title('training');
![](http://img.blog.csdn.net/20130902133547125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
%% curve fitting, try linear model
X = [x;ones(1,length(x))]';
Y = y';
lambda1 = (X'*X)\X'*Y; %最小二乘拟合 (least-square fitting)
% evaluate the esimated model
ye1 = X*lambda1;
hold on;
plot(x,ye1,'c-o','LineWidth',1.5);
![](http://img.blog.csdn.net/20130902134503125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
%% curve fitting, try order-3 order polynomial
X = [x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda2 = (X'*X)\X'*Y;%最小二乘拟合
% evaluate the esimated model
ye2 = X*lambda2;
hold on;
plot(x,ye2,'r-o','LineWidth',1.5);
![](http://img.blog.csdn.net/20130902134633687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
%% curve fitting, try order-5 order polynomial
X = [x.^5;x.^4;x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda3 = (X'*X)\X'*Y;%最小二乘拟合
% evaluate the esimated model
ye3 = X*lambda3;
hold on;
plot(x,ye3,'b-o','LineWidth',1.5);
![](http://img.blog.csdn.net/20130902134545328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
%%
figure;
plot(x,y,'g-x',x,ye1,'c-o',x,ye2,'r-o',x,ye3,'b-o','LineWidth',1.5);
legend('model truth', 'order-1','order-3', 'order-5');
以上是训练的代码。由图可见,3阶和5阶与真实模型最为接近,一阶的误差较大。
下面根据估计的模型对未来未知的数据进行预测,比较各模型与真实模型的误差大小
%% show future trends
X = [x_all;ones(1,length(x_all))]';
ye1 = X*lambda1;
X = [x_all.^3;x_all.^2;x_all;ones(1,length(x_all))]';
ye2 = X*lambda2;
X = [x_all.^5;x_all.^4;x_all.^3;x_all.^2;x_all;ones(1,length(x_all))]';
ye3 = X*lambda3;
figure;
plot(x_all,y_truth_all,'g-x',x_all,y_all,'m-x',x_all,ye1,'c-o',x_all,ye2,'r-o',x_all,ye3,'b-o','LineWidth',1.5);
legend('model truth','observation', 'order-1 poly fitting','order-3 poly fitting', 'order-5 poly fitting');
title('testing');
![](http://img.blog.csdn.net/20130902134642796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFuY2hsYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由图可见,3阶模型与真实模型最为接近,而原来在训练中比较接近的5阶模型对未知数据有较大的误差,即存在所谓的过拟合现象(overfitting)[2].
参考资料:
[1]http://en.wikipedia.org/wiki/Curve_fitting
[2]http://en.wikipedia.org/wiki/Overfitting
对如下图所示的加噪声曲线,如何进行曲线拟合呢?
我们可以采用d阶多项式去逼近它:
系数
到
则由最小二乘确定。在本文,d取1,3,5.
随机数据的产生如下:
function [y_truth,y_observed] = unknown_model1(x)
y_truth = 0.001*x.^4 + x.^3-5*x.^2+0.5*x; %4阶的数据
y_observed = y_truth + randn(length(x),1)'; %观测到的数据包含单位高斯噪声
end
整个演示程序如下:
clc;
clear;
close all;
%% sample
x_all = 0:0.1:10;
[y_truth_all,y_all]=unknown_model1(x_all);
N = length(x_all);
%use the first half for training
x = x_all(1:N/2);
y = y_all(1:N/2);
y_truth = y_truth_all(1:N/2);
plot(x,y_truth,'g-x','LineWidth',1.5);
hold on;
plot(x,y,'m-x','LineWidth',1.5);
legend('model truth','observation');
title('training');
%% curve fitting, try linear model
X = [x;ones(1,length(x))]';
Y = y';
lambda1 = (X'*X)\X'*Y; %最小二乘拟合 (least-square fitting)
% evaluate the esimated model
ye1 = X*lambda1;
hold on;
plot(x,ye1,'c-o','LineWidth',1.5);
%% curve fitting, try order-3 order polynomial
X = [x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda2 = (X'*X)\X'*Y;%最小二乘拟合
% evaluate the esimated model
ye2 = X*lambda2;
hold on;
plot(x,ye2,'r-o','LineWidth',1.5);
%% curve fitting, try order-5 order polynomial
X = [x.^5;x.^4;x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda3 = (X'*X)\X'*Y;%最小二乘拟合
% evaluate the esimated model
ye3 = X*lambda3;
hold on;
plot(x,ye3,'b-o','LineWidth',1.5);
%%
figure;
plot(x,y,'g-x',x,ye1,'c-o',x,ye2,'r-o',x,ye3,'b-o','LineWidth',1.5);
legend('model truth', 'order-1','order-3', 'order-5');
以上是训练的代码。由图可见,3阶和5阶与真实模型最为接近,一阶的误差较大。
下面根据估计的模型对未来未知的数据进行预测,比较各模型与真实模型的误差大小
%% show future trends
X = [x_all;ones(1,length(x_all))]';
ye1 = X*lambda1;
X = [x_all.^3;x_all.^2;x_all;ones(1,length(x_all))]';
ye2 = X*lambda2;
X = [x_all.^5;x_all.^4;x_all.^3;x_all.^2;x_all;ones(1,length(x_all))]';
ye3 = X*lambda3;
figure;
plot(x_all,y_truth_all,'g-x',x_all,y_all,'m-x',x_all,ye1,'c-o',x_all,ye2,'r-o',x_all,ye3,'b-o','LineWidth',1.5);
legend('model truth','observation', 'order-1 poly fitting','order-3 poly fitting', 'order-5 poly fitting');
title('testing');
由图可见,3阶模型与真实模型最为接近,而原来在训练中比较接近的5阶模型对未知数据有较大的误差,即存在所谓的过拟合现象(overfitting)[2].
参考资料:
[1]http://en.wikipedia.org/wiki/Curve_fitting
[2]http://en.wikipedia.org/wiki/Overfitting
相关文章推荐
- 最小二乘曲线拟合matlab实现
- 最小二乘曲线拟合——C语言算法实现一
- 简单好用的最小二乘椭圆拟合算法---MATLAB实现
- 最小二乘曲线拟合算法的C++实现
- 最小二乘椭圆拟合matlab代码实现
- 最小二乘曲线拟合的MATLAB仿真
- 最小二乘法(c语言实现线性,matlab进行拟合)及相关系数的求解
- 最小二乘法 多项式曲线拟合 原理公式理解 Python 实现
- 横向剪切最小二乘相位解包裹算法----MATLAB实现
- 基于移动最小二乘的图像变形和曲线拟合
- 最小二乘曲线拟合——C语言算法实现二
- 智能建模之最小二乘辨识LS:Matlab实现
- 用matlab实现非线性曲线拟合
- MATLAB中利用cftool导出代码实现一张图中拟合多条平滑曲线
- 一元二次曲线拟合的最小二乘python实现
- Matlab实现最小二乘法准则拟合
- 使用scipy实现最小二乘法,以及通过曲线对数据进行拟合(Python)
- 用MATLAB怎么实现曲线拟合?
- python最小二乘和神经网络拟合曲线比较
- MATLAB的曲线拟合