注:本文的代码是使用Python 3写的。
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是矢量,这个符合矢量计算的定义。
由于,这篇文章是从数学的角度写的,所以我们先关注矩阵的操作。
矩阵的换位操作:将矩阵中的数按照对角线交换。
数学公式: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斤梨一共多少元?
答案是:
矩阵乘法不满足交换律
举例说明它们的不同之处:
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}
x⋅y=[x1⋯xn]⎡⎣⎢y1⋯yn⎤⎦⎥=[∑ni=1xiyi]x⋅y=⎡⎣⎢x1⋯xm⎤⎦⎥[y1⋯yn]=⎡⎣⎢x1y1⋯xmy1⋯⋯⋯x1yn⋯xmyn⎤⎦⎥x⋅y=⎡⎣⎢⎢⎢x11x21⋯xm1⋯⋯⋯⋯x1nx2n⋯xmn⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢y11y21⋯yn1⋯⋯⋯⋯y1qy2q⋯xnq⎤⎦⎥⎥⎥⎥=⎡⎣⎢∑ni=1x1iyi1⋯∑ni=1xmiyi1⋯⋯⋯∑ni=1x1iyiq⋯∑ni=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]]
'''
操作 | 数学符号 | Python | Demo |
---|---|---|---|
点积(dot product) | ababa b | a.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 b | numpy.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=⎡⎣⎢⎢⎢x1x2⋯xm⋯⋯⋯⋯x1nx2n⋯xmn⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢y1y2⋯yp⋯⋯⋯⋯y1qy2q⋯xpq⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢x1y1⋯x1ny1x2y1⋯xmny1⋯⋯⋯⋯⋯⋯x1y1q⋯x1ny1qx2y1q⋯xmny1qx1y2⋯x1ny2x2y2⋯xmny2⋯⋯⋯⋯⋯⋯x1ypq⋯x1nypqx2ypq⋯xmnypq⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥(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的并集。
x⋅y=[x1⋯xn][y1⋯yn]=[x1y1⋯xnyn]x⋅y=[x1⋯xn]⎡⎣⎢y1⋯ym⎤⎦⎥=⎡⎣⎢x1y1⋯x1ym⋯⋯⋯xny1⋯xnym⎤⎦⎥x⋅y=⎡⎣⎢x11⋯xm1⋯⋯⋯x1n⋯xmn⎤⎦⎥⎡⎣⎢y11⋯ym1⋯⋯⋯y1n⋯xn⎤⎦⎥=⎡⎣⎢x11y11⋯xm1ym1⋯⋯⋯x1ny1n⋯xmnynn⎤⎦⎥(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]]
'''
14
0
currentDiggType = 0;
« 上一篇:神经网络学习笔记-01-基本概念
» 下一篇:神经网络学习笔记 - 激活函数的作用、定义和微分证明