【机器学习笔记02】最小二乘法(多元线性回归模型)

【参考资料】
【1】张贤达《矩阵分析与应用》
【2】同济大学《线性代数》
【3】程云鹏 《矩阵论》
【4】https://www.youtube.com/watch?v=94YIk1JVqYA
【5】https://blog.csdn.net/u010976453/article/details/54381248


数学基础

1.转置矩阵

定义: 将矩阵A同序数的行换成列成为转置矩阵 A T A^T AT,举例:
A = ( 1 2 0 3 − 1 1 ) A=\begin{pmatrix} 1 & 2 & 0 \\ 3 & -1 & 1 \end{pmatrix} A=(132101) 其转置矩阵为 A T = ( 1 3 2 − 1 0 1 ) A^T=\begin{pmatrix} 1 & 3 \\ 2 & -1\\ 0 & 1 \end{pmatrix} AT=120311

转置矩阵具有如下性质:
(1) ( A T ) T = A (A^T)^T=A (AT)T=A
(2) ( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
(3) ( λ A ) T = λ A T (\lambda A)^T = \lambda A^T (λA)T=λAT
(4) ( A B ) T = B T A T (AB)^T = B^TA^T (AB)T=BTAT

2.矩阵的导数

基本定义: 如果矩阵 A ( t ) = ( a i j ( t ) ) m × n A(t)=(a_{ij}(t))_m \times _n A(t)=(aij(t))m×n 每一个元素分量 a i j ( t ) a_{ij}(t) aij(t)是t的可微函数,则矩阵A的导数为:
A ′ ( t ) = d d t A ( t ) = ( d d t a i j ( t ) ) m × n A^\prime(t)=\dfrac{d}{dt}A(t)=(\dfrac{d}{dt}a_{ij}(t))_m \times _n A(t)=dtdA(t)=(dtdaij(t))m×n,也就是每个元素单独求导数。

当存在A、B两个可导矩阵,存在如下一些定理:

(1) d d t ( A ( T ) + B ( T ) ) = d d t A ( T ) + d d t B ( T ) \dfrac{d}{dt}(A(T)+B(T))=\dfrac{d}{dt}A(T)+\dfrac{d}{dt}B(T) dtd(A(T)+B(T))=dtdA(T)+dtdB(T)
(2) d d t ( A ( T ) B ( T ) ) = d d t A ( T ) ⋅ B ( T ) + A ( T ) ⋅ d d t B ( T ) \dfrac{d}{dt}(A(T)B(T))=\dfrac{d}{dt}A(T) \cdot B(T) + A(T)\cdot\dfrac{d}{dt} B(T) dtd(A(T)B(T))=dtdA(T)B(T)+A(T)dtdB(T)

需要注意的是在本例中,求导属于矩阵对向量的求导(重要,定义如下:

A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n . . . . . . . . . . . . a m 1 a m 2 ⋯ a m n ] A=\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ ... & ... & ... & ... \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix} A=a11a21...am1a12a22...am2...a1na2n...amn
x = [ x 1 , x 2 , . . . x n ] T x=[x_1, x_2, ... x_n]^T x=[x1,x2,...xn]T

我们有 A . x = [ a 11 x 1 a 12 x 2 ⋯ a 1 n x n a 21 x 1 a 22 x 2 ⋯ a 2 n x n . . . . . . . . . . . . a m 1 x 1 a m 2 x 2 ⋯ a m n x n ] A.x = \begin{bmatrix} a_{11}x_1 & a_{12}x_2 & \cdots & a_{1n}x_n \\ a_{21}x_1 & a_{22}x_2 & \cdots & a_{2n}x_n \\ ... & ... & ... & ... \\ a_{m1}x_1 & a_{m2}x_2 & \cdots & a_{mn}x_n \end{bmatrix} A.x=a11x1a21x1...am1x1a12x2a22x2...am2x2...a1nxna2nxn...amnxn
此时Ax对向量x,相当于每一行的第i列分别对 x i x_i xi求导,因此:
∂ A x ∂ x = [ a 11 a 21 ⋯ a 1 m a 12 a 22 ⋯ a 2 m . . . . . . . . . . . . a 1 n a 2 n ⋯ a n m ] = A T \dfrac{\partial Ax}{\partial x}=\begin{bmatrix} a_{11} & a_{21} & \cdots & a_{1m} \\ a_{12} & a_{22} & \cdots & a_{2m} \\ ... & ... & ... & ... \\ a_{1n} & a_{2n} & \cdots & a_{nm} \end{bmatrix} = A^T xAx=a11a12...a1na21a22...a2n...a1ma2m...anm=AT

