最小二乘法
推荐参看参考博客,点击这里。最小二乘法其实,我有一组数据,假设这组数据由(x,y)两个量组成,这组数据可以表示为已知这组数据可以被拟合成一条直线,,其中,表示拟合直线的估计值,表示真实的数据值。我们期望我们拟合的直线十分接近真实数据,因此我们用:
来表示拟合数据与真实数据的误差,为了使得他们的误差最小,那么我们队求偏导,并且偏导数等于0,那么
我们根据红框中的后半段,就可以得到:
Matlab实现
% 小车时间(xi)和位移关系(yi)关系
x = [0 1 2 3 4 5 6 7 8 9];
y = [0 2 4 7 8 9 12 14 15 18];
%{
subplot(m,n,p) 其中前两个参数 m,n是指将你的图分成 m*n个栅格,
每个栅格用 p 来编号,而编号是按行(横着)编号的,所以,当 m = 2,n = 2时编号规则为
1 | 2
------
3 | 4
所以subplot(2,2,[1 3]),就说明你这一个子图占据的是 1, 3两个栅格,
而subplot(2,2,2)说明子图仅占据第2个栅格.
%}
subplot(1,2,1);
plot(x,y,'o');
% 图形的一些设置
xlabel('时间(秒)');
ylabel('位移(米)');
title('原始数据离散点')
%{
grid on:是打开网格
grid off:是关闭网格
而grid是切换两种状态,如果在grid off的状态下,输入grid,相当于grid on
相反,如果在grid on状态下输入grid 等价于grid off
%}
grid on
%{
polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。
曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值。
调用方法:polyfit(x,y,n)。用多项式求过已知点的表达式,
其中x为源数据点对应的横坐标,可为行向量、矩阵;
y为源数据点对应的纵坐标,可为行向量、矩阵;
n为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。
多项式在x处的值y可用下面程序计算:y=polyval(a,x,m)
%}
p = polyfit(x,y,1)
% 0:0.01:9 起始为0,终点为9,步长0.01
x1 = 0:0.01:9;
y1 = polyval(p,x1);
x2 = 0:0.01:9;
%{
MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method')
其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,
'method'表示采用的插值方法,MATLAB提供的插值方法有几种:
'nearest'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'pchip'立方插值.缺省时表示线性插值
注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
%}
y2 = interp1(x,y,x2,'spline');
subplot(1,2,2);
plot(x1,y1,'k',x2,y2,'r')
xlabel('时间(秒)');
ylabel('位移(米)');
title('黑线为最小二乘法拟合,红色为插值法拟合')
grid on
参考博客:点击这里,在matlab中利用polyfit函数进行封装。在封装好的poly函数中发现使用了QR分解的函数,QR分解是将一个矩阵分解一个正交矩阵与一个上三角矩阵的乘积
这就涉及到需要最小二乘的矩阵表达:
为了使得残差最小,那么AB-Y=0。
在matlab中利用QR分解进行求值:,将A分解成QR,则,其中我们需要求的量是,那么:
x = x(:);
y = y(:);
% Construct Vandermonde matrix.
V(:,n+1) = ones(length(x),1,class(x));
for j = n:-1:1
V(:,j) = x.*V(:,j+1);
end
% Solve least squares problem.
[Q,R] = qr(V,0);
ws = warning('off','all');
p = R\(Q'*y); % Same as p = V\y; 这里P就是我们的\beta
存在的问题:具体QR分解如何进行分解暂时还没有思考,但是觉得还是值得思考
扩展:
最小二乘的输入是范德蒙矩阵,范德蒙矩阵
另外