机器学习2:从线性方程的角度看的线性回归【1】

1 从方程说起

我这里先不谈线性回归,就面对一个简简单单的方程,看你能不能解吧。

\begin{bmatrix} &2 & 3 &5 \\ &4 & 5 &3 \\ &6 & 7 &2 \\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z \\ \end{bmatrix} = \begin{bmatrix} 23\\ 23\\ 26\\ \end{bmatrix}                                                            (1)

我们也知道答案是:

\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} = \begin{bmatrix} 1\\ 2\\ 3\\ \end{bmatrix}

但是,如何用计算机将其解出?这就是个理论问题了。下面请看我如何展开题目,让诸位举一反三地认知这个问题。

假定任意给出一组近似的解:

\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}=\begin{bmatrix} \varepsilon x\\ \varepsilon y\\ \varepsilon z\\ \end{bmatrix} 。    将其带入等式(1)立即得到近似结果,可以写成:

\begin{bmatrix} &2\varepsilon x +& 3\varepsilon y &+5 \varepsilon z\\ &4\varepsilon x +& 5\varepsilon y &+3 \varepsilon z\\ &6\varepsilon x +& 7\varepsilon y &+2 \varepsilon z\\ \end{bmatrix} \ \approx \begin{bmatrix} 23\\ 23\\ 26\\ \end{bmatrix},进一步写出其残差方程:

\begin{bmatrix} &2\varepsilon x + & 3\varepsilon y + &5 \varepsilon z -23\\ &4\varepsilon x + & 5\varepsilon y + &3 \varepsilon z-23\\ &6\varepsilon x + & 7\varepsilon y+ &2 \varepsilon z-26\\ \end{bmatrix} \ \ = \begin{bmatrix} \Delta x\\ \Delta y\\ \Delta z \\ \end{bmatrix}                                            (2)

显然,如果:\Delta x = 0 , \Delta y = 0 ,\Delta z = 0,那么上边的\varepsilon x, \varepsilon y,\varepsilon z 就一定是方程(1)精确解!

因此,解方程(1)的问题转化成“如何让\Delta x = 0 , \Delta y = 0 ,\Delta z = 0”的问题。

以上内容核心点:该问题是否可以从一个非精确解开始,自动迭代地慢跑到精确解附近。

2 凸函数如何求极值的问题

 对于凸连续函数,求出它的极值点坐标还是容易的。这是因为,图函数的极值点只有一个,如果不是凸函数,极值点有多个,那就无法得到唯一解。

举个例子:

函数:f (x,y,z)=x^{2}+y^{2}+z^{2}的极值点是(0,0,0)这个点,其算法是先求f的梯度,令梯度等于0,解出x,y,z:

\frac{\partial f}{\partial x}=2x=0 ,\, \frac{\partial f}{\partial y}=2y=0, \frac{\partial f}{\partial z}=2z=0

拓展你的思路:将上述函数换成f (\Delta x,\Delta y,\Delta z)=\Delta x^{2}+\Delta y^{2}+\Delta z^{2},只要是令梯度等于0。就可以得出: \Delta x = 0 , \Delta y = 0 ,\Delta z = 0极值点,同时解出:\varepsilon x, \varepsilon y,\varepsilon z,这就是方程(1)最后解。

3 梯度下降法计算极值

f (\Delta x,\Delta y,\Delta z)=\Delta x^{2}+\Delta y^{2}+\Delta z^{2}改写成:

 f(\varepsilon x,\varepsilon y,\varepsilon z)= ( 2\varepsilon x + 3\varepsilon y + 5 \varepsilon z -23)^2 + ( 4\varepsilon x + 5\varepsilon y + 3 \varepsilon z -23)^2 + ( 6\varepsilon x + 7\varepsilon y + 2 \varepsilon z -26)^2 \ .\ . \ .\ .\ . \ . \ . \ . \ .\ .\ .\ \ \ \(3)

按照以下步骤求解:

1)给出一组任意值作为方程(1)的近似解  (\varepsilon x,\varepsilon y,\varepsilon z) = ( c1, c2, c3 )                       

2)  求出梯度的表达式

(\frac{\partial f}{\partial \varepsilon x} ,\, \frac{\partial f}{\partial \varepsilon y} , \frac{\partial f}{\partial \varepsilon z} )(是个较为复杂的式子,暂时不展开)

(\varepsilon x,\varepsilon y,\varepsilon z) = ( c1, c2, c3 )带入,得到此点(就是当前近似解)对应梯度:

grading f = ( T1, T2, T3 ),这是一个具体的数值向量。

3)修改近似解:将近似解(\varepsilon x,\varepsilon y,\varepsilon z) = ( c1, c2, c3 )移动一个微小位移;具体就是顺梯度反方向移动0.001倍个长度:

(\varepsilon x,\varepsilon y,\varepsilon z) = ( c1-0.001T1, c2-0.001T2, c3 -0.001T3)

 4)返回到1)再次迭代。

 5)迭代N遍后停止,得到(1)方程的数字解。

注:上文中的f就是所谓的代价函数。

4 以上方程的程序实现

import numpy as np

cs = np.array([[23],[23],[26]])
ix = np.array([[0.001],[0.002],[0.003]])

IA = np.array([[2.,3.,5.],
               [4,  5, 3],
               [6, 7, 2]  ])

for  i in range(6000000):
   grd = np.dot( IA.T,np.dot( IA, ix) - cs)   # 我估计百分之九十的同学,看不出这步如何得到!!
                                              # 那就继续努力吧
   ix = ix - 0.0001*grd
print(ix)

在没有任何优化的前提,迭代了六百万次,高效得到结果:

《从函数逼近论看回归问题》《非线性的回归,乃至任意的回归问题》[[1.06834998]
 [1.93894111]
 [3.00954498]]

是不是和精确结果

\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} = \begin{bmatrix} 1\\ 2\\ 3\\ \end{bmatrix}       很类似呢?列位不妨将代码粘下去跑跑。好了,如果能理解上述所讲,下面解释线性回归就毫无难度了。

后记:

以上只是回归问题的冰山之一角,后面还有更奇葩的东西,那就是:《从函数逼近论看回归问题》《非线性的回归,乃至任意的回归问题》《机器学习2:回归问题之一览众山小【2】》此两篇主要介绍更一般的理论,可以推广到回归问题、神经网络、协同过滤等一些列问题,通过学习后,保证你看明白yolo,gan、rnn等一些列难懂的东西,竟然就是点数学玩具而已。

Guess you like

Origin blog.csdn.net/gongdiwudu/article/details/121200855