《深度学习》学习笔记一——线性代数

原文博客:Doi技术团队
链接地址:https://blog.doiduoyi.com/authors/1584446358138
初心:记录优秀的Doi技术团队学习经历

目录

标量、向量、矩阵和张量

  • 标量(scalar):一个标量就是一个单独的数,它不同与线性代数中研究其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称,比如: x x x
  • 向量(vector): 一个向量是一列数。这些数都是有序排列的。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称.比如: x {\bf x} x
    x = [ x 1 x 2 ⋮ x n ] (1) {\bf x}=\left[\begin{matrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{matrix}\right]\tag{1} x=x1x2xn(1)
  • 矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如: A {\bf A} A
    A = [ A 1 , 1 A 1 , 2 A 2 , 1 A 2 , 2 ] (2) {\bf A}=\left[\begin{matrix} A_{1,1}&A_{1,2} \\ A_{2,1}&A_{2,2} \end{matrix}\right]\tag{2} A=[A1,1A2,1A1,2A2,2](2)
  • 张量(tensor):在某种情况下,我们会讨论坐标超过两维的数组。一般的,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量,使用 A {\sf A} A表示,张量 A {\sf A} A中坐标为 ( x , y , z ) (x,y,z) (x,y,z)的元素记作 A x , y , z A_{x,y,z} Ax,y,z

Python代码实现

使用Python创建普通二维矩阵

import numpy as np

m = np.mat([[1,2,3],[4,5,6]])
print m

输出为:

[[1 2 3]
 [4 5 6]]

使用zeros创建一个 3 × 2 3\times 2 3×2的0矩阵,还可以使用ones函数创建1矩阵

from  numpy import *
import numpy as np

m = np.mat(zeros((3,2)))
print m

输出为:

[[0. 0.]
 [0. 0.]
 [0. 0.]]

创建单位矩阵,单位矩阵部分有介绍

from numpy import *
import numpy as np

m = np.mat(eye(3,3,dtype=int))
print m

输出为:

[[1 0 0]
 [0 1 0]
 [0 0 1]]

转置

转置(transpose)是矩阵的重要操作之一。矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线(main diagonal),我们将矩阵 A {\bf A} A的转置表示为 A τ {\bf A^\tau} Aτ,定义如下:
( A τ ) i , j = A j , i (3) ({\bf A^\tau})_{i,j}=A_{j,i}\tag{3} (Aτ)i,j=Aj,i(3)
标量可以看作只有一个元素的矩阵。因此,标量的转置等于它本身, a = a τ a=a^\tau a=aτ
A = [ A 1 , 1 A 1 , 2 A 2 , 1 A 2 , 2 A 3 , 1 A 3 , 2 ] ⇒ A τ = [ A 1 , 1 A 2 , 1 A 3 , 1 A 1 , 2 A 2 , 2 A 3 , 2 ] (4) A=\left[\begin{matrix} A_{1,1}&A_{1,2} \\ A_{2,1}&A_{2,2} \\ A_{3,1}&A_{3,2} \end{matrix}\right] \Rightarrow A^\tau= \left[\begin{matrix} A_{1,1}&A_{2,1}&A_{3,1} \\ A_{1,2}&A_{2,2}&A_{3,2} \end{matrix}\right]\tag{4} A=A1,1A2,1A3,1A1,2A2,2A3,2Aτ=[A1,1A1,2A2,1A2,2A3,1A3,2](4)

矩阵的转置也是一种运算,满足下述运算规律(假设运算都可行的):

  1. ( A τ ) τ = A ({\bf A}^\tau)^\tau={\bf A} (Aτ)τ=A
  2. ( A + B ) τ = A τ + B τ ({\bf A}+{\bf B})^\tau={\bf A}^\tau+{\bf B}^\tau (A+B)τ=Aτ+Bτ
  3. ( λ A ) τ = λ A τ (\lambda {\bf A})^\tau=\lambda {\bf A}^\tau (λA)τ=λAτ
  4. ( A B ) τ = B τ A τ ({\bf A}{\bf B})^\tau={\bf B}^\tau{\bf A}^\tau (AB)τ=BτAτ

在深度学习中,我也使用一些不那么常规的符号。我们允许矩阵和向量相加,产生另一个矩阵: C = A + a {\bf C}={\bf A}+{\bf a} C=A+a,其中 C i , j = A i , j + b j C_{i,j}=A_{i,j}+b_j Ci,j=Ai,j+bj。换言之,向量 a {\bf a} a和矩阵 A {\bf A} A的每一行相加。这个简写方法使我们无需在加法操作前定义一个将向量 b {\bf b} b复制到每一行而生成的矩阵。这种隐式地复制向量 b {\bf b} b到很多位置的方式,称之为广播(broadcasting)

Python代码实现

矩阵的装置

# coding=utf-8
import numpy as np

m = np.mat([[1,2,3],[4,5,6]])
print '转置前:\n%s' % m
t = m.T
print '转置前:\n%s' % t

输出为:

转置前:
[[1 2 3]
 [4 5 6]]
转置前:
[[1 4]
 [2 5]
 [3 6]]

矩阵的运算

一. 矩阵的加法

**定义:**设有两个 m × n m\times n m×n矩阵 A = ( a i , j ) {\bf A}=(a_{i,j}) A=(ai,j) B = ( b i , j ) {\bf B}=(b_{i,j}) B=(bi,j),那么矩阵 A {\bf A} A B {\bf B} B的和记作 A + B {\bf A}+{\bf B} A+B,规定为:
A + B = [ a 1 , 1 + b 1 , 1 a 1 , 2 + b 1 , 2 ⋯ a 1 , n + b 1 , n a 2 , 1 + b 2 , 1 a 2 , 2 + b 2 , 2 ⋯ a 2 , n + b 2 , n ⋮ ⋮ ⋮ ⋮ a m , 1 + b m , 1 a m , 2 + b m , 2 ⋯ a m , n + b m , n ] (5) {\bf A}+{\bf B}= \left[\begin{matrix} a_{1,1}+b_{1,1} & a_{1,2}+b_{1,2} & \cdots & a_{1,n}+b_{1,n} \\ a_{2,1}+b_{2,1} & a_{2,2}+b_{2,2} & \cdots & a_{2,n}+b_{2,n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{m,1}+b_{m,1}&a_{m,2}+b_{m,2}&\cdots & a_{m,n}+b_{m,n} \end{matrix}\right]\tag{5} A+B=a1,1+b1,1a2,1+b2,1am,1+bm,1a1,2+b1,2a2,2+b2,2am,2+bm,2a1,n+b1,na2,n+b2,nam,n+bm,n(5)

注意:两个矩阵必须是同型的矩阵时,这两个矩阵才能进行加法运算
矩阵加法满足下列运算规律(设 A , B , C {\bf A},{\bf B},{\bf C} A,B,C都是 m × n m \times n m×n矩阵):

  1. A + B = B + A {\bf A}+{\bf B}={\bf B}+{\bf A} A+B=B+A
  2. ( A + B ) + C = A + ( B + C ) ({\bf A}+{\bf B})+{\bf C}={\bf A}+({\bf B}+{\bf C}) (A+B)+C=A+(B+C)

Python代码实现

计算两个同型矩阵的加法

import numpy as np

m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12, 13], [14, 15, 16]])
print "m1 + m2 = \n%s " % (m1 + m2)

