If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.(如果有人不相信数学是简单的,那是因为他们没有意识到人生有多复杂。)
数学是数据科学的灵魂。不管是机器学习或是统计学模型,从本质上讲都是数学模型.
本章将简单介绍3个方面的数学知识:
- 矩阵和向量空间(线性代数的内容):矩阵是数据的基本表示形式
- 概率:概率作为量化随机性的工具,是统计学和贝叶斯框架的核心内容。
- 微积分:它是计算机解决最优化问题(也就是求函数的最值)的理论基础
矩阵和向量空间
在数据科学领域,数据和模型的存在形式都是矩阵,而后者则直观地表示为向量空间里的点。
1.标量(scalar)、向量(vector)和矩阵(matrix):
- 我们用数字表表示各个属性具体的值,这在数学上就叫作标量,标量其实就是数字。
- 直观上,行向量是多个数字(标量)排成一行。与之类似的是列向量,即多个数字排成一列。
- 用学术语言来定义矩阵:一个 \(n \times m\) 的矩阵,是一个由 \(n\)行\(m\) 列元素排列成的矩形阵列。

从数学上来讲,标量和向量其实是比较特殊的矩阵:
- 标量可以被看作一个\(1 \times 1\) 的矩阵,
- 而包含 \(k\)个数字行向量(也称为\(k\) 维行向量)可以看作一个\(1 \times k\) 的矩阵,
- 而包含 \(k\)个数字的列向量可以被认为是一个\(k \times 1\)的矩阵。
在数学上,通常像如下公式所示表示向量和矩阵,其中:
- \(x_{i,j}\) 表示标量,也就是一个实数
- \(X_i\)表示一个\(m\) 维的行向量
- \(X\) 表示 \(n \times m\)的矩阵
- \(R^{n\times m}\) 表示所有取值为实数的 \(n \times m\)矩阵全体
- 列向量可以表示为行向量的转置,因此没有专门记号来表示列向量。
$$X_i=(x_{i,1},x_{i,2},x_{i,m})$$
$$X= \begin{pmatrix} X_1\ X_2\ \vdots\ X_n \end{pmatrix} =(x_{i,j}) \in R^{n \times m}$$
在实际生产中,我们用矩阵来表示搭建模型所用的数据和模型本身的参数。相关的运算,比如估计模型参数或者根据自变量预测结果等,其实都是矩阵运算。
2.特殊矩阵:方阵
方阵(squared matrix)是行数等于列数的矩阵。从形状上来看,它就像一个正方形,因此被称为方阵。有3种方阵需要特别注意:
a.单位矩阵 (identity matrix)
矩阵的对角线元素等于1,其他元素等于0,记为 \(I_n\)。
$$I_n= \begin{pmatrix} 1 & 0 & \cdots & 0\ 0 & 1 & \cdots & 0\ \vdots & \vdots & \ddots &\vdots\ 0 & 0 & \cdots & 1\ \end{pmatrix} =(1_{{i=j}}) \in R^{n \times n}$$
b.对角矩阵 (diagonal matrix)
除矩阵的对角线元素外,其他元素都等于0,记为\(diag(d_1,d_2,...,d_n)\) 。不难注意到,单位矩阵是一种特殊的对角矩阵。
$$diag(d_1,d_2,...,d_n)= \begin{pmatrix} d_1 & 0 & \cdots & 0\ 0 & d_2 & \cdots & 0\ \vdots & \vdots & \ddots &\vdots\ 0 & 0 & \cdots & d_n\ \end{pmatrix} \in R^{n \times n}$$
c.三角矩阵 (triangular matrix)
可以细分为上三角矩阵和下三角矩阵两种。上三角矩阵的对角线下方的元素全部为零,记为 \(U\);下三角矩阵的对角线上方的元素全部为零,记为 \(L\)。不难发现,对角矩阵是一种特殊的三角矩阵。
$$U= \begin{pmatrix} u_{1,1} & u_{1,2} & \cdots & u_{1,n}\ 0 & u_{2,2} & \cdots & u_{2,n}\ \vdots & \vdots & \ddots &\vdots\ 0 & 0 & \cdots & u_{n,n}\ \end{pmatrix} \in R^{n \times n}$$
$$L= \begin{pmatrix} l_{1,1} & 0 & \cdots & 0\ l_{2,1} & l_{2,2} & \cdots & 0\ \vdots & \vdots & \ddots &\vdots\ l_{n,1} & l_{n,2} & \cdots & l_{n,n}\ \end{pmatrix} \in R^{n \times n}$$
3.矩阵运算
为了能像使用数字一样使用矩阵,我们为它定义了“加减乘除”四种运算。
a.矩阵的加减法
矩阵的加减法要求矩阵的形状是一样的,也就是它们的行数和列数都相等。
$$X=(x_{i,j}) \in R^{n \times m};Y=(y_{i,j}) \in R^{n \times m}$$
$$X \pm Y = \begin{pmatrix} x_{1,1} \pm y_{1,1} & \cdots & x_{1,m} \pm y_{1,m}\ \vdots & \ddots &\vdots\ x_{n,1} \pm y_{n,1} & \cdots & x_{n,m} \pm y_{n,m}\ \end{pmatrix} =(x_{i,j} \pm y_{i,j})\in R^{n \times m}$$
b.矩阵的乘法
(1)矩阵与数字的乘法。 与数字的乘法类似,任意一个实数都能和任意一个矩阵相乘。假设 \(k\)为实数,则它与矩阵\(X\) 的乘法定义如下:
$$kX = \begin{pmatrix} kx_{1,1} & \cdots & kx_{1,m} \ \vdots & \ddots &\vdots\ kx_{n,1} & \cdots & kx_{n,m} \ \end{pmatrix} =(kx_{i,j})\in R^{n \times m}$$
(2)矩阵与矩阵的乘法。它只有在第一个矩阵的列数和第二个矩阵的行数相同时才有定义。 假设\(A\) 为\(n\times p\) 的矩阵, \(B\)为\(p\times m\) 的矩阵,则它们之间的乘积为一个 \(n\times m\)的矩阵,记为 \(AB\) ,具体的定义如下:
$$A=(a_{i,j}) \in R^{n \times p};B=(b_{i,j}) \in R^{p \times m}$$
$$AB = (\sum_{r=1}^pa_{i,r}b_{r,j} )\in R^{n \times m}$$
在有的文献中,矩阵的乘法也被记为\(A \cdot B\) ,但这种记法很容易和后面将介绍的向量内积发生混淆。因此本书并不采用这种记录方法。
示例:

