纯粹大学高等数学,还附带一个C程序…已感不适者请略过,go to an interesting fashion trend magazine :D

注: 此文章前半部分翻译自wikipedia这个墙外之物。

Linear Least Squares (线性最小二乘法,以下简称LLS),是解决线性回归问题的重要方法之一,常常用来求解等式多于变量情况下的最优线性方程。特别是在统计学中,常常需要根据一组数据(例如时间序列数据)来模拟其自变量与因变量之间的线性关系,用最小二乘法可以很好的拟合数据,消除残差的不确定性带来的影响。

理论

假设我们要求出关于X的方程

1

A是一个m行n列矩阵,而x是未知的n阶向量,b是已知的m阶向量。利用最小二乘法原理,列出最小化残差等式:

2

其中
[Ax]i表示第i 阶向量Ax。因为矩阵 v2 = vTvvTv的转秩,得出:

3

因为bT(Ax) = (Ax)Tb,对等式求x的偏导:

4

得到:

5

左边的ATA是个n行n列矩阵,如果A矩阵满秩的话,可得出:

6

其中(ATA)-1ATA的伪逆矩阵,因为矩阵A的逆矩阵A-1不存在,因为m≠n

实例

假设存在四组坐标点(0, 3), (2, 3), (4, 4), (−1, 2),要求出关于αx + β = y的线性方程,可将其方程变换为矩阵形式:

7

矩阵A (即 (X 1) )可以表示为

8

向量b (即 Y)可以表示为

9

得出:

10

14

15

16

11

17

12

最后可知:

152/59 + 20/59x= y 是最优线性解

其结果与用OLS(一般最小二乘法)得到的解是一致的,有兴趣的朋友可以用我写的这个C程序(OLS.c)来验证下结果:

#include 
#include "math.h"

/*
 * Function : average
 * Usage: average(x,n);
 * -------------------------------
 * Description: Returns the average of an array.
 */

static float average(float a[],int n){
        float sum=0;
        int i;
        for (i=0;i<n;i++)
        {
                sum+=a[i];
        }
        return (sum/n);
}

/*
 * Function : Main
 * -------------------------------
 * Description: Calcuate the Simple Linear Regression's estimates using OLS
 */

main() {
        int n,i;
        float sumX=0,sumY=0,numerator=0,denominator=0;
        float beta0,beta1,averageX,averageY,x[100],y[100];
        printf("How many observations do you want to type in?\n");
        scanf("%d",&n);

        printf("Please type in the observations\n");
        for (i=0;i<n;i++)
        {
                scanf("%f",&x[i]);
        }

        /*Compute the average of X observations*/
        averageX=average(x,n);

        printf("Please type in the results\n");
        for (i=0;i<n;i++)
        {
                scanf("%f",&y[i]);
        }

        /*Compute the average of Y results*/
        averageY=average(y,n);

        /*Calculate the sum of (X[i]-averageX)*(Y[i]-averageY)*/
        for (i=0;i<n;i++)
        {
                numerator+=((x[i]-averageX)*(y[i]-averageY));
        }
        printf("The numerator is %.4f\n",numerator);

        /*Calculate the sum of (X[i]-averageX)^2*/
        for (i=0;i<n;i++)
        {
                denominator+=((x[i]-averageX)*(x[i]-averageX));
        }
        printf("The denominator is %.4f\n",denominator);

        /*Compute and print out the slope estimate : β1*/
        beta1=numerator/denominator;
        printf("The slope estimate β1 is %.4f\n",beta1);

        /*Compute and print out the intercept estimate : β0*/
        beta0=averageY-beta1*averageX;
        printf("The intercept estimate β0 is %.4f\n",beta0);

        /*Now we can print out the equation obtained from the samples*/
        printf("Y = %.4f + %.4fX\n",beta0,beta1);
}

程序先需要经过编译才能运行,执行后先填入观察相数目(自变量),再分别填入自变量与因变量的数据就行了。

用途

LLS可以用来求一个上市公司的β系数估计值,β系数在金融界中已经被广泛应用于刻画公司业绩与总体市场行为的关系,那些倾向于高杠杆而与总体市场联系紧密的往往具有较大的β值,而低风险保守的公司β往往比较小。例如一个β系数为2.0的公司,如果总体市场的预期收益率为5%,则该公司的预期收益率为10%,反之亦然,如果总体市场预期收益率下降了5%,则该公司预期收益率下降10%,而如果β值为负数时则呈现负相关关系。

3 Reponses So Far ↓

  1. Tony:

    你Y是不是病了?

  2. alice:

    最小二乘法我上学的时候也自己写过一个程序进行计算,看来是前有古人后有来者啊。Least squares (LS)也是生物学上基因进化树的构建法之一。

  3. @ Tony : 除了脑子不正常其他一切OK :D

    @ Alice : 这叫”重蹈覆辙”啊 … 我们这学期的Econometrics几乎整本书都是围着LS转

Leave a Reply ↓