Matlab教程三:回归分析(拟合)

来源:互联网 发布:未来软件客服电话 编辑:程序博客网 时间:2024/05/29 03:10

摘要:这篇文章主要会介绍回归分析(拟合)的在数据处理中的作用,并且会给出Matlab的一些实例。


一、引子

       回归分析在计算数学和统计学中都有广泛的引用。另一个说法是拟合,大体上他们没有很显著的区别。总的来说,这两种方法都有着数据处理的作用。下面看一个电学实验的例子:

       伏安特性实验,这是在中学电学中常见的一类实验,电路图如图1。不妨假设忽略了电流表、电压表的阻值影响,且干电池也没有内阻。我们不断调节变阻器,最后得到了若干变阻器的U-I关系散点,因为测量的固有误差,不是完全线性的关系。如图2:


                                    

                                                                                                   图1                                                           图2


不管我们已经有的电学知识(显然这是线性的关系,但是这仅是一个高度简化的模型。),现在我们希望通过分析散点图,预测U=3.5V时,留过变阻器的电流值I的值。

       当然,在没有任何知识的情况下,我们不可能预料得到这个点(3.5,?)的位置 。不过通过一种更经验的办法,我们相信电压和电流之间存在这样一个函数关系f(x),我们不能确定它的形式,但是可以从散点的脉络中猜测,他也许是一个多项式函数,进一步也可能是线性函数。于是,我们尝试找到一条顺着这几个点的直线或曲线,让它尽量接近实际的函数关系f(x),这样我们的目的就达到了。以上,便是插值和回归的基本思路。

       怎样尽量接近f(x),在回归中,我们的准则是最小二乘法,也就是找一条直线或者曲线,让散点至直线的偏差值尽量小。线性回归中有如下形式,我们的目标是找出这里的所有b,n的大小,取决于你的自变量的数量:

    (1)

在上述例子中,我们需要找的关系式便是:

    (2)

具体如何找到不详细描述,可以参考[1]。

       另外一个和回归很类似的是插值方法,我们去试着去找一条直线或者曲线,过所有散点,这是可行的,因为我们只能得到有限个散点,假设有n个散点,我们可以用n次曲线去插值,这样n个点刚好确定一条n次曲线,就可以实现插值。但是,插值有很多明显的缺陷,所以建议不要用插值方法处理数据。


二、Matlab实现回归

       在Matlab函数库中,提供了线性回归的方法,即 [b, bint, r, rint, stats] = regress(y, X, alpha); 其中X是给予的自变量数据矩阵,这里的自变量是多维的,也就是说,我们不仅可以拟合U-I关系,也可以拟合一些复杂的,比如库仑定律,Q1, r---F这个关系。y是给予的因变量数据,这个仅有一维。alpha是置信系数,可以不用太在意,也不一定要显式地给出。b和bint是返回的线性方程的系数,即上(1)式中的若干b,bint是b的置信区间的上下界,r是对每一个样本的偏差值,rint则是偏差的置信区间的上下界,stats是检验的统计量,其中的显著性测试、拟合优度检验都很重要。

       以U-I曲线拟合为例,代码如下:

       % 注意要用列向量。

       u = [2, 2.5, 3, 4, 5]';

        bias = ones(5,1);  % 全1的这一列是必须的,因为在(1)式b0实际上也乘了一个x0=1; 故而这一列为全1

        X = [bias, u];

        i = [3, 3.5, 4, 4.5, 5]';

        [b, bint, r, rint, stats] = regress(i, X);

        plot(u, i, '*');  % 打印散点

        hold on


        % 下面绘制直线

        x = (1.8:0.1:5.2)'; % 第二讲讲过,是个向量,这是绘制直线用的采样点。

        bias = ones(size(x)); % 要跟x一样长。

        X = [bias, x];  % 要加上x0=1这一系列

        y = X * b % 这一步相当于,把采样点一一代入到我们求出的线性表达式中。

        plot(x, y, '-'); 


最后的效果如图3就是:


图3


这样我们就可以得出U=3.5时的值,大概是I=4左右。当然,这也存在着误差。下面做个练习:

        练习1:观察昆虫的数据发现,翅长、体长 于 年龄有着密切的关系。抽样了若干只同种昆虫,测得翅长数据分别为1.2, 1.3, 1.4, 1.7, 1.2,体长数据为2.3, 2.4, 2.2, 2.6, 2.1,年龄为30, 43, 42, 50, 28,请用回归的办法找出它们之间的关系,并且加入翅长为1, 体长为2时,估算其年龄。


        答案:画图自己画了,年龄估算值为23。如果正确就走下一步吧。


       下面介绍返回值的意义。

       打印U-I曲线问题中的stats,可以得到第一个值为0.96.这个代表拟合优度R^2,也就是拟合的好坏程度。第二个值为96,这是显著性检验值F,代表模型的好坏程度。这两个指标可以代表你的拟合好坏,如果较低,则需要考虑更换模型,也许不是线性拟合,应该改为多项式拟合,或对数拟合等。

       另一个有意义的参数是r和rint,代表样本残差,也就是样本和拟合曲线的差距。理论上来说,如果拟合的好,那么r的分布应该是正态的,也就是纯粹的测量误差。需要分析这个问题,就可以用rcoplot(r, rint)打印出残差图像。如果都是绿色的,那么就说明残差正常。如果残差不正常,如偏向一侧,那么也能说明模型本身不够好,或者收集的数据误差太离谱。


       除了线性回归,当然还有其他的回归方式,举个例子,我们认为练习1中的翅长对年龄的影响并不是线性增长的,可能是对数增长的,于是我们提出如下模型:

面对这种,除了整体上,因变量还是线性关系的模型,我们可以直接在数据上做处理。可以写如下代码:

       % 假设翅长为 c

       c = [1.2, 1.3, 1.4, 1.7, 1.2]';

       c = log(c);

        t = [2.3, 2.4, 2.2, 2.6, 2.1]';

        % 这时候得出的X,实际上就是用log翅长的数据去拟合了。

        X = [ones(size(c)), c, t];


练习2:假设翅长和体长相对于年龄都是对数增长的,这就是一个对数线性模型了,尝试去拟合,并且得出结果。


答案:最后结果应该为20左右。提示一下,最后代入翅长为1,体长为2做预测时,要做对数处理。若得到100左右,就可能会得到一个很大的离谱值。


给出一个更复杂的练习,假设,我们猜想拟合模型是:

尝试着用regress命令来做回归分析,这里不给答案。其实想到思路,答案就不重要了。


        最后必须指出,模型的选择是一个很复杂的问题,就算是再好的专家也可能选错模型,所以需要通过不断尝试,总结经验,也需要一些专家的帮助,这样才可以设计出较好的拟合模型。


三、总结

      总的来说,只要掌握了regress命令的用法,以及参数的性质和作用,就基本可以解决大部分的回归分析问题了。


参考:

[1] 百度百科:最小二乘法 http://baike.baidu.com/view/139822.htm?fr=aladdin#3

       

0 0