机器学习中的基本数学知识【转载】
0 机器学习 rabin 66 阅读 • 6个月前

机器学习中的基本数学知识

注:本文的代码是使用Python 3写的。

线性代数(linear algebra)

第一公式

f(x)=xwT+b(1)(1)f(x)=xwT+b

f(x) = xw^T + b

这是在机器学习中,最常见的公式。我把这个称为机器学习的第一公式,实际上就是线性分类函数(linear classifier)。

训练分类器的目标就是求出(w,b)(w,b)(w, b)。

其中:


xxx 是一个一行矩阵 [[x1,x2,...,xn]][[x1,x2,...,xn]][[x_1, x_2, ..., x_n]]。


www 是一个一行矩阵 [[w1,w2,...,wn]][[w1,w2,...,wn]][[w_1, w_2, ..., w_n]]。


xxx 和 www 的维度相同。


bbb 是一个数。


xwT=∑ni=1xiwixwT=∑i=1nxiwixw^T = \sum_{i=1}^n x_iw_i,称为点积(dot product)。

有时,我们也会见到这个公式表示为类似下面的样子,它们的基本含义都是一样的。
f(x)=wx+bf(x)=wx+bf(x) = w x + b
f(x)=wTx+bf(x)=wTx+bf(x) = w^T x + b
f(x)=w⃗ ⋅x⃗ +bf(x)=w→⋅x→+bf(x) = \vec{w} \cdot \vec{x} + b

注:这里www表示为一个一维数组(或者向量、矢量(vector)) [x1,x2,...,xn][x1,x2,...,xn][x_1, x_2, ..., x_n]。
注:一维数组:在数学上,可以理解为向量,表示多维空间上的一个点。
注:由于在线性代数中,矩阵乘法ab≠baab≠baab \ne ba,所以对于表达式wTxwTxw^Tx,严格地说,要把矢量(向量)看做一列的矩阵(而不是一行的矩阵),才符合数学上的定义。
注:表达式w⃗ ⋅x⃗ w→⋅x→\vec{w} \cdot \vec{x}和wxwxw x是正确的,因为www和xxx是矢量,这个符合矢量计算的定义。

矩阵的操作

由于,这篇文章是从数学的角度写的,所以我们先关注矩阵的操作。

换位(transpose)

矩阵的换位操作:将矩阵中的数按照对角线交换。
数学公式:wTwTw^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=5010∗5=5010 * 5=50
    如果一斤苹果10元,一斤梨20元,5斤苹果2斤梨一共多少元?
    答案是:

    [1020][52]=10×5+20×2=90(2)(2)[1020][52]=10×5+20×2=90
    \begin{bmatrix}10 & 20 \end{bmatrix}\begin{bmatrix}5 \\2 \end{bmatrix} = 10 \times 5 + 20 \times 2 = 90
    我们可以看出矩阵相乘的约束:乘数1的列数要和乘数2的行数相等

  • 矩阵乘法不满足交换律

    m1⋅m2≠m2⋅m1(3)(3)m1⋅m2≠m2⋅m1
    m1 \cdot m2 \ne m2 \cdot m1
    我们再看看交换乘数后,计算的结果:
    [1020][52]=[10×520×510×220×2]=[501002040](4)(4)[1020][52]=[10×510×220×520×2]=[502010040]
    \begin{bmatrix}10 \\20 \end{bmatrix}\begin{bmatrix}5 & 2 \end{bmatrix} \\= \begin{bmatrix}10 \times 5 & 10 \times 2 \\20 \times 5 & 20 \times 2 \end{bmatrix} \\= \begin{bmatrix}50 & 20 \\100 & 40 \end{bmatrix}
    比如:数202020的含义是2斤苹果多少钱。

举例说明它们的不同之处:

m1=[12](5)(5)m1=[12]

m1 = \begin{bmatrix}1 & 2 \end{bmatrix}


m2=[1020](6)(6)m2=[1020]

m2 = \begin{bmatrix}10 \\20 \end{bmatrix}


m1⋅m2m1⋅m2m1 \cdot m2的计算方法是:


m1⋅m2=[12][1020]1∗10+2∗20=[50](7)(7)m1⋅m2=[1020][12]1∗10+2∗20=[50]

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⋅m1m2⋅m1m2 \cdot m1的计算方法是:

m2⋅m1=1020110∗120∗1210∗220∗2=[10202040](8)(8)m2⋅m1=121010∗110∗22020∗120∗2=[10202040]

m2 \cdot m1 = \begin{array}{|c|c|c|} \text{} & 1 & 2 \\\hline10 & 10 * 1 & 10 * 2 \\20 & 20 * 1 & 20 * 2 \\\end{array} = \begin{bmatrix}10 & 20 \\20 & 40\end{bmatrix}

  • 计算公式
    矩阵相乘是:用矩阵1的每一行和矩阵2的每一列的点积,得到一个矩阵。
    l∗ml∗ml * m 的矩阵乘以 m∗nm∗nm * n 的矩阵,形成一个l∗nl∗nl * n 的矩阵。

