@[toc]
標量、向量、矩陣和張量¶
- 標量(scalar):一個標量就是一個單獨的數,它不同與線性代數中研究其他大部分對象(通常是多個數的數組)。我們用斜體表示標量。標量通常被賦予小寫的變量名稱,比如:\(x\)
- 向量(vector): 一個向量是一列數。這些數都是有序排列的。通過次序中的索引,我們可以確定每個單獨的數。通常我們賦予向量粗體的小寫變量名稱.比如:\({\bf x}\)
\(\({\bf x}=\left[\begin{matrix}x_1 \\\x_2 \\\ \vdots \\\x_n\end{matrix}\right]\tag{1}\)\) - 矩陣(matrix):矩陣是一個二維數組,其中的每一個元素由兩個索引(而非一個)所確定。我們通常會賦予矩陣粗體的大寫變量名稱,比如:\({\bf A}\)
\(\({\bf A}=\left[\begin{matrix}A_{1,1}&A_{1,2} \\\A_{2,1}&A_{2,2}\end{matrix}\right]\tag{2}\)\) - 張量(tensor):在某種情況下,我們會討論座標超過兩維的數組。一般的,一個數組中的元素分佈在若干維座標的規則網格中,我們稱之爲張量,使用\({\sf A}\)表示,張量\({\sf A}\)中座標爲\((x,y,z)\)的元素記作\(A_{x,y,z}\)
Python代碼實現¶
使用Python創建普通二維矩陣
import numpy as np
m = np.mat([[1,2,3],[4,5,6]])
print m
輸出爲:
[[1 2 3]
[4 5 6]]
使用zeros創建一個\(3\times 2\)的0矩陣,還可以使用ones函數創建1矩陣
from numpy import *
import numpy as np
m = np.mat(zeros((3,2)))
print m
輸出爲:
[[0. 0.]
[0. 0.]
[0. 0.]]
創建單位矩陣,單位矩陣部分有介紹
from numpy import *
import numpy as np
m = np.mat(eye(3,3,dtype=int))
print m
輸出爲:
[[1 0 0]
[0 1 0]
[0 0 1]]
轉置¶
轉置(transpose)是矩陣的重要操作之一。矩陣的轉置是以對角線爲軸的鏡像,這條從左上角到右下角的對角線被稱爲主對角線(main diagonal),我們將矩陣\({\bf A}\)的轉置表示爲\({\bf A^\tau}\),定義如下:
\(\(({\bf A^\tau})_{i,j}=A_{j,i}\tag{3}\)\)
標量可以看作只有一個元素的矩陣。因此,標量的轉置等於它本身,\(a=a^\tau\)
\(\(A=\left[\begin{matrix}A_{1,1}&A_{1,2} \\\A_{2,1}&A_{2,2} \\\A_{3,1}&A_{3,2}\end{matrix}\right]\Rightarrow A^\tau=\left[\begin{matrix}A_{1,1}&A_{2,1}&A_{3,1} \\\A_{1,2}&A_{2,2}&A_{3,2}\end{matrix}\right]\tag{4}\)\)
矩陣的轉置也是一種運算,滿足下述運算規律(假設運算都可行的):
1. \(({\bf A}^\tau)^\tau={\bf A}\)
2. \(({\bf A}+{\bf B})^\tau={\bf A}^\tau+{\bf B}^\tau\)
3. \((\lambda {\bf A})^\tau=\lambda {\bf A}^\tau\)
4. \(({\bf A}{\bf B})^\tau={\bf B}^\tau{\bf A}^\tau\)
在深度學習中,我也使用一些不那麼常規的符號。我們允許矩陣和向量相加,產生另一個矩陣:\({\bf C}={\bf A}+{\bf a}\),其中\(C_{i,j}=A_{i,j}+b_j\)。換言之,向量\({\bf a}\)和矩陣\({\bf A}\)的每一行相加。這個簡寫方法使我們無需在加法操作前定義一個將向量\({\bf b}\)複製到每一行而生成的矩陣。這種隱式地複製向量\({\bf b}\)到很多位置的方式,稱之爲廣播(broadcasting)
Python代碼實現¶
矩陣的裝置
# coding=utf-8
import numpy as np
m = np.mat([[1,2,3],[4,5,6]])
print '轉置前:\n%s' % m
t = m.T
print '轉置前:\n%s' % t
輸出爲:
轉置前:
[[1 2 3]
[4 5 6]]
轉置前:
[[1 4]
[2 5]
[3 6]]
矩陣的運算¶
一. 矩陣的加法¶
定義: 設有兩個\(m\times n\)矩陣\({\bf A}=(a_{i,j})\)和\({\bf B}=(b_{i,j})\),那麼矩陣\({\bf A}\)與\({\bf B}\)的和記作\({\bf A}+{\bf B}\),規定爲:
\(\({\bf A}+{\bf B}=\left[\begin{matrix}a_{1,1}+b_{1,1} & a_{1,2}+b_{1,2} & \cdots & a_{1,n}+b_{1,n} \\\a_{2,1}+b_{2,1} & a_{2,2}+b_{2,2} & \cdots & a_{2,n}+b_{2,n} \\\ \vdots & \vdots & \vdots & \vdots \\\a_{m,1}+b_{m,1}&a_{m,2}+b_{m,2}&\cdots & a_{m,n}+b_{m,n}\end{matrix}\right]\tag{5}\)\)
注意:兩個矩陣必須是同型的矩陣時,這兩個矩陣才能進行加法運算
矩陣加法滿足下列運算規律(設\({\bf A},{\bf B},{\bf C}\)都是\(m \times n\)矩陣):
1. \({\bf A}+{\bf B}={\bf B}+{\bf A}\)
2. \(({\bf A}+{\bf B})+{\bf C}={\bf A}+({\bf B}+{\bf C})\)
Python代碼實現¶
計算兩個同型矩陣的加法
import numpy as np
m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12, 13], [14, 15, 16]])
print "m1 + m2 = \n%s " % (m1 + m2)
輸出爲:
m1 + m2 =
[[12 14 16]
[18 20 22]]
二. 矩陣的乘法¶
數與矩陣相乘定義: 數\(\lambda\)與矩陣\({\bf A}\)的乘積記作\(\lambda {\bf A}\)或\({\bf A} \lambda\),規定爲:
\(\(\lambda {\bf A}={\bf A} \lambda=\left[\begin{matrix}\lambda a_{1,1}&\lambda a_{1,2}&\cdots & \lambda a_{1,n}\\\lambda a_{2,1}&a_{2,2}&\cdots&\lambda a_{2,n}\\\vdots&\vdots&\vdots&\vdots\\\lambda a_{m,1}&\lambda a_{m,2}&\cdots & \lambda a_{m,n}\end{matrix}\right]\tag{6}\)\)
數乘矩陣滿足下列運算規律(設\({\bf A},{\bf B}\)爲\(m \times n\)矩陣,\(\lambda,\mu\)爲數):
1. \((\lambda \mu){\bf A}=\lambda (\mu{\bf A})\)
2. \((\lambda + \mu){\bf A}=\lambda {\bf A}+\mu {\bf A}\)
3. \(\lambda({\bf A}+{\bf B})=\lambda {\bf A}+\lambda {\bf A}\)
矩陣加法與數乘矩陣統稱爲矩陣的線性運算
矩陣與矩陣相乘定義: 設\({\bf A}=(a_{i,j})\)是一個\(m \times s\)矩陣,\({\bf B}=(b_{i,j})\)是一個\(s \times n\)矩陣,那麼規定矩陣\({\bf A}\)與\({\bf B}\)的乘積是一個\(m \times n\)矩陣\({\bf C}=(c_{i,j})\),記作:
\(\({\bf C}={\bf A}{\bf B}\tag{7}\)\)
計算如下:
\(\(\left[\begin{matrix}
a_{i,1} & a_{i,2} & \cdots & a_{i,s}
\end{matrix}\right]
\left[\begin{matrix}
b_{1,j} \\
b_{2,j} \\
\vdots \\
b_{s,j}
\end{matrix}\right]=
a_{i,1}b_{1,j}+a_{i,2}b_{2,j}+\cdots+a_{i,k}b_{k,j}=
\sum_{k=1}^s a_{i,k}b_{k,j}=
c_{i,j}\tag{8}\)\)
例如:
$$
\left[\begin{matrix}
a_{1,1} & a_{1,2} & a_{1,3} \
a_{2,1} & a_{2,2} & a_{2,3} \
\end{matrix}\right]
\left[\begin{matrix}
b_{1,1} & b_{1,2} \
b_{2,1} & b_{2,2} \
b_{3,1} & b_{3,2} \
\end{matrix}\right]=
\left[\begin{matrix}
a_{1,1}b_{1,1}+a_{1,2}b_{2,1}+a_{1,3}b_{3,1} & a_{1,1}b_{1,2}+a_{1,2}b_{2,2}+a_{1,3}b_{3,2} \
a_{2,1}b_{1,1}+a_{2,2}b_{2,1}+a_{2,3}b_{3,1} & a_{2,1}b_{1,2}+a_{2,2}b_{2,2}+a_{2,3}b_{3,2}
\end{matrix}\right]\tag{9}
$$
矩陣不滿足交換律,但在運算都可行的情況下滿足結合律和分配律
1. \(({\bf A}{\bf B}){\bf C}={\bf A}({\bf B}{\bf C})\)
2. \(\lambda ({\bf A}{\bf B})=(\lambda{\bf A}){\bf B}={\bf A}(\lambda{\bf B})\) (其中\(\lambda\)爲數)
3. \({\bf A}({\bf B}+{\bf C})={\bf A}{\bf B}+{\bf A}{\bf C},({\bf B}+{\bf C}){\bf A}={\bf B}{\bf A}+{\bf C}{\bf A}\)
Python代碼實現¶
計算\(2\times 3\)矩陣與\(3\times2\)矩陣相乘
import numpy as np
m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12], [13, 14], [15, 16]])
print "m1 * m2 = \n%s " % (m1 * m2)
輸出爲:
m1 * m2 =
[[ 82 88]
[199 214]]
單位矩陣和逆矩陣¶
單位矩陣(identity matrix) 就是對角線的元素都是1,而其他的所有元素都是0,如下:
\(\({\bf I}_3=\left[\begin{matrix}1 & 0 & 0 \\\0 & 1 & 0 \\\0 & 0 & 1\end{matrix}\right]\tag{10}\)\)
逆矩陣(matrix inversion)定義: 對於\(n\)階矩陣\({\bf A}\),如果有一個\(n\)階矩陣,使得:’
\(\({\bf A}{\bf B}={\bf B}{\bf A}={\bf I}\tag{11}\)\)
則說明矩陣\({\bf A}\)是可逆的,並把矩陣\({\bf B}\)稱爲\({\bf A}\)的逆矩陣,而且矩陣是唯一的,記作\({\bf A}^{-1}\)
當\(|{\bf A}|\not=0\),則矩陣\({\bf A}\)可逆,且
\(\({\bf A}^{-1}=\frac{1}{|{\bf A}|} {\bf A}^\ast\tag{12}\)\)
其中\({\bf A}^\ast\)稱爲矩陣的{\bf A}的伴隨矩陣
Python代碼實現¶
單位矩陣的計算
from numpy import *
import numpy as np
m = np.mat(eye(3,3,dtype=int))
print m
輸出爲:
[[1 0 0]
[0 1 0]
[0 0 1]]
計算\(3\times3\)矩陣的逆矩陣
# coding=utf-8
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
I = m.I
print '矩陣:\n%s\n的逆矩陣爲:\n%s' % (m, I)
輸出爲:
矩陣:
[[2 0 0]
[0 4 0]
[0 0 8]]
的逆矩陣爲:
[[0.5 0. 0. ]
[0. 0.25 0. ]
[0. 0. 0.125]]
求\(3\times3\)方陣的行列式
# coding=utf-8
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
d = np.linalg.det(m)
print d
輸出爲:
64.0
求\(3\times3\)方陣的伴隨矩陣
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
i = m.I
d = np.linalg.det(m)
a = i * d
print a
輸出爲:
[[32. 0. 0.]
[ 0. 16. 0.]
[ 0. 0. 8.]]
線性相關和生成子空間¶
線性組合(linear combination)
爲了分析方程有多少個解,我們可以將\({\bf A}\)的列向量看作從原點(origin)(元素都是零的向量)出發的不同方向,確定有多少種方法可以到達向量\({\bf b}\).在這個觀點下,向量\({\bf x}\)中的每個元素都是表示我們應該沿着這些方向走多遠,即\(x_i\)表示我們需要沿着第\(i\)個向量的方向走多遠:
\(\({\bf Ax}=\sum_i x_i{\bf A}_{:,i}\tag{13}\)\)
生成子空間(span)
形式上,一組向量的線性組合,是指每個向量乘以對應標量係數之後的和,即:
\(\(\sum_i c_iv^{(i)}\tag{14}\)\)
一組向量的生產子空間是原始向量線性組合後所能抵達的點的集合
範數¶
範數(norm):在機器學習中,我們經常使用稱爲範數的函數來衡量向量的大小,形式上,\(L^p\)範數定義入下:
\(\(||{\bf x}||_p=\left(\sum_x |x_i|^p\right)^\frac{1}{p}\tag{15}\)\)
範數滿足下列性質的任意函數:
- \(f(x)=0\Rightarrow x = 0\)
- \(f(x+y) \leq f(x) + f(y)\)(三角不定式(triangle inequality))
- \(\forall\alpha \in {\Bbb R},f(\alpha{\bf x})=|\alpha|f({\bf x})\)
當\(p=2\)時,\(L^2\)範數稱爲歐幾里得範數(Euclidean norm).他表示從原點出發到向量\({\bf x}\)確定的點的歐幾里得距離
當\(p=\infty\)時,\(L^\infty\)範數稱爲最大範數(max norm).這個範數表示向量中具有最大幅度的元素的絕對值:
\(\(||{\bf x}||_\infty = {\rm max}_i |x_i|\)\)
參考資料¶
- lan Goodfellow,Yoshua Bengio,Aaron Courville.深度學習(中文版).趙申劍,黎彧君,符天凡,李凱,譯.北京:人民郵電出版社
- 同濟大學數學系.工程數學-線性代數(第六版).北京:高等教育出版社