Skip to content

Latest commit

 

History

History
125 lines (108 loc) · 4.14 KB

线性代数.md

File metadata and controls

125 lines (108 loc) · 4.14 KB

线性代数

  线性代数是一门被广泛运用于各个工程技术学科的数学分支,利用线性代数的相关概念和结论,可以极大的简化机器学习里相关公式的表述和推导。

1. 基本概念

  • 标量:一个单独的数,通常使用斜体小写字母表示,例如$$x=1$$

  • 向量:可以看作是一个一维的数组,通过索引能够唯一的确定向量中的某个值,通常使用斜体加粗的小写字母表示,例如$$\boldsymbol{x} = {1,2,3,4,5}$$,其中第$$i$$个元素可以表示为$$x_i$$

  • 矩阵:矩阵是一个二维的数组,其中每个元素由两个索引确定,分别表示它的行和列,通常使用斜体加粗的大写字母表示,例如$$\boldsymbol{A} = \left[ \begin{matrix}1 & 2 \ 3 & 4 \end{matrix} \right]$$。

  • 张量:张量表示一个多维的数组,其中每个元素可以由多个索引确定,通常使用加粗的大写字母表示,例如$$\bf{A}$$,向量和矩阵可以分别看作是一维和二维的张量。

在numpy中,可以用以下方式生成各种维度的张量:

>>> import numpy as np
## 生成元素全为0的二维张量,两个维度分别为3,4
>>> np.zeros((3,4))  
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
## 生成三维的随机张量,三个维度分别为2,3,4
>>> np.random.rand(2,3,4)
array([[[ 0.93187582,  0.4942617 ,  0.23241437,  0.82237576],
        [ 0.90066163,  0.30151126,  0.89734992,  0.56656615],
        [ 0.54487942,  0.80242768,  0.477167  ,  0.6101814 ]],

       [[ 0.61176321,  0.11454075,  0.58316117,  0.36850871],
        [ 0.18480808,  0.12397686,  0.22586973,  0.35246394],
        [ 0.01192416,  0.5990322 ,  0.34527612,  0.424322  ]]])
  • 单位矩阵:对角线元素均为1的矩阵,通常记为$$\boldsymbol{I}_n$$,例如
>>> np.eye(4)
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

2. 常用运算

  • 转置:向量和矩阵的转置是交换行列顺序,将矩阵$$\boldsymbol{A}$$的转置记为$$\boldsymbol{A}^T$$,而三维及以上张量的转置就需要制定转换的维度,示例如下
## 生成包含5个元素的向量x并将其转置
>>> x = np.arange(5).reshape(1,-1)
>>> x
array([[0, 1, 2, 3, 4]])
>>> x.T
array([[0],
       [1],
       [2],
       [3],
       [4]])
## 生成3*4的矩阵并转置为4*3
>>> A = np.arange(12).reshape(3,4)
>>> A
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> A.T
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
## 生成2*3*4的张量
>>> B = np.arange(24).reshape(2,3,4)
>>> B
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
## 转置第0和1维度
>>> B.transpose(1,0,2)
array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])
  • 矩阵相乘:记两个矩阵分别为A和B,$$C=A*B$$,则$$C_{ij} = \sum_k {A_{i,k}B_{k,j}}$$,由公式可以看到两个矩阵能够相乘的条件为第一个矩阵的列数等于第二个矩阵的行数,示例如下:
>>> A = np.arange(6).reshape(3,2)
>>> B = np.arange(6).reshape(2,3)
>>> A
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> B
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.matmul(A,B)
array([[ 3,  4,  5],
       [ 9, 14, 19],
       [15, 24, 33]])
  • 元素对应点积(element-wise product):将矩阵对应位置的元素相乘记两个矩阵分别为A和B,$$C=A\bigodot B$$,则$$C_{ij} = A_{i}B_{k,j}$$,示例如下
>>> A = np.arange(6).reshape(3,2)
>>> A*A
array([[ 0,  1],
       [ 4,  9],
       [16, 25]])
  • 逆矩阵:矩阵$$\boldsymbol{A}$$的逆矩阵记为$$\boldsymbol{A}^{-1}$$,它满足$$\boldsymbol{A*A}^{-1}=\boldsymbol{I}$$,示例如下:
>>> A = np.arange(4).reshape(2,2)
>>> A
array([[0, 1],
       [2, 3]])
>>> np.linalg.inv(A)
array([[-1.5,  0.5],
       [ 1. ,  0. ]])