最小二乘法理论、推导、算法


author@jason_ql
http://blog.csdn.net/lql0716


1、引言

  • 求最小二乘的实例:

假定 x <script type="math/tex" id="MathJax-Element-1">x</script>, y<script type="math/tex" id="MathJax-Element-2">y</script>有如下数值:
y | 1.00 | 0.90 | 0.90 | 0.81 | 0.60 | 0.56 | 0.35
x | 3.60 | 3.70 | 3.80 | 3.90 | 4.00 | 4.10 | 4.20

解:将这些数值画图可以看出接近一条直线,故用 y=ax+b <script type="math/tex" id="MathJax-Element-3">y = ax + b</script>表示,故将上面的数值代入表达式有:

3.6a+b1.00=03.7a+b0.90=03.8a+b0.90=03.9a+b0.81=04.0a+b0.60=04.1a+b0.56=04.2a+b0.35=0
<script type="math/tex; mode=display" id="MathJax-Element-4">3.6a + b - 1.00 = 0 \\ 3.7a + b - 0.90 = 0 \\ 3.8a + b - 0.90 = 0 \\ 3.9a + b - 0.81 = 0 \\ 4.0a + b - 0.60 = 0 \\ 4.1a + b - 0.56 = 0 \\ 4.2a + b - 0.35 = 0 \\ </script>

由于直线只有两个未知数 a <script type="math/tex" id="MathJax-Element-5">a</script>, b<script type="math/tex" id="MathJax-Element-6">b</script>,理论上只需要两个方程就能求得,但是实际上是不可能的,因为所有点并没有真正的在同一条直线上,即不可能所有的数值都满足

ax+by0
<script type="math/tex; mode=display" id="MathJax-Element-7">ax + b - y=0</script>,故只需找到一对儿 a <script type="math/tex" id="MathJax-Element-8">a</script>、b<script type="math/tex" id="MathJax-Element-9">b</script>,使得误差平方和
(axi+byi)2=(ax0+by0)2+(ax1+by1)2+......+(axn+byn)2
<script type="math/tex; mode=display" id="MathJax-Element-10">\sum(ax_i + b - y_i)^2 =(ax_0 + b - y_0)^2 + (ax_1 + b - y_1)^2 + ...... + (ax_n + b - y_n)^2</script>最小即可。

误差的平方即二乘方,故成为最小二乘法。

2、最小二乘法理论(使得平方和最小)

2.1 数学理论推导

  • 线性方程组

