标题暂定--算法的激光概念

最小二乘法

推荐参看参考博客,点击这里。最小二乘法其实,我有一组数据,假设这组数据由(x,y)两个量组成,这组数据可以表示为(x{_{i}},y{_{i}})已知这组数据可以被拟合成一条直线,y_{ie}=\beta {_{1}}x_{i}+\beta {_{0}},其中y_{ie},表示拟合直线的估计值,y_{i}表示真实的数据值。我们期望我们拟合的直线十分接近真实数据,因此我们用:

                                         Q=min\sum_{i}^{n}(y_{ie}-y_{i} )^{2} =min\sum_{i}^{n}(\beta_{1}x+\beta_{0}-y_{i} )^{2}=M(\beta_{1},\beta_{0})

来表示拟合数据与真实数据的误差,为了使得他们的误差最小,那么我们队\beta_{1} , \beta_{0}求偏导,并且偏导数等于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\beta=Y,将A分解成QR,则QR\beta=Y,其中我们需要求的量是\beta,那么:

                                                                                     \beta=\frac{Q^{T}Y}{R}

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分解如何进行分解暂时还没有思考,但是觉得还是值得思考

扩展:

最小二乘的输入是范德蒙矩阵,范德蒙矩阵

 

另外

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值