备注(一个常用的定理):

(1) ∂ x T A x ∂ x = ( A T + A ) x \dfrac{\partial x^TAx}{\partial x} = (A^T + A)x xxTAx=(AT+A)x

3.多元线性回归的矩阵推导

在多元线性回归模型的矩阵表示下,对于矩阵方程Ax=b我们存在误差:

注意:在下面的推导中,A是我们的数据矩阵,也就是样本,而要求的x是系数。

ϕ = ∣ ∣ Δ b ∣ ∣ 2 = ( b − A x ) T ( b − A x ) = ( b T − x T A T ) ( b − A x ) \phi = ||\Delta b||^2 = (b-Ax)^T(b-Ax)=(b^T-x^TA^T)(b-Ax) ϕ=Δb2=(bAx)T(bAx)=(bTxTAT)(bAx),展开则有
ϕ = b T b − b T A x − x T A T b + x T A T A x \phi = b^Tb - b^TAx - x^TA^Tb + x^TA^TAx ϕ=bTbbTAxxTATb+xTATAx ,对x向量求导得到:
∂ ϕ ∂ x = − 2 A T b + 2 A T A x = 0 \dfrac{\partial \phi}{\partial x} = -2A^Tb+2A^TAx=0 xϕ=2ATb+2ATAx=0,则求x为:
x = ( A T A ) − 1 A T b x=(A^TA)^{-1}A^Tb x=(ATA)1ATb

备注:在吴恩达的视频中矩阵推导是采用矩阵迹的特性,因为 ( b T − x T A T ) ( b − A x ) (b^T-x^TA^T)(b-Ax) (bTxTAT)(bAx)是一个实数,实数的迹等于自己。因此做 ∂ ∂ x t r ( ( b T − x T A T ) ( b − A x ) ) \dfrac{\partial}{\partial x}tr((b^T-x^TA^T)(b-Ax)) xtr((bTxTAT)(bAx)),往下利用矩阵迹的求导,结果是一样的。


程序实现(基于矩阵公式推导)
# -*- coding: utf-8 -*-
import numpy  as np

def _test_multi_lr():

    x = np.random.random((2,200))#注意这里的数据矩阵实际是A的转置

    delta  = np.transpose(np.random.random_sample(200)/100)

    """
    随机变量为y = 0.3x1 + 0.4x2 + delta
    从矩阵的角度看y = wx
    w = [0.3, 0.4] [x1, x2]^T

    delta 是一个混淆变量
    """  

    y = np.matmul(np.array([0.3, 0.4]), x) + delta

    w = np.matmul(x, np.transpose(x)) # A^T * A

    w1 = np.linalg.inv(w) # (A^T*A)^T

    w2 = np.matmul(w1, x) # (A^T*A)^T*A^T

    w3 = np.matmul(w2, y) # (A^T*A)^T*A^T

    print(w3) #输出[0.30494425 0.40421688]
    
    pass

"""
说明:

多元线性回归的最小二乘法实现,采用矩阵公式推导。对应的笔记《最小二乘法(多元线性回归)》

作者:fredric

日期:2018-8-20

"""
if __name__ == "__main__":

    _test_multi_lr()

你可能感兴趣的:(机器学习,机器学习笔记)