a11x1+a12x2+...+a1sxsb1=0,a21x1+a22x2+...+a2sxsb2=0,......an1x1+an2x2+...+ansxsbn=0, (1)
<script type="math/tex; mode=display" id="MathJax-Element-11"> \left\{ \begin{aligned} a_{11}x_1 + a_{12}x_2 + ... + a_{1s}x_s - b_1 = 0, \\ a_{21}x_1 + a_{22}x_2 + ... + a_{2s}x_s - b_2 = 0, \\ ...... \\ a_{n1}x_1 + a_{n2}x_2 + ... + a_{ns}x_s - b_n = 0, \end{aligned} \right. \tag{1}</script>

该方程组可能无解,即任何一组 x1,x2,...,xs <script type="math/tex" id="MathJax-Element-12">x_1, x_2, ... , x_s</script>(这里为系数)都可能使得

i=1n(ai1x1+ai2x2+...+aisxsbi)2(2)
<script type="math/tex; mode=display" id="MathJax-Element-13">\sum_{i=1}^{n} (a_{i1}x_1 + a_{i2}x_2 + ... + a_{is}x_s - b_i)^2 \tag{2}</script>

不等于零。所以找到一组 x1,x2,...,xs <script type="math/tex" id="MathJax-Element-14">x_1, x_2, ... , x_s</script>使得(2)式最小,称这样的解为最小二乘解,这种问题就叫最小二乘方问题。

对于(1)式,我们可以用矩阵来表示,
自变量矩阵 A <script type="math/tex" id="MathJax-Element-15">\boldsymbol{A}</script>:

A=a11a21.an1a12a22.an2..........a1sa2s.ans(3)
<script type="math/tex; mode=display" id="MathJax-Element-16"> \boldsymbol{A}=\left[ \begin{matrix} a_{11} & a_{12} & ... & a_{1s} \\ a_{21} & a_{22} & ... & a_{2s} \\ . & . & . & . \\ a_{n1} & a_{n2} & ... & a_{ns} \end{matrix} \right] \tag{3}</script>

函数值 B <script type="math/tex" id="MathJax-Element-17">\boldsymbol{B}</script>:

B=b1b2...bn(4)
<script type="math/tex; mode=display" id="MathJax-Element-18">\boldsymbol{B}=\left[ \begin{matrix} b_{1} \\ b_{2} \\ . \\ . \\ . \\ b_{n} \end{matrix} \right] \tag{4}</script>

系数 X <script type="math/tex" id="MathJax-Element-19">\boldsymbol{X}</script>:

X=x1x2...xs(5)
<script type="math/tex; mode=display" id="MathJax-Element-20">\boldsymbol{X}=\left[ \begin{matrix} x_{1} \\ x_{2} \\ . \\ . \\ . \\ x_{s} \end{matrix} \right] \tag{5}</script>

函数值 Y <script type="math/tex" id="MathJax-Element-21">\boldsymbol{Y}</script>:

Y=j=1sa1jxjj=1sa2jxj...j=1sanjxj=AX(4)
<script type="math/tex; mode=display" id="MathJax-Element-22">\boldsymbol{Y}=\left[ \begin{matrix} \sum_{j=1}^{s} a_{1j}x_j \\ \sum_{j=1}^{s} a_{2j}x_j \\ . \\ . \\ . \\ \sum_{j=1}^{s} a_{nj}x_j \end{matrix} \right] = \boldsymbol{AX} \tag{4}</script>

故(2)式等价于:

|YB|2=|AXB|2=i=1n(ai1x1+ai2x2+...+aisxsbi)2
<script type="math/tex; mode=display" id="MathJax-Element-23">|\boldsymbol{Y-B}|^2 = |\boldsymbol{AX-B}|^2 = \sum_{i=1}^{n} (a_{i1}x_1 + a_{i2}x_2 + ... + a_{is}x_s - b_i)^2</script>

也就是说,最小二乘法就是找 x1,x2,...,xs <script type="math/tex" id="MathJax-Element-24">x_1, x_2, ... , x_s</script>使得 Y <script type="math/tex" id="MathJax-Element-25">\boldsymbol{Y}</script>与 B <script type="math/tex" id="MathJax-Element-26">\boldsymbol{B}</script>的距离最短。

对于(4)式 Y <script type="math/tex" id="MathJax-Element-27">\boldsymbol{Y}</script>,可以写为如下形式:

Y=x1a11a21...an1+x2a12a22...an2+...+xsa1sa2s...ans=x1α1+x2α2+...+xsαs(5)
<script type="math/tex; mode=display" id="MathJax-Element-28">\boldsymbol{Y}=x_1\left[ \begin{matrix} a_{11} \\ a_{21} \\ . \\ . \\ . \\ a_{n1} \end{matrix} \right] + x_2\left[ \begin{matrix} a_{12} \\ a_{22} \\ . \\ . \\ . \\ a_{n2} \end{matrix} \right] + ... + x_s\left[ \begin{matrix} a_{1s} \\ a_{2s} \\ . \\ . \\ . \\ a_{ns} \end{matrix} \right] = x_1 \boldsymbol{\alpha}_1 + x_2 \boldsymbol{\alpha}_2 + ... + x_s\boldsymbol{\alpha}_s \tag{5}</script>

其中 αi <script type="math/tex" id="MathJax-Element-29">\boldsymbol{\alpha}_i</script>为对应的列向量,由 αi <script type="math/tex" id="MathJax-Element-30">\boldsymbol{\alpha}_i</script>生成的子空间为 L(α1,α2,...,αs) <script type="math/tex" id="MathJax-Element-31">\boldsymbol{L}(\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, ... , \boldsymbol{\alpha}_s)</script>,那么 Y <script type="math/tex" id="MathJax-Element-32">\boldsymbol{Y}</script>就是 L(α1,α2,...,αs) <script type="math/tex" id="MathJax-Element-33">\boldsymbol{L}(\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, ... , \boldsymbol{\alpha}_s)</script>中的向量,故最小二乘法问题可叙述成:

X <script type="math/tex" id="MathJax-Element-34">\boldsymbol{X}</script>使得(2)式最小,就是在 L(α1,α2,...,αs) <script type="math/tex" id="MathJax-Element-35">\boldsymbol{L}(\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, ... , \boldsymbol{\alpha}_s)</script>中找一向量 Y <script type="math/tex" id="MathJax-Element-36">Y</script>使得B<script type="math/tex" id="MathJax-Element-37">B</script>到它的距离比到子空间 L(α1,α2,...,αs) <script type="math/tex" id="MathJax-Element-38">\boldsymbol{L}(\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, ... , \boldsymbol{\alpha}_s)</script>中其它向量的距离都短。

Y=AX=x1α1+x2α2+...+xsαs <script type="math/tex" id="MathJax-Element-39">\boldsymbol{Y} = \boldsymbol{AX} = x_1 \boldsymbol{\alpha}_1 + x_2 \boldsymbol{\alpha}_2 + ... + x_s\boldsymbol{\alpha}_s</script>,则

C=BY=BAX
<script type="math/tex; mode=display" id="MathJax-Element-40">\boldsymbol{C} = \boldsymbol{B} - \boldsymbol{Y} = \boldsymbol{B} - \boldsymbol{AX}</script>

必须垂直于子空间 L(α1,α2,...,αs) <script type="math/tex" id="MathJax-Element-41">\boldsymbol{L}(\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, ... , \boldsymbol{\alpha}_s)</script>,故有

(C,α1)=(C,α2)=...=(C,αs)=0
<script type="math/tex; mode=display" id="MathJax-Element-42">(\boldsymbol{C}, \boldsymbol{\alpha}_1) = (\boldsymbol{C}, \boldsymbol{\alpha}_2) = ... = (\boldsymbol{C}, \boldsymbol{\alpha}_s) = 0</script>

由向量内积的定义可知:

α1C=0,α2C=0,...,αsC=0(6)
<script type="math/tex; mode=display" id="MathJax-Element-43">\boldsymbol{\alpha}_1^{'} C = 0, \boldsymbol{\alpha}_2^{'} C = 0, ... , \boldsymbol{\alpha}_s^{'} C = 0 \tag{6}</script>

向量的内积:

α=(a1,a2,...,an) <script type="math/tex" id="MathJax-Element-44"> \boldsymbol{\alpha} = (a_1, a_2, ..., a_n)</script>,

β=(b1,b2,...,bn) <script type="math/tex" id="MathJax-Element-45"> \boldsymbol{\beta} = (b_1, b_2, ..., b_n)</script>,

α <script type="math/tex" id="MathJax-Element-46"> \boldsymbol{\alpha}</script>和 β <script type="math/tex" id="MathJax-Element-47">\boldsymbol{\beta}</script>的内积为: (α,β)=a1b1+a2b2+...+anbn <script type="math/tex" id="MathJax-Element-48">(\boldsymbol{\alpha}, \boldsymbol{\beta})=a_1b_1 + a_2b_2 + ... + a_nb_n</script>

由(6)式可得:

AC=0
<script type="math/tex; mode=display" id="MathJax-Element-49">\boldsymbol{A^{'}C}=0</script>

即:

AC=A(BY)=A(BAX)=0
<script type="math/tex; mode=display" id="MathJax-Element-50">\boldsymbol{A^{'}C}=\boldsymbol{A^{'}(B-Y)}=\boldsymbol{A^{'}(B-AX)}=0</script>

从而有:

ABAAX=0
<script type="math/tex; mode=display" id="MathJax-Element-51">\boldsymbol{A^{'}B-A^{'}AX}=0</script>

AB=AAX
<script type="math/tex; mode=display" id="MathJax-Element-52">\boldsymbol{A^{'}B=A^{'}AX}</script>

X=(AA)1AB
<script type="math/tex; mode=display" id="MathJax-Element-53">\boldsymbol{X=(A^{'}A)^{-1}A^{'}B}</script>

其中 |AA|0 <script type="math/tex" id="MathJax-Element-54">\boldsymbol{|A^{'}A|} \neq 0</script>

2.2 常见形式

2.2.1 理论

根据2.1节,可以得出以下形式( s+1n <script type="math/tex" id="MathJax-Element-55">s+1 \leq n</script>):

a1x11+a2x12+...+asx1s+by1=0,a1x21+a2x22+...+asx2s+by2=0,......a1xn1+a2xn2+...+asxns+byn=0, (2.2.1)
<script type="math/tex; mode=display" id="MathJax-Element-56"> \left\{ \begin{aligned} a_1x_{11} + a_2x_{12} + ... + a_sx_{1s} + b - y_1= 0, \\ a_1x_{21} + a_2x_{22} + ... + a_sx_{2s} + b - y_2= 0, \\ ...... \\ a_1x_{n1} + a_2x_{n2} + ... + a_sx_{ns} + b - y_n= 0, \end{aligned} \right. \tag{2.2.1}</script>

这里是常见的方程表示形式 aj <script type="math/tex" id="MathJax-Element-57">a_j</script>为系数, b <script type="math/tex" id="MathJax-Element-58">b</script>为常数项,xij<script type="math/tex" id="MathJax-Element-59">x_{ij}</script>为自变量, yi <script type="math/tex" id="MathJax-Element-60">y_i</script>为函数值。一般我们解方程都是根据 aj <script type="math/tex" id="MathJax-Element-61">a_j</script>和 b <script type="math/tex" id="MathJax-Element-62">b</script>求得yi=a1xi1+a2xi2+...+asxis+b<script type="math/tex" id="MathJax-Element-63">y_i=a_1x_{i1} + a_2x_{i2} + ... + a_s x_{is} + b</script>,但在解决实际问题时,一般我们都是知道 xij <script type="math/tex" id="MathJax-Element-64">x_{ij}</script>和 yi <script type="math/tex" id="MathJax-Element-65">y_i</script>,需要反过来求解 aj <script type="math/tex" id="MathJax-Element-66">a_j</script>和 b <script type="math/tex" id="MathJax-Element-67">b</script>。

根据(2.2.1)式,设:

X=x11x21.xn1x12x22.xn2..........x1sx2s.xns1111
<script type="math/tex; mode=display" id="MathJax-Element-68"> \boldsymbol{X}=\left[ \begin{matrix} x_{11} & x_{12} & ... & x_{1s} & 1\\ x_{21} & x_{22} & ... & x_{2s} & 1\\ . & . & . & . & 1\\ x_{n1} & x_{n2} & ... & x_{ns} & 1 \end{matrix} \right]</script>

a=a1a2...asb
<script type="math/tex; mode=display" id="MathJax-Element-69">\boldsymbol{a}=\left[ \begin{matrix} a_1 \\ a_2 \\ . \\ . \\. \\ a_s \\ b \end{matrix} \right]</script>

y=y1y2...yn
<script type="math/tex; mode=display" id="MathJax-Element-70">\boldsymbol{y}=\left[ \begin{matrix} y_1 \\ y_2 \\ . \\ . \\. \\ y_n \end{matrix} \right]</script>

那么:

Xa=y
<script type="math/tex; mode=display" id="MathJax-Element-71">\boldsymbol{X a=y}</script>

XXa=Xy
<script type="math/tex; mode=display" id="MathJax-Element-72">\boldsymbol{X^{'}X a=X^{'}y}</script>

a=(XX)1Xy
<script type="math/tex; mode=display" id="MathJax-Element-73">\boldsymbol{ a=(X^{'}X)^{-1}X^{'}y}</script>

2.2.2 算法


  • 算法步骤

1、输入 X <script type="math/tex" id="MathJax-Element-74">\boldsymbol{X}</script>, y <script type="math/tex" id="MathJax-Element-75">\boldsymbol{y}</script>

2、求 a=(XX)1Xy <script type="math/tex" id="MathJax-Element-76">\boldsymbol{a=(X^{'}X)^{-1}X^{'}y}</script>

参考

《高等代数》北大三版

干货分享

更多推荐