输出为:

m1 + m2 = 
[[12 14 16]
 [18 20 22]] 

二. 矩阵的乘法

数与矩阵相乘定义: λ \lambda λ与矩阵 A {\bf A} A的乘积记作 λ A \lambda {\bf A} λA A λ {\bf A} \lambda Aλ,规定为:
λ A = A λ = [ λ a 1 , 1 λ a 1 , 2 ⋯ λ a 1 , n λ a 2 , 1 a 2 , 2 ⋯ λ a 2 , n ⋮ ⋮ ⋮ ⋮ λ a m , 1 λ a m , 2 ⋯ λ a m , n ] (6) \lambda {\bf A}={\bf A} \lambda=\left[\begin{matrix}\lambda a_{1,1}&\lambda a_{1,2}&\cdots & \lambda a_{1,n}\\\lambda a_{2,1}&a_{2,2}&\cdots&\lambda a_{2,n}\\\vdots&\vdots&\vdots&\vdots\\\lambda a_{m,1}&\lambda a_{m,2}&\cdots & \lambda a_{m,n}\end{matrix}\right]\tag{6} λA=Aλ=λa1,1λa2,1λam,1λa1,2a2,2λam,2λa1,nλa2,nλam,n(6)

数乘矩阵满足下列运算规律(设 A , B {\bf A},{\bf B} A,B m × n m \times n m×n矩阵, λ , μ \lambda,\mu λ,μ为数):

  1. ( λ μ ) A = λ ( μ A ) (\lambda \mu){\bf A}=\lambda (\mu{\bf A}) (λμ)A=λ(μA)
  2. ( λ + μ ) A = λ A + μ A (\lambda + \mu){\bf A}=\lambda {\bf A}+\mu {\bf A} (λ+μ)A=λA+μA
  3. λ ( A + B ) = λ A + λ A \lambda({\bf A}+{\bf B})=\lambda {\bf A}+\lambda {\bf A} λ(A+B)=λA+λA
    矩阵加法与数乘矩阵统称为矩阵的线性运算

