注:本文的代码是使用Python 3写的。
f(x) = xw^T + b 这是在机器学习中,最常见的公式。我把这个称为机器学习的第一公式,实际上就是线性分类函数(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是矢量,这个符合矢量计算的定义。
由于,这篇文章是从数学的角度写的,所以我们先关注矩阵的操作。
矩阵的换位操作:将矩阵中的数按照对角线交换。 数学公式:w^T 代码示例:
# Matrix Transpose
m = numpy.mat([[1, 2], [3, 4]])
print("Matrix.Transpose:")
print(m.T)
''' Output:
Matrix.Transpose:
[[1 3]
[2 4]]
'''
举例说明它们的不同之处: m1 = \begin{bmatrix} 1 & 2 \end{bmatrix} m2 = \begin{bmatrix} 10 \\ 20 \end{bmatrix} m1 \cdot m2的计算方法是: m1 \cdot m2 = \begin{array}{|c|c|} \text{} & \begin{bmatrix} 10 \\ 20 \end{bmatrix} \\ \hline \begin{bmatrix} 1 & 2 \end{bmatrix} & 1 * 10 + 2 * 20 \end{array} = \begin{bmatrix} 50 \end{bmatrix}
m2 \cdot m1的计算方法是: m2 \cdot m1 = \begin{array}{|c|c|c|} \text{} & 1 & 2 \\ \hline 10 & 10 * 1 & 10 * 2 \\ 20 & 20 * 1 & 20 * 2 \\ \end{array} = \begin{bmatrix} 10 & 20 \\ 20 & 40 \end{bmatrix}
\begin{array} \\ x \cdot y & = \begin{bmatrix} x_{1} & \cdots & x_{n} \\ \end{bmatrix} \begin{bmatrix} y_{1} \\ \cdots \\ y_{n} \end{bmatrix} \\ & = \begin{bmatrix} \sum_{i=1}^n x_{i}y_{i} \end{bmatrix} \end{array} \\ \begin{array} \\ x \cdot y & = \begin{bmatrix} x_{1} \\ \cdots \\ x_{m} \end{bmatrix} \begin{bmatrix} y_{1} & \cdots & y_{n} \\ \end{bmatrix} \\ & = \begin{bmatrix} x_{1}y_{1} & \cdots & x_{1}y_{n} \\ \cdots & \cdots & \cdots \\ x_{m}y_{1} & \cdots & x_{m}y_{n} \end{bmatrix} \end{array} \\ \begin{array} \\ x \cdot y & = \begin{bmatrix} x_{11} & \cdots & x_{1n} \\ x_{21} & \cdots & x_{2n} \\ \cdots & \cdots & \cdots \\ x_{m1} & \cdots & x_{mn} \end{bmatrix} \begin{bmatrix} y_{11} & \cdots & y_{1q} \\ y_{21} & \cdots & y_{2q} \\ \cdots & \cdots & \cdots \\ y_{n1} & \cdots & x_{nq} \end{bmatrix} \\ & = \begin{bmatrix} \sum_{i=1}^n x_{1i}y_{i1} & \cdots & \sum_{i=1}^n x_{1i}y_{iq} \\ \cdots & \cdots & \cdots \\ \sum_{i=1}^n x_{mi}y_{i1} & \cdots & \sum_{i=1}^n x_{mi}y_{iq} \end{bmatrix} \end{array}
# 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 y = \langle x,y \rangle = \textstyle \sum_{i=1}^n x_iy_i
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)为矩阵。
\begin{array} \\ x \otimes y & = \begin{bmatrix} x_1 & \cdots & x_{1n} \\ x_2 & \cdots & x_{2n} \\ \cdots & \cdots & \cdots \\ x_m & \cdots & x_{mn} \end{bmatrix} \begin{bmatrix} y_1 & \cdots & y_{1q} \\ y_2 & \cdots & y_{2q} \\ \cdots & \cdots & \cdots \\ y_p & \cdots & x_{pq} \end{bmatrix} \\ & = \begin{bmatrix} x_1y_1 & \cdots & x_1y_{1q} & x_1y_{2} & \cdots & x_1y_{pq} \\ \cdots & \cdots & \cdots & \cdots & \cdots & \cdots \\ x_{1n}y_1 & \cdots & x_{1n}y_{1q} & x_{1n}y_{2} & \cdots & x_{1n}y_{pq} \\ x_2y_1 & \cdots & x_2y_{1q} & x_2y_{2} & \cdots & x_2y_{pq} \\ \cdots & \cdots & \cdots & \cdots & \cdots & \cdots \\ x_{mn}y_1 & \cdots & x_{mn}y_{1q} & x_{mn}y_{2} & \cdots & x_{mn}y_{pq} \end{bmatrix} \end{array}
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的并集。
\begin{array} \\ x \cdot y & = \begin{bmatrix} x_{1} & \cdots & x_{n} \\ \end{bmatrix} \begin{bmatrix} y_{1} & \cdots & y_{n} \end{bmatrix} \\ & = \begin{bmatrix} x_{1}y_{1} & \cdots x_ny_n \end{bmatrix} \end{array} \\ \begin{array} \\ x \cdot y & = \begin{bmatrix} x_{1} & \cdots & x_{n} \\ \end{bmatrix} \begin{bmatrix} y_{1} \\ \cdots \\ y_{m} \\ \end{bmatrix} \\ & = \begin{bmatrix} x_{1}y_{1} & \cdots & x_{n}y_{1} \\ \cdots & \cdots & \cdots \\ x_{1}y_{m} & \cdots & x_{n}y_{m} \end{bmatrix} \end{array} \\ \begin{array} \\ x \cdot y & = \begin{bmatrix} x_{11} & \cdots & x_{1n} \\ \cdots & \cdots & \cdots \\ x_{m1} & \cdots & x_{mn} \end{bmatrix} \begin{bmatrix} y_{11} & \cdots & y_{1n} \\ \cdots & \cdots & \cdots \\ y_{m1} & \cdots & x_{n} \end{bmatrix} \\ & = \begin{bmatrix} x_{11}y_{11} & \cdots & x_{1n}y_{1n} \\ \cdots & \cdots & \cdots \\ x_{m1}y_{m1} & \cdots & x_{mn}y_{nn} \end{bmatrix} \end{array}
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]]
'''
如果方程式f(x) = wx + b有不等式约束条件,拉格朗日乘子法和KKT条件提供了一种方法,可以计算(w, b) \mathcal{L}(w,b,\alpha) 关于拉格朗日乘子法和KKT条件,请看: 深入理解拉格朗日乘子法(Lagrange Multiplier)和KKT条件
{f'(x)} \\ \text{or partial differential in Leibniz notation:} \\ {\partial f(x) \over \partial x} \\ {dy \over dx} \\ \text{or:} \\ {\nabla f(x) \over \nabla x} \text{ : the gradient of f at x}
含义
{df(x) \over dx} = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h} \\ where \\ {d \over dx} \text{ is an operation of f(x)}
数学含义是在x点上,f(x)的变化除以x的变化。 数学上可以认为是:斜率 机器学习中指的是:梯度。 计算梯度后,乘以一个比值(步长),可以得到矫正值,用于反向传播(矫正)权值。 partial differential:偏微分,表示函数在某个维度上的微分。这时,可将其它维度看做常量。
p(A|B) = \frac{p(B|A)p(A)}{p(B)} \\ where \\ p(A) \text{ : the probability of observing event A.} \\ p(B) \text{ : the probability of observing event B.} \\ p(A|B) \text{ : the probability of observing event A given that B is true.} \\ p(B|A) \text{ : the probability of observing event B given that A is true.}
比如:在判断垃圾邮件的算法中: P(A) : 所有邮件中,垃圾邮件的概率。 P(B) : 出现某个单词的概率。 P(B|A) : 垃圾邮件中,出现某个单词的概率。 P(A|B) : 出现某个单词的邮件,是垃圾邮件的概率。
\begin{alignat}{2} H(X) & = E[I(X)] \\ & = E[-lnP(X)] \\ & = \sum\limits_{i=1}^n P(x_i)I(x_i) \\ & = - \sum\limits_{i=1}^n P(x_i)\log P(x_i) \end{alignat} \\ where \\ \qquad H(X) : 数据集合X的信息熵值。 \\ \qquad E() : 求期望值。 \\ \qquad I() : 求信息值(惊奇值)。 \\ \qquad X : 数据集合X。 \\ \qquad x_i : 数据集合X的标签的一个枚举值。 \\ \qquad I(x_i) :x_i的资讯量 (information self). I(x_i) = -log(P(x_i)) \\ \qquad P(x_i) \text{ : 发生x_i的概率。x的机率质量函数(probability mass function)。} P(x_i) = count(x_i)/len(X).
例如: c \in \{1, 2\} \\ P(1) = 0.9 \\ P(2) = 0.1 \\ \therefore \\ \underset{c}{argmax}P(c) = 1
请看我的另外一个博文: 神经网络学习笔记 - 激活函数的作用、定义和微分证明
请看我的另外一个博文: 神经网络学习笔记 - 损失函数的定义和微分证明
大写 | 小写 | 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中,为了处理异常点(跑到另一个分类中的点),设定的容忍值。
如有希望介绍的数学概念,请写到评论中,我有空会加上。