x⋅y=[x1xn]⎡y1yn=[ni=1xiyi]x⋅y=⎡x1xm[y1yn]=⎡x1y1xmy1x1ynxmynx⋅y=⎡x11x21xm1x1nx2nxmny11y21yn1y1qy2qxnq=⎡ni=1x1iyi1ni=1xmiyi1ni=1x1iyiqni=1xmiyiq(9)(9)x⋅y=[x1⋯xn][y1⋯yn]=[∑i=1nxiyi]x⋅y=[x1⋯xm][y1⋯yn]=[x1y1⋯x1yn⋯⋯⋯xmy1⋯xmyn]x⋅y=[x11⋯x1nx21⋯x2n⋯⋯⋯xm1⋯xmn][y11⋯y1qy21⋯y2q⋯⋯⋯yn1⋯xnq]=[∑i=1nx1iyi1⋯∑i=1nx1iyiq⋯⋯⋯∑i=1nxmiyi1⋯∑i=1nxmiyiq]

\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]]
'''

矩阵的各种乘积

操作数学符号PythonDemo
点积(dot product)ababa ba.dot(b)
numpy.dot(a, b)
AB=(1,2)(1020)=1∗10+2∗20=50(10)(10)AB=(1,2)(1020)=1∗10+2∗20=50\begin{array}\\AB & = (1, 2) \begin{pmatrix}10 \\20\end{pmatrix} \\& = 1 * 10 + 2 * 20 \\& = 50\end{array}
内积(inner product)a⋅ba⋅ba \cdot b
⟨a,b⟩⟨a,b⟩\langle a,b \rangle
numpy.inner(a, b)a⋅b=abT(11)(11)a⋅b=abTa \cdot b = a b^T
外积(outer product)a⊗ba⊗ba \otimes bnumpy.outer(a, b)A⊗B=(12)(1020)=(1∗102∗101∗202∗20)=(10202040)(12)(12)A⊗B=(12)(1020)=(1∗101∗202∗102∗20)=(10202040)\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∘ba∘ba \circ b
a⊙ba⊙ba \odot b
numpy.multiply(a, b)A⊙B=(1324)(1020)=(1∗103∗102∗204∗20)=(10304080)(13)(13)A⊙B=(1234)(1020)=(1∗102∗203∗104∗20)=(10403080)\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。
矢量的降维运算,变成一个数。
矩阵的内积是每行每列的内积的矩阵。

xy=⟨x,y⟩=∑ni=1xiyi(14)(14)xy=⟨x,y⟩=∑i=1nxiyi

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]]
'''

外积

矢量的升维运算, mmm维矢量和nnn维矢量的外积是m∗nm∗nm * n为矩阵。
矩阵的并集运算, a1∗a2a1∗a2a1 * a2维矢量和b1∗b2b1∗b2b1 * b2维矩阵的外积是(a1∗a2)∗(b1∗b2)(a1∗a2)∗(b1∗b2)(a1 * a2) * (b1 * b2)为矩阵。

x⊗y=⎡x1x2xmx1nx2nxmny1y2ypy1qy2qxpq=⎡x1y1x1ny1x2y1xmny1x1y1qx1ny1qx2y1qxmny1qx1y2x1ny2x2y2xmny2x1ypqx1nypqx2ypqxmnypq(15)(15)x⊗y=[x1⋯x1nx2⋯x2n⋯⋯⋯xm⋯xmn][y1⋯y1qy2⋯y2q⋯⋯⋯yp⋯xpq]=[x1y1⋯x1y1qx1y2⋯x1ypq⋯⋯⋯⋯⋯⋯x1ny1⋯x1ny1qx1ny2⋯x1nypqx2y1⋯x2y1qx2y2⋯x2ypq⋯⋯⋯⋯⋯⋯xmny1⋯xmny1qxmny2⋯xmnypq]

\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的并集。

元素积(element-wise product/point-wise product/Hadamard product

  • 计算公式

x⋅y=[x1xn][y1yn]=[x1y1⋯xnyn]x⋅y=[x1xn]⎡y1ym=⎡x1y1x1ymxny1xnymx⋅y=⎡x11xm1x1nxmny11ym1y1nxn=⎡x11y11xm1ym1x1ny1nxmnynn(16)(16)x⋅y=[x1⋯xn][y1⋯yn]=[x1y1⋯xnyn]x⋅y=[x1⋯xn][y1⋯ym]=[x1y1⋯xny1⋯⋯⋯x1ym⋯xnym]x⋅y=[x11⋯x1n⋯⋯⋯xm1⋯xmn][y11⋯y1n⋯⋯⋯ym1⋯xn]=[x11y11⋯x1ny1n⋯⋯⋯xm1ym1⋯xmnynn]

\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]]
'''

低等数学

评论:0