**矩阵与矩阵相乘定义:**设 A = ( a i , j ) {\bf A}=(a_{i,j}) A=(ai,j)是一个 m × s m \times s m×s矩阵, B = ( b i , j ) {\bf B}=(b_{i,j}) B=(bi,j)是一个 s × n s \times n s×n矩阵,那么规定矩阵 A {\bf A} A B {\bf B} B的乘积是一个 m × n m \times n m×n矩阵 C = ( c i , j ) {\bf C}=(c_{i,j}) C=(ci,j),记作:
C = A B (7) {\bf C}={\bf A}{\bf B}\tag{7} C=AB(7)
计算如下:
[ a i , 1 a i , 2 ⋯ a i , s ] [ b 1 , j b 2 , j ⋮ b s , j ] = a i , 1 b 1 , j + a i , 2 b 2 , j + ⋯ + a i , k b k , j = ∑ k = 1 s a i , k b k , j = c i , j (8) \left[\begin{matrix} a_{i,1} & a_{i,2} & \cdots & a_{i,s} \end{matrix}\right] \left[\begin{matrix} b_{1,j} \\ b_{2,j} \\ \vdots \\ b_{s,j} \end{matrix}\right]= a_{i,1}b_{1,j}+a_{i,2}b_{2,j}+\cdots+a_{i,k}b_{k,j}= \sum_{k=1}^s a_{i,k}b_{k,j}= c_{i,j}\tag{8} [ai,1ai,2ai,s]b1,jb2,jbs,j=ai,1b1,j+ai,2b2,j++ai,kbk,j=k=1sai,kbk,j=ci,j(8)
例如:
[ a 1 , 1 a 1 , 2 a 1 , 3 a 2 , 1 a 2 , 2 a 2 , 3 ] [ b 1 , 1 b 1 , 2 b 2 , 1 b 2 , 2 b 3 , 1 b 3 , 2 ] = [ a 1 , 1 b 1 , 1 + a 1 , 2 b 2 , 1 + a 1 , 3 b 3 , 1 a 1 , 1 b 1 , 2 + a 1 , 2 b 2 , 2 + a 1 , 3 b 3 , 2 a 2 , 1 b 1 , 1 + a 2 , 2 b 2 , 1 + a 2 , 3 b 3 , 1 a 2 , 1 b 1 , 2 + a 2 , 2 b 2 , 2 + a 2 , 3 b 3 , 2 ] (9) \left[\begin{matrix} a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ \end{matrix}\right] \left[\begin{matrix} b_{1,1} & b_{1,2} \\ b_{2,1} & b_{2,2} \\ b_{3,1} & b_{3,2} \\ \end{matrix}\right]= \left[\begin{matrix} a_{1,1}b_{1,1}+a_{1,2}b_{2,1}+a_{1,3}b_{3,1} & a_{1,1}b_{1,2}+a_{1,2}b_{2,2}+a_{1,3}b_{3,2} \\ a_{2,1}b_{1,1}+a_{2,2}b_{2,1}+a_{2,3}b_{3,1} & a_{2,1}b_{1,2}+a_{2,2}b_{2,2}+a_{2,3}b_{3,2} \end{matrix}\right]\tag{9} [a1,1a2,1a1,2a2,2a1,3a2,3]b1,1b2,1b3,1b1,2b2,2b3,2=[a1,1b1,1+a1,2b2,1+a1,3b3,1a2,1b1,1+a2,2b2,1+a2,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,2a2,1b1,2+a2,2b2,2+a2,3b3,2](9)