任何一个矩阵与单位矩阵的乘积(前提条件是矩阵乘法的要求被满足)等于其本身,比如\(I_nA=A=AI_p\) 。因此单位矩阵可以被看作矩阵中的1。
线性模型常常用矩阵乘法来表示。举个简单的例子,假设线性模型为:
$$\begin{cases} y_1=ax_1 + b\ y_2=ax_2 + b \end{cases}$$
令 \(Y=\begin{pmatrix} y_1 \ y_2 \end{pmatrix}\),\(X=\begin{pmatrix} x_1 & 1 \ x_2 & 1 \end{pmatrix}\),\(\beta=\begin{pmatrix} a\ b \end{pmatrix}\),线性模型可以表示为: \(Y=X\beta\)
(3)矩阵的Hadamard乘积(Hadamard product或者element-wise multiplication)。假设矩阵\(A,B\) 同为 \({n \times m}\)的矩阵,则它们之间的Hadamard乘积仍为\({n \times m}\) 的矩阵,记为 \(A\circ B\)。计算过程如图3-2b所示,具体的公式如下:
$$A\circ B = (a_{i,j}b_{i,j})\in R^{n \times m}$$
矩阵的Hadamard乘积在数学上并不太常用,但在编程时,我们常用它来同时计算多组数据的乘积。
示例:

c.矩阵的除法:逆矩阵(inverse matrix)
(1)对矩阵求逆是专门针对方阵的,即行数等于列数的矩阵。假设 \(M\)是一个 \(n\times n\)的矩阵,若存在一个 \(n\times n\)的矩阵\(N\) 使得它们的乘积等于 \(m\)阶单位矩阵,则称矩阵 \(N\) 为矩阵 \(M\) 的逆矩阵,记为\(M^{-1}\) ,而 \(M\) 则被称为可逆矩阵。
$$MN=NM=I_n$$
2)数学上可以证明,一个矩阵的逆矩阵如果存在,则逆矩阵唯一。所以对于方阵 \(M\),如果存在另一个方阵 \(L\),使得\(ML=I_n\) ,则一定有\(LM=I_n\) ,且 \(L=N=M^{-1}\)。
(3)关于逆矩阵,有如下几个常用的公式:
$$(M^{-1})^{-1}=M$$
$$(kM)^{-1}=\frac{1}{k}M^{-1}$$
$$(MN)^{-1}=N^{-1}M^{-1}$$
d.矩阵的转置(transpose)
(1)形象点理解,矩阵的转置就是将矩阵沿着对角线对调一下。假设 \(X\)为 \(n \times m\) 的矩阵,则它的转置为 \(m \times n\) 的矩阵,记为 \(X^T\)。具体的公式如下:
$$X=(x_{i,j} \in R^{n \times m})$$
$$X^T=(x_{j,i} \in R^{m \times n})$$
(2)关于矩阵的转置,有如下几个常用的公式,其中假设 \(k\)为实数,而且公式中涉及的矩阵乘法和逆矩阵都是有意义的。
$$(X^T)^T=X$$
$$(X+Y)^T = X^T + Y^T$$
$$(kX)^T=kX^T$$
$$(XY)^T = Y^TX^T$$
$$(X^T)^{-1}=(X^{-1})^T$$
4.代码实现
第三方库NumPy已经实现了上面所介绍的矩阵运算。
Python中主要有两种表示矩阵的方法:
- 一种是matrix类.当矩阵是matrix类时,比如“A”,默认的乘法为矩阵的乘法
- 另一种是二维array,比如“B”,默认的乘法是Hadamard乘法.在实际中,大多数情况下,我们使用后一种方法,也就是用二维array表示矩阵。当矩阵用二维array表示时,直接的乘号表示Hadamard乘积,矩阵的乘法需要使用dot函数
- 矩阵的转置由transpose函数完成,而逆矩阵由inv函数完成
矩阵乘法:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
# 创建矩阵
A = np.matrix([[1, 2], [3, 4], [5, 6]])
print('A:\n',A)
'''
A:
[[1 2]
[3 4]
[5 6]]
'''
B = np.array(range(1, 7)).reshape(3, 2)
print('B:\n',B)
'''
B:
[[1 2]
[3 4]
[5 6]]
'''
# 当矩阵是matrix类时,比如“A”,默认的乘法为矩阵的乘法
try:
print('A*A:\n',A*A)
except Exception as e:
print(e)
# shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
print('B*B:\n',B*B)
'''
B*B:
[[ 1 4]
[ 9 16]
[25 36]]
'''
特殊矩阵:
# 创建特殊矩阵
print('np.zeros((3, 2))\n',np.zeros((3, 2)))
'''
np.zeros((3, 2))
[[0. 0.]
[0. 0.]
[0. 0.]]
'''
print('np.identity(3)\n',np.identity(3))
'''
np.identity(3)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
print('np.diag([1, 2, 3])\n',np.diag([1, 2, 3]))
'''
np.diag([1, 2, 3])
[[1 0 0]
[0 2 0]
[0 0 3]]
'''
矩阵中向量的提取:
# 矩阵中向量的提取
m = np.array(range(1, 10)).reshape(3, 3)
print('m:\n',m)
'''
m:
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
# 提取行向量
print('m[[0,2]]:\n',m[[0,2]])
'''
m[[0,2]]:
[[1 2 3]
[7 8 9]]
'''
print('m[[True,False,True]]:\n',m[[True,False,True]])
'''
m[[True,False,True]]:
[[1 2 3]
[7 8 9]]
'''
提取列向量:
# 提取列向量
print('m[:, [1, 2]]\n',m[:, [1, 2]])
'''
m[:, [1, 2]]
[[2 3]
[5 6]
[8 9]]
'''
print('m[:, [False, True,True]]\n',m[:, [False, True,True]])
'''m[:, [False, True,True]]
[[2 3]
[5 6]
[8 9]]
'''
矩阵的加减,转置:
n = np.array(range(1, 5)).reshape(2, 2)
print('n\n',n)
'''
n
[[1 2]
[3 4]]
'''
print('np.transpose(n)\n',np.transpose(n))
'''
np.transpose(n)
[[1 3]
[2 4]]
'''
print('n+n\n',n+n)
'''n+n
[[2 4]
[6 8]]'''
print('n-n\n',n-n)
'''n-n
[[0 0]
[0 0]]'''
print('n*3\n',n*3)
'''
n*3
[[ 3 6]
[ 9 12]]
'''
Hadamard乘积,矩阵乘法,矩阵的逆:
# Hadamard乘积
print('n*n\n',n*n)
'''n*n
[[ 1 4]
[ 9 16]]'''
## 矩阵乘法
print('n.dot(n)\n',n.dot(n))
'''n.dot(n)
[[ 7 10]
[15 22]]'''
# 矩阵的逆矩阵
print('inv(n)\n',np.linalg.inv(n))
'''inv(n)
[[-2. 1. ]
[ 1.5 -0.5]]'''
print('np.dot(inv(n), n):\n',np.dot(np.linalg.inv(n), n))
'''
np.dot(inv(n), n):
[[1.0000000e+00 4.4408921e-16]
[0.0000000e+00 1.0000000e+00]]
'''
5.向量空间
向量空间(vector space)是一个比较深刻的数学概念。
a.向量空间的公理化的定义
向量空间的公理化的定义如下(来源于维基百科):
- 给定域 \(F\)上的向量空间是一个集合 \(V\),其上定义了两种二元运算:
- 向量加法: + : \(V \times V \rightarrow V\) ,把 \(V\)中的两个元素\(u\) 和 \(v\) 映射到 \(V\)中另一个元素,记作\(u+v\)
- 标量乘法: \(\cdot\) :\(F \times V \rightarrow V\) ,把 \(F\)中的一个元素 \(a\)和\(V\) 中的一个元素 \(u\)变为\(V\) 中的另一个元素,记作\(a \cdot u\)
- \(V\) 中的元素称为向量,相对地, \(F\)中的元素称为标量。而集合 \(V\)上的两个运算满足下面的公理:
- 向量加法结合律:\(u+(v+w)=(u+v)+w\)
- 向量加法交换律:\(u+v=v+u\)
- 存在向量加法的单位元:\(V\) 里存在一个叫作零向量的元素,记作 \(0\) ,使得对任意 \(u \in V\),都有 \(u+0=u\)
- 向量加法的逆元素:对任意 \(u\),都存在\(v\) ,使得 \(u+v=0\)
- 标量乘法对向量加法满足分配律: \(a \cdot (v+w) = a \cdot v + a \cdot w\)
- 标量乘法对域加法满足分配律: \((a+b) \cdot v = a \cdot v + b \cdot v\)
- 标量乘法与标量的域乘法相容:\(a(b \cdot v) = (ab) \cdot v\)
- 标量乘法有单位元:域 \(F\)的乘法单位元“1”满足对任意 \(v\),\(1 \cdot v = v\)
b.从直观上来理解向量空间的相关知识
我们生活的世界在空间上是一个三维空间 ,在这个现实世界里建立长宽高坐标系,也就是 \(x,y,z\) 坐标系。这个现实中的每一个点都能被表示成一个三维行向量,从数学上来看,任意一个三维的行向量\(X=(x_1,x_2,x3)\) ,可以被写为 \(X=x_1(1,0,0) + x_2(0,1,0) + x_3(0,0,1)\)。
用学术一些的话来表述就是任意一个三维行向量可以被 \(e_1=(1,0,0),\)e_2=(0,1,0),\(e_3=(0,0,1)\) 这3个行向量线性表示,而且反过来, 这3个行向量的任意线性组合都对应着现实空间中的某一点。像这样的空间被称为向量空间,而\(e_1,e_2,e_3\) 被称为向量空间的基 。不难看出,其实\(e_1,e_2,e_3\) 分别对应着 \(x\)轴、\(y\) 轴和\(z\) 轴。
c.向量的内积
针对三维向量空间,定义行向量的内积 (dot product)。假设行向量 \(A=(a_1,a_2,a_3)\)和行向量 \(B=(b_1,b_2,b_3)\) ,它们之间的内积定义为:
$$A \cdot B = {a_1}{b_1} + {a_2}{b_2} + {a_3}{b_3}$$
其实 之间的内积可以表达为矩阵乘法,即 \(A\cdot B = {a_1}{b_1} + {a_2}{b_2} + {a_3}{b_3}\) .
数学上可以证明:
$$||A||=\sqrt[2]{(a_1^2 +a_2^2 + a_3^2 )}$$
$$||B||=\sqrt[2]{(b_1^2 +b_2^2 + b_3^2 )}$$
$$A\cdot B = ||A||||B|| \cos \theta$$
其中 \(||A||\)为点 \(A\) 到原点的距离; \(||B||\)的定义类似; \(\theta\)为向量 之间的夹角.当 \(B\)到原点的距离等于1时, \(A \cdot B\)就是向量 \(A\)在向量 \(B\)方向上投影的长度:

d.向量间的正交关系
有了内积定义后,就可以更加数理化地定义向量间的正交关系 (对应到空间上,就是两个向量相互垂直)。若两个行向量\(X,Y\) 的内积等于0,则称它们是正交的。 容易得到,上面提到的基 \(e_1,e_2,e_3\)是相互正交的,被称为正交基。
既然行向量可以被看作三维空间里的一个点,那么\(x \times 3\) 的矩阵\(X\) 可以被看作三维空间里点的集合。
现在我们想在这个空间里找到一条直线,使得矩阵中的点在这条直线的投影之和最长。
结合内积的定义,假设 \(w\)为行向量,将上面的目标表示为如下的数学公式,其中向量 \(v\) 是长度为1的向量,表示直线的方向。
$$v=argmax_{||w||=1}||Xw^T||^2=argmax_{||w||=1}wX^TXw^T$$
e.特征向量 (eigenvector)和特征值 (eigenvalue)
为了解决这个问题,需要引入另一个很复杂的数学概念:特征向量 (eigenvector)和特征值 (eigenvalue)。假设 \(M\)是一个三阶对称矩阵,即 \(M^T=M\)(注意到上面的公式里, \(X^TX\)就是一个三阶对称矩阵)。满足下面条件的非零行向量 \(w\) 被称为 \(M\)的特征向量,对应的 \(\lambda\)被称为特征值。
$$Mw^T= \lambda w^T$$
数学上可以证明,对于三阶的对称矩阵,存在3个相互正交的特征向量,而它们可以组成三维空间的一组基。有了上面的结论,之前定义的问题就很好解决了: 就是最大特征值对应的特征向量。
这里给出简易的证明:假设 \(w_1,w_2,w_3\)是对称矩阵\(X^TX\) 的特征向量,且长度都为1。它们相互正交,对应的特征值为 \(\lambda_1,\lambda_2,\lambda_3\)。且有 。任何一个长度为1的行向量 \(w\)可以写为\(w=aw_1+bw_2+cw_3\) ,其中 \(a^2 + b^2 +c^2=1\) ,则
$$wX^TXw^T=\lambda_1a^2 + \lambda_2b^2+\lambda_3c^2$$
$$wX^TXw^T \leq \lambda_1(a^2 + b^2+ c^2)=\lambda_1$$
因此当 \(w\)等于\(w_1\) 时,点到直线的投影之和最大,即 \(wX^TXw^T\)达到最大值,所以\(v=w_1\) 。
上面有关向量空间、内积、向量间夹脚以及正交的定义可以推广到任意维度的空间。有关特征向量、特征值的定义和结论也如此。
在数学上,特征向量和特征值并非只定义在对称矩阵上。事实上对于任意一个方阵 \(M\),满足下面公式的向量和实数分别为 \(M\)的特征向量和特征值:
$$Mw^T= \lambda w^T$$
当然,对于一般的方阵,特征向量相互正交的结论就不再成立了。
$$Mw^T= \lambda w^T$$
© Licensed under CC BY-NC-SA 4.0Don’t misinform your Doctor nor your Lawyer. —— Benjamin Franklin