??在鋪墊了基礎(chǔ)矩陣和線性代數(shù)的相關(guān)知識后,我們現(xiàn)在嘗試將【機器學(xué)習(xí)-01】中提到的方程組表示形式轉(zhuǎn)化為矩陣形式,并利用矩陣方法來求解相關(guān)方程。同時,在【機器學(xué)習(xí)-01】中,我們已經(jīng)初步探討了最小二乘法這一優(yōu)化算法的基本思想。最小二乘法是一個基礎(chǔ)而重要的優(yōu)化算法,其背后的數(shù)學(xué)推導(dǎo)和實際應(yīng)用都值得我們深入研究。因此,從本節(jié)開始,我們將首先從矩陣方程出發(fā),回顧矩陣運算的相關(guān)方法,并講解矩陣求導(dǎo)的技巧。之后,我們將從更嚴謹?shù)臄?shù)學(xué)角度出發(fā),深入討論最小二乘法的基本原理,以深化對其的理解和應(yīng)用。
1.方程組求解與矩陣方程求解
??在【機器學(xué)習(xí)-01】機器學(xué)習(xí)基本概念與建模流程中,我們曾經(jīng)利用損失函數(shù)的偏導(dǎo)函數(shù)方程組進行簡單線性回歸模型參數(shù)的求解:
??
盡管求解方程組有多種方法,例如【機器學(xué)習(xí)-01】機器學(xué)習(xí)基本概念與建模流程一文中所描述的,可以先通過方程變量相消法反解出一個變量(例如 w=1),然后再將這個解代入到其他方程中求解出另一個變量(例如 b=1)。這種方法確實能夠手動求出方程組的解。然而,當(dāng)想要借助編程工具來求解方程組時,就需要將原始的方程組求解問題轉(zhuǎn)化為矩陣方程的求解問題。通過這種方法,我們可以利用計算機編程的便利性和高效性來自動求解復(fù)雜的方程組。因此,了解并掌握矩陣方程的求解方法對于利用編程工具進行機器學(xué)習(xí)建模是至關(guān)重要的。
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=[208?84?]
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為參數(shù)向量。借助矩陣運算相關(guān)知識,上述方程組可等價表示為:
A
?
X
?
B
=
0
A \cdot X - B = 0
A?X?B=0
即
A
?
X
=
B
A \cdot X = B
A?X=B
我們已經(jīng)成功地將方程組轉(zhuǎn)化為了矩陣方程。利用矩陣運算,我們可以直接在矩陣方程中求解參數(shù)向量X。為了進行這一計算,我們借助NumPy的基礎(chǔ)知識,通過創(chuàng)建二維張量來表示上述矩陣方程中的矩陣A和向量B。這樣,我們就可以利用NumPy提供的矩陣運算功能來求解這個矩陣方程,從而得到參數(shù)向量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
然后通過行列式計算結(jié)果,簡單驗證A是否滿秩:
np.linalg.matrix_rank(A)
2
當(dāng)然,也可以通過觀察A的行列式計算結(jié)果是否為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方法,對于二維數(shù)組,dot就是執(zhí)行矩陣乘法
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?]
除了手動創(chuàng)建矩陣并進行運算,NumPy庫還為我們提供了一種便捷的函數(shù)來求解類似于 A ? X T = B A*X^T=B A?XT=B這樣的矩陣方程。通過使用這個函數(shù),我們可以直接求解出參數(shù)向量X,從而避免了繁瑣的手動計算過程。這種方法既簡單又高效,極大地簡化了矩陣方程的求解過程。
np.linalg.solve(A, B)
array([[1.],
[1.]])
2.向量求導(dǎo)運算
??鑒于在編程實踐中,矩陣和向量的使用相較于方程組形式更為普遍和高效,因此,包括最小二乘法在內(nèi)的多種優(yōu)化方法和算法的理論闡述,我們都將采用矩陣和向量作為基本的數(shù)據(jù)結(jié)構(gòu)進行概念說明和數(shù)學(xué)公式的推導(dǎo)。在深入探討最小二乘法的數(shù)學(xué)原理之前,我們有必要先補充一些關(guān)于向量求導(dǎo)的基礎(chǔ)知識,以便為后續(xù)的分析和計算打下堅實的理論基礎(chǔ)。
2.1 向量求導(dǎo)基本方法
??首先,我們先來探討相對簡單的向量求導(dǎo)方法。通過這一過程,我們可以深入理解對結(jié)構(gòu)化變量進行求導(dǎo)運算的本質(zhì)。這不僅是數(shù)學(xué)上的重要技巧,也是后續(xù)機器學(xué)習(xí)算法推導(dǎo)的基礎(chǔ)。
??假設(shè)我們有一個二元函數(shù),具體形式如下:
f ( x 1 , x 2 ) = 2 x 1 + x 2 f(x_1,x_2) = 2x_1+x_2 f(x1?,x2?)=2x1?+x2?
為了研究這個函數(shù)隨著 x 1 、 x 2 x_1、x_2 x1?、x2? 的變化情況,我們可以分別對這兩個變量求偏導(dǎo)數(shù)。通過求偏導(dǎo),我們可以得到函數(shù)在每個變量上的局部變化率。
假設(shè)現(xiàn)有一個二元函數(shù)如下:
f
(
x
1
,
x
2
)
=
2
x
1
+
x
2
f(x_1,x_2) = 2x_1+x_2
f(x1?,x2?)=2x1?+x2?
并且,我們可以分別對該函數(shù)中的兩個變量
x
1
、
x
2
x_1、x_2
x1?、x2?依次求偏導(dǎo),可得:
?
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
現(xiàn)在我們考慮將上述求偏導(dǎo)的函數(shù)組改寫為矩陣形式。則根據(jù)前述內(nèi)容介紹,我們可以將函數(shù)中的兩個變量依次排列,組成一個向量變元
,即一個由多個變量所組成的向量,即
x
=
[
x
1
,
x
2
]
T
x = [x_1, x_2]^T
x=[x1?,x2?]T
此時,如果我們按照向量變元內(nèi)部的變量排列順序,依次在每個變量位置填上該變量對應(yīng)的偏導(dǎo)函數(shù),則就構(gòu)成了對于函數(shù)
f
f
f進行向量變元
x
x
x的向量求導(dǎo)的結(jié)果,即:
?
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為向量變元。
??至此,我們已經(jīng)完成了向量求導(dǎo)的基本步驟。關(guān)鍵在于,我們按照向量變元中變量的排列順序,逐一計算并填寫了對應(yīng)變量的偏導(dǎo)函數(shù)結(jié)果。然而,為了與方程組的矩陣/向量形式保持一致,原始的函數(shù)方程同樣需要進行相應(yīng)的改寫。因此,原方程可以轉(zhuǎn)化為向量/矩陣形式,以便進行后續(xù)的矩陣運算和向量求導(dǎo)。
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?+x2?
結(jié)合函數(shù)求導(dǎo)結(jié)果,我們不難發(fā)現(xiàn),
?
f
(
x
)
?
x
\frac{\partial f(x)}{\partial x}
?x?f(x)?最終計算結(jié)果就是
A
A
A,即
?
f
(
x
)
?
x
=
?
(
A
T
?
x
)
?
x
=
A
\frac{\partial f(x)}{\partial x} = \frac{\partial(A^T \cdot x)}{\partial x} = A
?x?f(x)?=?x?(AT?x)?=A
在這里, x x x代表向量變元,而 A A A是一個列向量。值得注意的是,這個結(jié)論可以推廣到更一般的情況,我們將在下一小節(jié)給出相關(guān)的證明。為了便于理解和應(yīng)用,此處我們直接給出向量變元的函數(shù)求導(dǎo)計算公式。這個公式將幫助我們更高效地處理涉及向量變元的函數(shù)求導(dǎo)問題。
很多時候,我們并不嚴格區(qū)分向量方程和矩陣方程,而是將自變量為向量或矩陣的方程統(tǒng)稱為矩陣方程。同樣地,包含向量或矩陣的表達式也被我們統(tǒng)一稱為矩陣表達式。這樣的處理方式有助于我們更靈活地運用矩陣和向量的運算規(guī)則,從而簡化問題求解過程。
- 向量求導(dǎo)的定義法
設(shè) f ( x ) f(x) f(x)是一個關(guān)于 x x x的函數(shù),其中 x x x是向量變元,并且 x = [ x 1 , x 2 , . . . , x n ] T x = [x_1, x_2,...,x_n]^T x=[x1?,x2?,...,xn?]T
則 ? f ? x = [ ? f ? x 1 , ? f ? x 2 , . . . , ? f ? x n ] T \frac{\partial f}{\partial x} = [\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n}]^T ?x?f?=[?x1??f?,?x2??f?,...,?xn??f?]T
而該表達式也被稱為向量求導(dǎo)的梯度向量形式。
?
x
f
(
x
)
=
?
f
?
x
=
[
?
f
?
x
1
,
?
f
?
x
2
,
.
.
.
,
?
f
?
x
n
]
T
\nabla _xf(x) = \frac{\partial f}{\partial x} = [\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n}]^T
?x?f(x)=?x?f?=[?x1??f?,?x2??f?,...,?xn??f?]T
通過求得函數(shù)的梯度向量求解向量導(dǎo)數(shù)的方法,也被稱為定義法求解。
值得注意的是,對于多元函數(shù),我們總是可以計算出其梯度向量。然而,這個梯度向量或者說向量求導(dǎo)的結(jié)果,并不總是可以由一些已經(jīng)定義的向量直接表示出來。以 A A A為例,雖然它表示了 f ( x ) f(x) f(x)的向量求導(dǎo)結(jié)果,但并非所有情況下都能如此直接地找到這樣的向量表示。
2.2 常見向量求導(dǎo)公式
??在前期的學(xué)習(xí)中,數(shù)學(xué)理論推導(dǎo)經(jīng)常涉及到向量變元的求導(dǎo)。因此,除了掌握基本的向量求導(dǎo)方法,我們還需要推導(dǎo)幾個常用的向量求導(dǎo)公式。這些公式的特點是,向量求導(dǎo)的結(jié)果能夠通過一些已經(jīng)定義的向量進行簡潔的表示。在這里,我們假設(shè)x是一個包含n個變量的列向量,即 x = [ x 1 , x 2 , . . . , x n ] T x = [x_1, x_2,...,x_n]^T x=[x1?,x2?,...,xn?]T。通過掌握這些公式,我們可以更高效地處理涉及向量變元的求導(dǎo)問題。
-
(1) ? a ? x = 0 \frac{\partial a}{\partial x} = 0 ?x?a?=0
證明:
? a ? x = [ ? a ? x 1 , ? a ? x 2 , . . . , ? a ? x n ] T = [ 0 , 0 , . . . , 0 ] T \frac{\partial a}{\partial x} = [\frac{\partial a}{\partial x_1}, \frac{\partial a}{\partial x_2}, ..., \frac{\partial a}{\partial x_n}]^T = [0,0,...,0]^T ?x?a?=[?x1??a?,?x2??a?,...,?xn??a?]T=[0,0,...,0]T -
(2)
? ( x T ? A ) ? x = ? ( A T ? x ) ? x = A \frac{\partial(x^T \cdot A)}{\partial x} = \frac{\partial(A^T \cdot x)}{\partial x} = A ?x?(xT?A)?=?x?(AT?x)?=A
證明:
??此時A為擁有n個分量的常數(shù)向量,設(shè)
A
=
[
a
1
,
a
2
,
.
.
.
,
a
n
]
T
A = [a_1, a_2,...,a_n]^T
A=[a1?,a2?,...,an?]T,則有
? ( x T ? A ) ? x = ? ( A T ? x ) ? x = ? ( a 1 ? x 1 + a 2 ? x 2 + . . . + a n ? x n ) ? x = [ ? ( a 1 ? x 1 + a 2 ? x 2 + . . . + a n ? x n ) ? x 1 ? ( a 1 ? x 1 + a 2 ? x 2 + . . . + a n ? x n ) ? x 2 . . . ? ( a 1 ? x 1 + a 2 ? x 2 + . . . + a n ? x n ) ? x n ] = [ a 1 a 2 . . . a n ] = A \begin{aligned} \frac{\partial(x^T \cdot A)}{\partial x} & = \frac{\partial(A^T \cdot x)}{\partial x}\\ & = \frac{\partial(a_1 \cdot x_1 + a_2 \cdot x_2 +...+ a_n \cdot x_n)}{\partial x}\\ & = \left [\begin{array}{cccc} \frac{\partial(a_1 \cdot x_1 + a_2 \cdot x_2 +...+ a_n \cdot x_n)}{\partial x_1} \\ \frac{\partial(a_1 \cdot x_1 + a_2 \cdot x_2 +...+ a_n \cdot x_n)}{\partial x_2} \\ . \\ . \\ . \\ \frac{\partial(a_1 \cdot x_1 + a_2 \cdot x_2 +...+ a_n \cdot x_n)}{\partial x_n} \\ \end{array}\right] \\ & =\left [\begin{array}{cccc} a_1 \\ a_2 \\ . \\ . \\ . \\ a_n \\ \end{array}\right] = A \end{aligned} ?x?(xT?A)??=?x?(AT?x)?=?x?(a1??x1?+a2??x2?+...+an??xn?)?= ??x1??(a1??x1?+a2??x2?+...+an??xn?)??x2??(a1??x1?+a2??x2?+...+an??xn?)?...?xn??(a1??x1?+a2??x2?+...+an??xn?)?? ?= ?a1?a2?...an?? ?=A?
- (3)
? ( x T ? x ) ? x = 2 x \frac{\partial (x^T \cdot x)}{\partial x} = 2x ?x?(xT?x)?=2x
證明:
? ( x T ? x ) ? x = ? ( x 1 2 + x 2 2 + . . . + x n 2 ) ? x = [ ? ( x 1 2 + x 2 2 + . . . + x n 2 ) ? x 1 ? ( x 1 2 + x 2 2 + . . . + x n 2 ) ? x 2 . . . ? ( x 1 2 + x 2 2 + . . . + x n 2 ) ? x n ] = [ 2 x 1 2 x 2 . . . 2 x n ] = 2 x \begin{aligned} \frac{\partial(x^T \cdot x)}{\partial x} & = \frac{\partial(x_1^2+x_2^2+...+x_n^2)}{\partial x}\\ & = \left [\begin{array}{cccc} \frac{\partial(x_1^2+x_2^2+...+x_n^2)}{\partial x_1} \\ \frac{\partial(x_1^2+x_2^2+...+x_n^2)}{\partial x_2} \\ . \\ . \\ . \\ \frac{\partial(x_1^2+x_2^2+...+x_n^2)}{\partial x_n} \\ \end{array}\right] \\ & =\left [\begin{array}{cccc} 2x_1 \\ 2x_2 \\ . \\ . \\ . \\ 2x_n \\ \end{array}\right] = 2x \end{aligned} ?x?(xT?x)??=?x?(x12?+x22?+...+xn2?)?= ??x1??(x12?+x22?+...+xn2?)??x2??(x12?+x22?+...+xn2?)?...?xn??(x12?+x22?+...+xn2?)?? ?= ?2x1?2x2?...2xn?? ?=2x?
此處 x T x x^Tx xTx也被稱為向量的交叉乘積(crossprod)。
??至此,我們已經(jīng)完成了相關(guān)向量求導(dǎo)常用公式的證明。然而,從上述證明過程可以看出,使用定義法進行公式證明往往相當(dāng)繁瑣(盡管整個流程相對清晰)。因此,我們會在后續(xù)補充除了定義法之外的向量乘法常用公式的證明方法。
??此外,矩陣的求導(dǎo)方法與向量類似。當(dāng)變量以矩陣形式出現(xiàn)時,我們實際上是在按照矩陣的基本結(jié)構(gòu),在每個位置上對相應(yīng)的變量分量求偏導(dǎo)函數(shù)。但由于矩陣比向量多了一個維度,結(jié)構(gòu)更為復(fù)雜,因此求解過程也更為繁瑣。由于我們初期接觸的大多數(shù)是向量變元的方程,關(guān)于矩陣求導(dǎo)的常用公式推導(dǎo),我們將在后續(xù)逐步展開討論。文章來源:http://www.zghlxwxcb.cn/news/detail-841885.html
??最后,我們還需要簡要辨析一下矩陣函數(shù)和矩陣方程這兩個概念的區(qū)別:文章來源地址http://www.zghlxwxcb.cn/news/detail-841885.html
- 矩陣方程:它指的是變量為矩陣的方程。
- 矩陣函數(shù):它類似于函數(shù)矩陣,指的是自變量和因變量都是n階矩陣的函數(shù)。也可以簡單理解為由函數(shù)構(gòu)成的矩陣,其中每個函數(shù)的變量都是矩陣。
通過這些辨析,我們可以更清楚地理解這兩個概念在數(shù)學(xué)和機器學(xué)習(xí)中的應(yīng)用
到了這里,關(guān)于【機器學(xué)習(xí)-03】矩陣方程與向量求導(dǎo)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!