矩阵不满足交换律,但在运算都可行的情况下满足结合律和分配律

  1. ( A B ) C = A ( B C ) ({\bf A}{\bf B}){\bf C}={\bf A}({\bf B}{\bf C}) (AB)C=A(BC)
  2. λ ( A B ) = ( λ A ) B = A ( λ B ) \lambda ({\bf A}{\bf B})=(\lambda{\bf A}){\bf B}={\bf A}(\lambda{\bf B}) λ(AB)=(λA)B=A(λB) (其中 λ \lambda λ为数)
  3. A ( B + C ) = A B + A C , ( B + C ) A = B A + C A {\bf A}({\bf B}+{\bf C})={\bf A}{\bf B}+{\bf A}{\bf C},({\bf B}+{\bf C}){\bf A}={\bf B}{\bf A}+{\bf C}{\bf A} A(B+C)=AB+AC,(B+C)A=BA+CA

Python代码实现

计算 2 × 3 2\times 3 2×3矩阵与 3 × 2 3\times2 3×2矩阵相乘

import numpy as np

m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12], [13, 14], [15, 16]])
print "m1 * m2 = \n%s " % (m1 * m2)

输出为:

m1 * m2 = 
[[ 82  88]
 [199 214]] 

单位矩阵和逆矩阵

**单位矩阵(identity matrix)**就是对角线的元素都是1,而其他的所有元素都是0,如下:
I 3 = [ 1 0 0 0 1 0 0 0 1 ] (10) {\bf I}_3= \left[\begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix}\right]\tag{10} I3=100010001(10)
**逆矩阵(matrix inversion)定义:**对于 n n n阶矩阵 A {\bf A} A,如果有一个 n n n阶矩阵,使得:’
A B = B A = I (11) {\bf A}{\bf B}={\bf B}{\bf A}={\bf I}\tag{11} AB=BA=I(11)
则说明矩阵 A {\bf A} A是可逆的,并把矩阵 B {\bf B} B称为 A {\bf A} A的逆矩阵,而且矩阵是唯一的,记作 A − 1 {\bf A}^{-1} A1
∣ A ∣ ≠ 0 |{\bf A}|\not=0 A=0,则矩阵 A {\bf A} A可逆,且
A − 1 = 1 ∣ A ∣ A ∗ (12) {\bf A}^{-1}=\frac{1}{|{\bf A}|} {\bf A}^\ast\tag{12} A1=A1A(12)
其中 A ∗ {\bf A}^\ast A称为矩阵的{\bf A}的伴随矩阵

Python代码实现

