在铺垫了基础矩阵和线性代数的相关知识后,我们现在尝试将【机器学习-01】中提到的方程组表示形式转化为矩阵形式,并利用矩阵方法来求解相关方程。同时,在【机器学习-01】中,我们已经初步探讨了最小二乘法这一优化算法的基本思想。最小二乘法是一个基础而重要的优化算法,其背后的数学推导和实际应用都值得我们深入研究。因此,从本节开始,我们将首先从矩阵方程出发,回顾矩阵运算的相关方法,并讲解矩阵求导的技巧。之后,我们将从更严谨的数学角度出发,深入讨论最小二乘法的基本原理,以深化对其的理解和应用。
1.方程组求解与矩阵方程求解
在【机器学习-01】机器学习基本概念与建模流程中,我们曾经利用损失函数的偏导函数方程组进行简单线性回归模型参数的求解:
尽管求解方程组有多种方法,例如【机器学习-01】机器学习基本概念与建模流程一文中所描述的,可以先通过方程变量相消法反解出一个变量(例如 w=1),然后再将这个解代入到其他方程中求解出另一个变量(例如 b=1)。这种方法确实能够手动求出方程组的解。然而,当想要借助编程工具来求解方程组时,就需要将原始的方程组求解问题转化为矩阵方程的求解问题。通过这种方法,我们可以利用计算机编程的便利性和高效性来自动求解复杂的方程组。因此,了解并掌握矩阵方程的求解方法对于利用编程工具进行机器学习建模是至关重要的。
20
w
+
8
b
−
28
=
0
20w+8b-28=0
20w+8b−28=0
8
w
+
4
b
−
12
=
0
8w+4b-12=0
8w+4b−12=0
我们令:
A = [ 20 8 8 4 ] A = \left [\begin{array}{cccc} 20 &8 \\ 8 &4 \\ \end{array}\right] A=[20884]
B = [ 28 12 ] B = \left [\begin{array}{cccc} 28 \\ 12 \\ \end{array}\right] B=[2812]
X = [ w b ] X = \left [\begin{array}{cccc} w \\ b \\ \end{array}\right] X=[wb]
其中
X
X
X为参数向量。借助矩阵运算相关知识,上述方程组可等价表示为:
A
⋅
X
−
B
=
0
A \cdot X - B = 0
A⋅X−B=0
即
A
⋅
X
=
B
A \cdot X = B
A⋅X=B
我们已经成功地将方程组转化为了矩阵方程。利用矩阵运算,我们可以直接在矩阵方程中求解参数向量X。为了进行这一计算,我们借助NumPy的基础知识,通过创建二维张量来表示上述矩阵方程中的矩阵A和向量B。这样,我们就可以利用NumPy提供的矩阵运算功能来求解这个矩阵方程,从而得到参数向量X的解。
A = np.array([[20, 8], [8, 4]])
A
array([[20, 8],
[ 8, 4]])
B = np.array([[28, 12]]).T
B
array([[28],
[12]])
注,此时B也是二维张量,可以使用矩阵乘法。
B.ndim
2
然后通过行列式计算结果,简单验证A是否满秩:
np.linalg.matrix_rank(A)
2
当然,也可以通过观察A的行列式计算结果是否为0,来判断A是否满秩
np.linalg.det(A)
15.999999999999991
对于满秩矩阵,我们可以求其逆矩阵
np.linalg.inv(A)
array([[ 0.25, -0.5 ],
[-0.5 , 1.25]])
然后在矩阵方程左右两端同时左乘其逆矩阵,即可解出X的取值
A
−
1
A
X
=
A
−
1
B
A^{-1}AX=A^{-1}B
A−1AX=A−1B
X
=
A
−
1
B
X=A^{-1}B
X=A−1B
np.matmul(np.linalg.inv(A), B)
array([[1.],
[1.]])
# 也可以使用dot方法,对于二维数组,dot就是执行矩阵乘法
np.linalg.inv(A).dot(B)
array([[1.],
[1.]])
即 X = [ w b ] = [ 1 1 ] X = \left [\begin{array}{cccc} w \\ b \\ \end{array}\right] =\left [\begin{array}{cccc} 1 \\ 1 \\ \end{array}\right] X=[wb]=[11]
除了手动创建矩阵并进行运算,NumPy库还为我们提供了一种便捷的函数来求解类似于 A ∗ X T = B A*X^T=B A∗XT=B这样的矩阵方程。通过使用这个函数,我们可以直接求解出参数向量X,从而避免了繁琐的手动计算过程。这种方法既简单又高效,极大地简化了矩阵方程的求解过程。
np.linalg.solve(A, B)
array([[1.],
[1.]])
2.向量求导运算
鉴于在编程实践中,矩阵和向量的使用相较于方程组形式更为普遍和高效,因此,包括最小二乘法在内的多种优化方法和算法的理论阐述,我们都将采用矩阵和向量作为基本的数据结构进行概念说明和数学公式的推导。在深入探讨最小二乘法的数学原理之前,我们有必要先补充一些关于向量求导的基础知识,以便为后续的分析和计算打下坚实的理论基础。
2.1 向量求导基本方法
首先,我们先来探讨相对简单的向量求导方法。通过这一过程,我们可以深入理解对结构化变量进行求导运算的本质。这不仅是数学上的重要技巧,也是后续机器学习算法推导的基础。
假设我们有一个二元函数,具体形式如下:
f ( x 1 , x 2 ) = 2 x 1 + x 2 f(x_1,x_2) = 2x_1+x_2 f(x1,x2)=2x1+x2
为了研究这个函数随着 x 1 、 x 2 x_1、x_2 x1、x2 的变化情况,我们可以分别对这两个变量求偏导数。通过求偏导,我们可以得到函数在每个变量上的局部变化率。
假设现有一个二元函数如下:
f
(
x
1
,
x
2
)
=
2
x
1
+
x
2
f(x_1,x_2) = 2x_1+x_2
f(x1,x2)=2x1+x2
并且,我们可以分别对该函数中的两个变量
x
1
、
x
2
x_1、x_2
x1、x2依次求偏导,可得:
∂
f
∂
x
1
=
2
\frac{\partial f}{\partial x_1} = 2
∂x1∂f=2
∂
f
∂
x
2
=
1
\frac{\partial f}{\partial x_2} = 1
∂x2∂f=1
现在我们考虑将上述求偏导的函数组改写为矩阵形式。则根据前述内容介绍,我们可以将函数中的两个变量依次排列,组成一个向量变元
,即一个由多个变量所组成的向量,即
x
=
[
x
1
,
x
2
]
T
x = [x_1, x_2]^T
x=[x1,x2]T
此时,如果我们按照向量变元内部的变量排列顺序,依次在每个变量位置填上该变量对应的偏导函数,则就构成了对于函数
f
f
f进行向量变元
x
x
x的向量求导的结果,即:
∂
f
(
x
)
∂
x
=
[
2
1
]
\frac{\partial f(x)}{\partial x} = \left [\begin{array}{cccc} 2 \\ 1 \\ \end{array}\right]
∂x∂f(x)=[21]
其中, x x x为向量变元。
至此,我们已经完成了向量求导的基本步骤。关键在于,我们按照向量变元中变量的排列顺序,逐一计算并填写了对应变量的偏导函数结果。然而,为了与方程组的矩阵/向量形式保持一致,原始的函数方程同样需要进行相应的改写。因此,原方程可以转化为向量/矩阵形式,以便进行后续的矩阵运算和向量求导。
f
(
x
)
=
A
T
⋅
x
f(x) = A^T \cdot x
f(x)=AT⋅x
其中,
A
=
[
2
,
1
]
T
A = [2, 1]^T
A=[2,1]T
x
=
[
x
1
,
x
2
]
T
x = [x_1, x_2]^T
x=[x1,x2]T
原方程为
y
=
2
x
1
+
x
2
y = 2x_1+x_2
y=2x1