《深度学习》学习笔记一——线性代数
原文博客:Doi技术团队
链接地址:https://blog.doiduoyi.com/authors/1584446358138
初心:记录优秀的Doi技术团队学习经历
目录
文章目录
- 目录
- 标量、向量、矩阵和张量
- Python代码实现
- 转置
- Python代码实现
- 矩阵的运算
- 一. 矩阵的加法
- Python代码实现
- 二. 矩阵的乘法
- Python代码实现
- 单位矩阵和逆矩阵
- Python代码实现
- 线性相关和生成子空间
- 范数
- 参考资料
标量、向量、矩阵和张量
- 标量(scalar):一个标量就是一个单独的数,它不同与线性代数中研究其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称,比如:xxx
- 向量(vector): 一个向量是一列数。这些数都是有序排列的。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称.比如:x{\bf x}x
x=[x1x2⋮xn](1){\bf x}=\left[\begin{matrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{matrix}\right]\tag{1}x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤(1) - 矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如:A{\bf A}A
A=[A1,1A1,2A2,1A2,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)的元素记作Ax,y,zA_{x,y,z}Ax,y,z
Python代码实现
使用Python创建普通二维矩阵
import numpy as npm = np.mat([[1,2,3],[4,5,6]])
print m
输出为:
[[1 2 3][4 5 6]]
使用zeros
创建一个3×23\times 23×2的0矩阵,还可以使用ones
函数创建1矩阵
from numpy import *
import numpy as npm = np.mat(zeros((3,2)))
print m
输出为:
[[0. 0.][0. 0.][0. 0.]]
创建单位矩阵,单位矩阵部分有介绍
from numpy import *
import numpy as npm = 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=Aj,i(3)({\bf A^\tau})_{i,j}=A_{j,i}\tag{3}(Aτ)i,j=Aj,i(3)
标量可以看作只有一个元素的矩阵。因此,标量的转置等于它本身,a=aτa=a^\taua=aτ
A=[A1,1A1,2A2,1A2,2A3,1A3,2]⇒Aτ=[A1,1A2,1A3,1A1,2A2,2A3,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,2⎦⎤⇒Aτ=[A1,1A1,2A2,1A2,2A3,1A3,2](4)
矩阵的转置也是一种运算,满足下述运算规律(假设运算都可行的):
- (Aτ)τ=A({\bf A}^\tau)^\tau={\bf A}(Aτ)τ=A
- (A+B)τ=Aτ+Bτ({\bf A}+{\bf B})^\tau={\bf A}^\tau+{\bf B}^\tau(A+B)τ=Aτ+Bτ
- (λA)τ=λAτ(\lambda {\bf A})^\tau=\lambda {\bf A}^\tau(λA)τ=λAτ
- (AB)τ=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,其中Ci,j=Ai,j+bjC_{i,j}=A_{i,j}+b_jCi,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 npm = 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×nm\times nm×n矩阵A=(ai,j){\bf A}=(a_{i,j})A=(ai,j)和B=(bi,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=[a1,1+b1,1a1,2+b1,2⋯a1,n+b1,na2,1+b2,1a2,2+b2,2⋯a2,n+b2,n⋮⋮⋮⋮am,1+bm,1am,2+bm,2⋯am,n+bm,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,1⋮am,1+bm,1a1,2+b1,2a2,2+b2,2⋮am,2+bm,2⋯⋯⋮⋯a1,n+b1,na2,n+b2,n⋮am,n+bm,n⎦⎥⎥⎥⎤(5)
注意:两个矩阵必须是同型的矩阵时,这两个矩阵才能进行加法运算
矩阵加法满足下列运算规律(设A,B,C{\bf A},{\bf B},{\bf C}A,B,C都是m×nm \times nm×n矩阵):
- A+B=B+A{\bf A}+{\bf B}={\bf B}+{\bf A}A+B=B+A
- (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 npm1 = 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} \lambdaAλ,规定为:
λA=Aλ=[λa1,1λa1,2⋯λa1,nλa2,1a2,2⋯λa2,n⋮⋮⋮⋮λam,1λam,2⋯λam,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×nm \times nm×n矩阵,λ,μ\lambda,\muλ,μ为数):
- (λμ)A=λ(μA)(\lambda \mu){\bf A}=\lambda (\mu{\bf A})(λμ)A=λ(μA)
- (λ+μ)A=λA+μA(\lambda + \mu){\bf A}=\lambda {\bf A}+\mu {\bf A}(λ+μ)A=λA+μA
- λ(A+B)=λA+λA\lambda({\bf A}+{\bf B})=\lambda {\bf A}+\lambda {\bf A}λ(A+B)=λA+λA
矩阵加法与数乘矩阵统称为矩阵的线性运算
**矩阵与矩阵相乘定义:**设A=(ai,j){\bf A}=(a_{i,j})A=(ai,j)是一个m×sm \times sm×s矩阵,B=(bi,j){\bf B}=(b_{i,j})B=(bi,j)是一个s×ns \times ns×n矩阵,那么规定矩阵A{\bf A}A与B{\bf B}B的乘积是一个m×nm \times nm×n矩阵C=(ci,j){\bf C}=(c_{i,j})C=(ci,j),记作:
C=AB(7){\bf C}={\bf A}{\bf B}\tag{7}C=AB(7)
计算如下:
[ai,1ai,2⋯ai,s][b1,jb2,j⋮bs,j]=ai,1b1,j+ai,2b2,j+⋯+ai,kbk,j=∑k=1sai,kbk,j=ci,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,2⋯ai,s]⎣⎢⎢⎢⎡b1,jb2,j⋮bs,j⎦⎥⎥⎥⎤=ai,1b1,j+ai,2b2,j+⋯+ai,kbk,j=k=1∑sai,kbk,j=ci,j(8)
例如:
[a1,1a1,2a1,3a2,1a2,2a2,3][b1,1b1,2b2,1b2,2b3,1b3,2]=[a1,1b1,1+a1,2b2,1+a1,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,2a2,1b1,1+a2,2b2,1+a2,3b3,1a2,1b1,2+a2,2b2,2+a2,3b3,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)
矩阵不满足交换律,但在运算都可行的情况下满足结合律和分配律
- (AB)C=A(BC)({\bf A}{\bf B}){\bf C}={\bf A}({\bf B}{\bf C})(AB)C=A(BC)
- λ(AB)=(λ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λ为数)
- A(B+C)=AB+AC,(B+C)A=BA+CA{\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×32\times 32×3矩阵与3×23\times23×2矩阵相乘
import numpy as npm1 = 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,如下:
I3=[100010001](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)定义:**对于nnn阶矩阵A{\bf A}A,如果有一个nnn阶矩阵,使得:’
AB=BA=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}A−1
当∣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}A−1=∣A∣1A∗(12)
其中A∗{\bf A}^\astA∗称为矩阵的{\bf A}的伴随矩阵
Python代码实现
单位矩阵的计算
from numpy import *
import numpy as npm = np.mat(eye(3,3,dtype=int))
print m
输出为:
[[1 0 0][0 1 0][0 0 1]]
计算3×33\times33×3矩阵的逆矩阵
# coding=utf-8
import numpy as npm = 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×33\times33×3方阵的行列式
# coding=utf-8
import numpy as npm = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
d = np.linalg.det(m)
print d
输出为:
64.0
求3×33\times33×3方阵的伴随矩阵
import numpy as npm = 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中的每个元素都是表示我们应该沿着这些方向走多远,即xix_ixi表示我们需要沿着第iii个向量的方向走多远:
Ax=∑ixiA:,i(13){\bf Ax}=\sum_i x_i{\bf A}_{:,i}\tag{13}Ax=i∑xiA:,i(13)
生成子空间(span)
形式上,一组向量的线性组合,是指每个向量乘以对应标量系数之后的和,即:
∑iciv(i)(14)\sum_i c_iv^{(i)}\tag{14}i∑civ(i)(14)
一组向量的生产子空间是原始向量线性组合后所能抵达的点的集合
范数
范数(norm):在机器学习中,我们经常使用称为范数的函数来衡量向量的大小,形式上,LpL^pLp范数定义入下:
∣∣x∣∣p=(∑x∣xi∣p)1p(15)||{\bf x}||_p=\left(\sum_x |x_i|^p\right)^\frac{1}{p}\tag{15}∣∣x∣∣p=(x∑∣xi∣p)p1(15)
范数满足下列性质的任意函数:
- f(x)=0⇒x=0f(x)=0\Rightarrow x = 0f(x)=0⇒x=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=2p=2p=2时,L2L^2L2范数称为欧几里得范数(Euclidean norm).他表示从原点出发到向量x{\bf x}x确定的点的欧几里得距离
当p=∞p=\inftyp=∞时,L∞L^\inftyL∞范数称为最大范数(max norm).这个范数表示向量中具有最大幅度的元素的绝对值:
∣∣x∣∣∞=maxi∣xi∣||{\bf x}||_\infty = {\rm max}_i |x_i|∣∣x∣∣∞=maxi∣xi∣
参考资料
- lan Goodfellow,Yoshua Bengio,Aaron Courville.深度学习(中文版).赵申剑,黎彧君,符天凡,李凯,译.北京:人民邮电出版社
- 同济大学数学系.工程数学-线性代数(第六版).北京:高等教育出版社
《深度学习》学习笔记一——线性代数相关推荐
- 【学习笔记】线性代数全家桶(在编程竞赛中的应用)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00. 矩阵 0x01. 矩阵 0x02. 矩阵的加法与数量乘法 0x03. 矩阵乘法 0x ...
- 《深度学习笔记》——线性代数基础
1 前言 这里我们将会介绍线性代数的基础知识: 2 矩阵范数 Frobenius范数 相当于将矩阵拉成向量之后的2范数: ∥A∥Frob=[∑ijAij2]12{\left \| A \right \ ...
- GAMES101-计算机图形学学习笔记-基本线性代数
原视频教程链接:https://www.bilibili.com/video/BV1X7411F744 向量 点乘 a→⋅b→=∥a→∥∥b→∥cosθ={x1y1z1}{x2y2y2}=x1x2+ ...
- gram矩阵的性质_第十七课:正交矩阵和GramSchmidt正交化——MIT线性代数课程学习笔记...
公众号关注 "DL_NLP" 设为 "星标",重磅干货,第一时间送达! ◎ 原创 | 深度学习算法与自然语言处理 ◎ 作者 | 丁坤博 一. 知识概要 这一节 ...
- 线性代数 --- 用内积重新定义矩阵的转置(个人学习笔记)
在我的另一篇文章中,我简单的介绍了向量的点积,也叫内积.那篇文章的侧重点是点积或者说是点乘.主要是以的方式来定义两个向量的内积.而这篇文章我会见到内积的另外一种表示方式,从变成了. 线性代数 --- ...
- GAMES101课程学习笔记—Lec 02:Linear Algebra 线性代数回顾
GAMES101课程学习笔记-Lec 02:Linear Algebra 线性代数回顾 0 图形学的依赖学科 1 向量 1.1 点乘 1.2 叉乘 2 矩阵 本节课知识比较基础,大学课程里应该都学过, ...
- 线性代数学习笔记(二十九)——方程组解的结构(一)
停更2年多了,做事得有始有终,继续更新... 本篇笔记回顾了线性方程组解的三种情况,并讨论了齐次线性方程组解的结构,并介绍了齐次线性方程组解的相关性质.其中重点讨论了基础解系定义,以及基础解系的求法和 ...
- 线性代数学习笔记(二十二)——向量间的线性关系(二)
本篇笔记首先介绍了线性相关和线性无关的概念,关键是找到一组不全为零相关系数使得等成立:然后重点介绍了一些重要的结论,以及向量组线性相关和线性无关的几个充要条件. 1 线性相关与线性无关 线性相关:设 ...
- 线性代数库 Armadillo 学习笔记
线性代数库 Armadillo 学习笔记 项目环境 Xcode 项目配置 前置代码 矩阵基本操作 全零矩阵 全一矩阵 对角矩阵 打印一个矩阵 修改获取矩阵元素 获取某行某列 获取对角向量 转置矩阵 逆 ...
最新文章
- 2021年春季学期-信号与系统-第十四次作业参考答案-第七小题参考答案
- 【计算机网络】第五章 数据链路层(3)
- 全国计算机技术与软件专业技术资格(水平)考试【软件评测师】-考试内容总结(四)中间件基础知识...
- Windows驱动开发 - 派遣函数
- ubuntu下进程kidle_inject致使编译软件很慢
- mysql踢掉登录用户_centos 强制踢掉某登录用户的方法
- ITK:创建具有相关类ID的样本列表
- 修改win7编码为utf-8
- 1.0 C++远征:数据的封装
- bootstrap 导航菜单 折叠位置_教大家如何编写一个网页导航条
- Cocos Studio 2.3.2不再支持直接导入PSD文件
- Webpack:“WARNING in configuration The ‘mode‘ option hasnot been set, webpack will fallback .... “
- IIR滤波器和FIR滤波器
- 七夕抢付限量优惠,全新XPS13二合一笔记本戴尔官网独家首发
- css美化button
- 判断一元二次方程完整版(有无虚根)
- 解决Alienware M11R2 AlienFX运行报错
- uoj 246. 【UER #7】套路
- 经典小船过河问题,附Python,java题解
- iOS_导航栏的navigationBar.hidden与navigationBarHidden的区别