单位矩阵的计算

from numpy import *
import numpy as np

m = np.mat(eye(3,3,dtype=int))
print m

输出为:

[[1 0 0]
 [0 1 0]
 [0 0 1]]

计算 3 × 3 3\times3 3×3矩阵的逆矩阵

# coding=utf-8
import numpy as np

m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
I = m.I
print '矩阵:\n%s\n的逆矩阵为:\n%s' % (m, I)

输出为:

矩阵:
[[2 0 0]
 [0 4 0]
 [0 0 8]]
的逆矩阵为:
[[0.5   0.    0.   ]
 [0.    0.25  0.   ]
 [0.    0.    0.125]]

3 × 3 3\times3 3×3方阵的行列式

# coding=utf-8
import numpy as np

m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
d = np.linalg.det(m)
print d

输出为:

64.0

3 × 3 3\times3 3×3方阵的伴随矩阵

import numpy as np

m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
i = m.I
d = np.linalg.det(m)
a = i * d
print a

输出为:

[[32.  0.  0.]
 [ 0. 16.  0.]
 [ 0.  0.  8.]]

线性相关和生成子空间

线性组合(linear combination)
为了分析方程有多少个解,我们可以将 A {\bf A} A的列向量看作从原点(origin)(元素都是零的向量)出发的不同方向,确定有多少种方法可以到达向量 b {\bf b} b.在这个观点下,向量 x {\bf x} x中的每个元素都是表示我们应该沿着这些方向走多远,即 x i x_i xi表示我们需要沿着第 i i i个向量的方向走多远:
A x = ∑ i x i A : , i (13) {\bf Ax}=\sum_i x_i{\bf A}_{:,i}\tag{13} Ax=ixiA:,i(13)
生成子空间(span)
形式上,一组向量的线性组合,是指每个向量乘以对应标量系数之后的和,即:
∑ i c i v ( i ) (14) \sum_i c_iv^{(i)}\tag{14} iciv(i)(14)
一组向量的生产子空间是原始向量线性组合后所能抵达的点的集合


范数

范数(norm):在机器学习中,我们经常使用称为范数的函数来衡量向量的大小,形式上, L p L^p Lp范数定义入下:
∣ ∣ x ∣ ∣ p = ( ∑ x ∣ x i ∣ p ) 1 p (15) ||{\bf x}||_p=\left(\sum_x |x_i|^p\right)^\frac{1}{p}\tag{15} xp=(xxip)p1(15)
范数满足下列性质的任意函数:

  • f ( x ) = 0 ⇒ x = 0 f(x)=0\Rightarrow x = 0 f(x)=0x=0
  • f ( x + y ) ≤ f ( x ) + f ( y ) f(x+y) \leq f(x) + f(y) f(x+y)f(x)+f(y)(三角不定式(triangle inequality))
  • ∀ α ∈ R , f ( α x ) = ∣ α ∣ f ( x ) \forall\alpha \in {\Bbb R},f(\alpha{\bf x})=|\alpha|f({\bf x}) αR,f(αx)=αf(x)

p = 2 p=2 p=2时, L 2 L^2 L2范数称为欧几里得范数(Euclidean norm).他表示从原点出发到向量 x {\bf x} x确定的点的欧几里得距离
p = ∞ p=\infty p=时, L ∞ L^\infty L范数称为最大范数(max norm).这个范数表示向量中具有最大幅度的元素的绝对值:
∣ ∣ x ∣ ∣ ∞ = m a x i ∣ x i ∣ ||{\bf x}||_\infty = {\rm max}_i |x_i| x=maxixi


参考资料

  1. lan Goodfellow,Yoshua Bengio,Aaron Courville.深度学习(中文版).赵申剑,黎彧君,符天凡,李凯,译.北京:人民邮电出版社
  2. 同济大学数学系.工程数学-线性代数(第六版).北京:高等教育出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨飘零1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值