機器學習中的基本數學知識
注:本文的代碼是使用Python 3寫的。
線性代數(linear algebra)
第一公式
這是在機器學習中,最常見的公式。我把這個稱為機器學習的第一公式,實際上就是線性分類函數(linear classifier)。
訓練分類器的目標就是求出\((w, b)\)。
其中:
\(x\) 是一個一行矩陣 \([[x_1, x_2, ..., x_n]]\)。
\(w\) 是一個一行矩陣 \([[w_1, w_2, ..., w_n]]\)。
\(x\) 和 \(w\) 的維度相同。
\(b\) 是一個數。
\(xw^T = \sum_{i=1}^n x_iw_i\),稱為點積(dot product)。
有時,我們也會見到這個公式表示為類似下面的樣子,它們的基本含義都是一樣的。
\(f(x) = w x + b\)
\(f(x) = w^T x + b\)
\(f(x) = \vec{w} \cdot \vec{x} + b\)
注:這里\(w\)表示為一個一維數組(或者向量、矢量(vector)) \([x_1, x_2, ..., x_n]\)。
注:一維數組:在數學上,可以理解為向量,表示多維空間上的一個點。
注:由於在線性代數中,矩陣乘法\(ab \ne ba\),所以對於表達式\(w^Tx\),嚴格地說,要把矢量(向量)看做一列的矩陣(而不是一行的矩陣),才符合數學上的定義。
注:表達式\(\vec{w} \cdot \vec{x}\)和\(w x\)是正確的,因為\(w\)和\(x\)是矢量,這個符合矢量計算的定義。
矩陣的操作
由於,這篇文章是從數學的角度寫的,所以我們先關注矩陣的操作。
換位(transpose)
矩陣的換位操作:將矩陣中的數按照對角線交換。
數學公式:\(w^T\)
代碼示例:
# Matrix Transpose
m = numpy.mat([[1, 2], [3, 4]])
print("Matrix.Transpose:")
print(m.T)
''' Output:
Matrix.Transpose:
[[1 3]
[2 4]]
'''
矩陣乘法
- 矩陣相乘的含義
如果一斤蘋果10元,5斤蘋果多少元?答案是:\(10 * 5=50\)
如果一斤蘋果10元,一斤梨20元,5斤蘋果2斤梨一共多少元?
答案是:
我們可以看出矩陣相乘的約束:乘數1的列數要和乘數2的行數相等。
- 矩陣乘法不滿足交換律
我們再看看交換乘數后,計算的結果:
比如:數\(20\)的含義是2斤蘋果多少錢。
舉例說明它們的不同之處:
\(m1 \cdot m2\)的計算方法是:
\(m2 \cdot m1\)的計算方法是:
- 計算公式
矩陣相乘是:用矩陣1的每一行和矩陣2的每一列的點積,得到一個矩陣。
\(l * m\) 的矩陣乘以 \(m * n\) 的矩陣,形成一個\(l * n\) 的矩陣。
- 代碼演示:
# Matrix Multiplication
print("Matrix Multiplication")
a = numpy.mat([1, 2])
b = numpy.mat([[10], [20]])
print(a * b)
print(a.T * b.T)
a = numpy.mat([[1, 2], [3, 4]])
b = numpy.mat([[10, 20], [30, 40]])
print(a * b)
''' Output:
[[50]]
[[10 20]
[20 40]]
[[ 70 100]
[150 220]]
'''
矩陣的各種乘積
| 操作 | 數學符號 | Python | Demo |
|---|---|---|---|
| 點積(dot product) | $a b$ | a.dot(b) numpy.dot(a, b) |
$$ \begin{array}\\ AB & = (1, 2) \begin{pmatrix} 10 \\ 20 \end{pmatrix} \\ & = 1 * 10 + 2 * 20 \\ & = 50 \end{array} $$ |
| 內積(inner product) | $a \cdot b$ $\langle a,b \rangle$ |
numpy.inner(a, b) | $$ a \cdot b = a b^T $$ |
| 外積(outer product) | $a \otimes b$ | numpy.outer(a, b) | $$ \begin{array}\\ A \otimes B & = \begin{pmatrix} 1 \\ 2 \end{pmatrix} \begin{pmatrix} 10 & 20 \end{pmatrix} \\ & = \begin{pmatrix} 1*10 & 1*20 \\ 2*10 & 2*20 \end{pmatrix} \\ & = \begin{pmatrix} 10 & 20 \\ 20 & 40 \end{pmatrix} \end{array} $$ |
| 元素積(element-wise product, point-wise product, Hadamard product ) | $a \circ b$ $a \odot b$ |
numpy.multiply(a, b) | $$ \begin{array}\\ A \odot B & = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} \begin{pmatrix} 10 & 20 \end{pmatrix} \\ & = \begin{pmatrix} 1*10 & 2*20 \\ 3*10 & 4*20 \end{pmatrix} \\ & = \begin{pmatrix} 10 & 40 \\ 30 & 80 \end{pmatrix} \end{array} $$ |
注:Python中,矩陣數據可以表示為matrix和ndarray兩種類型。
這兩種類型的操作非常接近,但是有細微的不同。
ndarray * operation :element-wise product.
matrix * operation :dot product.
numpy.multiply for ndarray :element-wise product. same.
numpy.multiply for matrix :element-wise product. same.
numpy.dot for ndarray : inner product. 1-d array.
numpy.dot for matrix :dot product. shape determined by values.
numpy.inner for ndarray :inner product. 1-d array.
numpy.inner for matrix :inner product. shape determined by values.
numpy.outer for ndarray :outer product. same.
numpy.outer for matrix :outer product. same.
內積
英文: inner product, scalar product。
矢量的降維運算,變成一個數。
矩陣的內積是每行每列的內積的矩陣。
x = numpy.array([1, 2])
y = numpy.array([10, 20])
print("Array inner:")
print(numpy.inner(x, y))
''' Output:
Array inner:
50
'''
x = numpy.mat([[1, 2], [3, 4]])
y = numpy.mat([10, 20])
print("Matrix inner:")
print(numpy.inner(x, y))
''' Output:
Matrix inner:
[[ 50]
[110]]
'''
外積
矢量的升維運算, \(m\)維矢量和\(n\)維矢量的外積是\(m * n\)為矩陣。
矩陣的並集運算, \(a1 * a2\)維矢量和\(b1 * b2\)維矩陣的外積是\((a1 * a2) * (b1 * b2)\)為矩陣。
x = numpy.array([1, 3])
y = numpy.array([10, 20])
print("Array outer:")
print(numpy.outer(x, y))
''' Output:
Array outer:
[[10 20]
[30 60]]
'''
x = numpy.mat([[1, 2], [3, 4]])
y = numpy.mat([10, 20])
print("Matrix outer:")
print(numpy.outer(x, y))
''' Output:
Matrix outer:
[[10 20]
[20 40]
[30 60]
[40 80]]
'''
注:有沒有發現matrix outer 是vector outer的並集。
元素積(element-wise product/point-wise product/Hadamard product
- 計算公式
x = numpy.array([1, 3])
y = numpy.array([10, 20])
print("Array element-wise product:")
print(x * y)
''' Output:
Array element-wise product:
[10 60]
'''
加
x = numpy.mat([[1, 2], [3, 4]])
y = numpy.mat([[10, 20],[30, 40]])
print("Matrix Add :")
print(x + y)
''' Output:
Matrix Add :
[[11 22]
[33 44]]
'''
低等數學
- 求總和公式
這個大家應該都知道。
- 求總積公式
- 對數
- 對數的含義:
- 求數的長度。
- 將乘法轉變成加法。
- 解決下溢出問題:由於太多很小的數相乘造成的問題。
- 數學表達
- 對數的含義:
由於不同底的對數的結果是等比關系,所以,有時底數是誰,是無所謂的。
- 等比
\(a\)等比於\(b\)。可用於算法復雜度計算。
- 下取整(floor)和上取整(ceil)
幾何
范數(norm)
- L1范數
\(\lVert w \rVert_1\) : L1范數,也就是各項目絕對值的和。
- L2范數
\(\lVert w \rVert \text{ or } \lVert w \rVert_2\) : L2范數,也就是各項目平方和的平方根。
拉格朗日乘子法和KKT條件
如果方程式\(f(x) = wx + b\)有不等式約束條件,拉格朗日乘子法和KKT條件提供了一種方法,可以計算\((w, b)\)
關於拉格朗日乘子法和KKT條件,請看:
深入理解拉格朗日乘子法(Lagrange Multiplier)和KKT條件
微分(differential)
表示形式
含義
數學含義是在\(x\)點上,\(f(x)\)的變化除以\(x\)的變化。
數學上可以認為是:斜率
機器學習中指的是:梯度。
計算梯度后,乘以一個比值(步長),可以得到矯正值,用於反向傳播(矯正)權值。
partial differential:偏微分,表示函數在某個維度上的微分。這時,可將其它維度看做常量。
法則
| 法則 | 微分 | 偏微分 |
|---|---|---|
| 和法則(sum rule) | $(f + g)' = f' + g'$ | $$\frac{\partial (u + v)}{\partial x} = \frac{\partial u}{\partial x} + \frac{\partial v}{\partial x}$$ |
| 積法則(product rule) | $(f \cdot g)' = f' \cdot g + f \cdot g'$ | $${\partial (u \cdot v) \over \partial x} = u \cdot {\partial v \over \partial x} + v \cdot {\partial u \over \partial x}$$ |
| 鏈式法則(chain rule of differentiation) | $(f(g(x)))' = f'(g(x))g'(x)$ | $${\partial z \over \partial x} = {\partial z \over \partial y} \cdot {\partial y \over \partial x}$$ |
常見導數公式
| f(x) | f'(x) |
|---|---|
| $ax$ | $a$ |
| $x^n$ | $nx^{n-1}$ |
| $x + c$ | $1$ |
| $e^x$ | $e^x$ |
| $ln(x)$ | $\frac{1}{x}$ |
統計學/概率論
- 貝葉斯公式(Bayes formula)
比如:在判斷垃圾郵件的算法中:
P(A) : 所有郵件中,垃圾郵件的概率。
P(B) : 出現某個單詞的概率。
P(B|A) : 垃圾郵件中,出現某個單詞的概率。
P(A|B) : 出現某個單詞的郵件,是垃圾郵件的概率。
信息論
香農熵(Shannon Entropy)
-
熵的定義
在信息論中,熵是接收的每條消息中包含的信息的平均量,又被稱為信息熵、信源熵、平均自信息量。
熵定義為信息的期望值。
熵實際是對隨機變量的比特量和順次發生概率相乘再總和的數學期望。
熵的單位通常為比特, bit 或者sh(annon) (基於2),但也用nat(基於自然對數)、Hart(基於10)計量,取決於定義用到對數的底。
熵的單位不重要。(因為是求對數,所以是等比的。不理解這句話也無所謂。)
熵值是一個>=0的值。
如果為0,則表明結果可以准確預測。從下面的公式可以看出,其概率為1. -
熵的特征
- 發生概率越小的信息,熵值越大。
- 常識的熵為0。
- 從計算損失的角度來說:熵值越大,說明損失越大。
-
期望值
在概率論和統計學中,一個離散性隨機變量的期望值(或數學期望、或均值,亦簡稱期望,物理學中稱為期待值)是試驗中每次可能結果的概率乘以其結果的總和。
比如擲骰子, 其點數的期望值是3.5:
\(E(x) = 1 * 1 / 6 + 1 * 2 / 6 + 1 * 3 / 6 + 1 * 4 / 6 + 1 * 5 / 6 + 1 * 6 / 6 = 3.5\) -
通俗的理解
信息熵是:- 各個 (值的概率 * 值的長度) 的總和。
-
數據集的信息熵的計算公式
- 熵的作用
- 計算損失(Loss function)
用於調整梯度遞減的步長。(本次熵(損失)比上次熵(損失)大,說明步長太大了。) - 用於決策樹
熵越大,說明特征(feature)的划分數據能力越強。
- 計算損失(Loss function)
博弈論
- 傾向關系(preference relation)
描述了玩家的傾向,\(x \succeq y\)意味着“x至少和y一樣好”。
不知道放到哪兒
- 求最大化參數
數學表示
\(\underset{c}{argmax}P(c)\)
解釋
可以用於返回一個可能性對大的分類。
返回當P(c)為最大值時c的值。
例如:
-
返回最大值
數學表示
\(\underset{a \in \mathcal{A}}{max}P(a)\)
解釋
在所有\(a \in \mathcal{A}\)的計算中,返回最大值\(P(a)\)。 -
約束條件(Subject to)
數學表示
\(y = 2x+1, \text{s.t. } x > 0\)
解釋
當約束條件\(x > 0\),成立時,有\(y = 2x+1\)。 -
定義上相等
數學表示
\(A \doteq B\)
解釋
A的定義為B。 -
2補數(2's complement)
一種使用2進制表示有符號數的方法。
第一位為符號位,
如果是0,則記做0;
如果為1,則記做\(-2^{n-1} \text{, n is the size of the number}\)。
例如: 0010為2; 1010為-6。
機器學習
激活函數
請看我的另外一個博文:
神經網絡學習筆記 - 激活函數的作用、定義和微分證明
損失函數
請看我的另外一個博文:
神經網絡學習筆記 - 損失函數的定義和微分證明
附錄
希臘字母的含義和發音
| 大寫 | 小寫 | English | 發音 | 中文 | 含義 | |
|---|---|---|---|---|---|---|
| 1 | Α | α | alpha | a:lf | 阿爾法 | |
| 2 | Β | β | beta | bet | 貝塔 | |
| 3 | Γ | γ | gamma | ga:m | 伽馬 | |
| 4 | Δ | δ | delta | delt | 德爾塔 | δ: delta value,偏差值 |
| 5 | Ε | ε | epsilon | ep'silon | 伊普西龍 | |
| 6 | Ζ | ζ | zeta | zat | 截塔 | |
| 7 | Η | η | eta | eit | 艾塔 | |
| 8 | Θ | θ | thet | θit | 西塔 | |
| 9 | Ι | ι | iot | aiot | 約塔 | |
| 10 | Κ | κ | kappa | kap | 卡帕 | |
| 11 | ∧ | λ | lambda | lambd | 蘭布達 | |
| 12 | Μ | μ | mu | mju | 繆 | |
| 13 | Ν | ν | nu | nju | 紐 | |
| 14 | Ξ | ξ | xi | ksi | 克西 | ξ: slack variable,松弛變量 |
| 15 | Ο | ο | omicron | omik'ron | 奧密克戎 | |
| 16 | ∏ | π | pi | pai | 派 | π: 圓周率 |
| 17 | Ρ | ρ | rho | rou | 肉 | |
| 18 | ∑ | σ | sigma | 'sigma | 西格馬 | |
| 19 | Τ | τ | tau | tau | 套 | |
| 20 | Υ | υ | upsilon | jup'silon | 宇普西龍 | |
| 21 | Φ | φ | phi | fai | 佛愛 | |
| 22 | Χ | χ | chi | phai | 凱 | |
| 23 | Ψ | ψ | psi | psai | 普西 | |
| 24 | Ω | ω | omega | o'miga | 歐米伽 |
松弛變量(slack variable):在SVM中,為了處理異常點(跑到另一個分類中的點),設定的容忍值。
數學符號的含義和發音
| 大寫 | 小寫 | English | 發音 | 中文 | 含義 | |
|---|---|---|---|---|---|---|
| 1 | \(\partial\) | partial | - | 偏分 | 偏分 | |
| 1 | \(\infty\) | infinity | - | 無窮 | 無窮 |
參照
如有希望介紹的數學概念,請寫到評論中,我有空會加上。
