精通数据科学(2)第3章 数学基础:矩阵和向量空间

If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.(如果有人不相信数学是简单的,那是因为他们没有意识到人生有多复杂。)

——John von Neumann

数学是数据科学的灵魂。不管是机器学习或是统计学模型,从本质上讲都是数学模型.

本章将简单介绍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.0

想象力比知识更重要! 因为知识是有限的, 而想象力概括着世界的一切, 推动着进步, 并且是知识进化的源泉。——爱因斯坦

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!