L03-线性代数
引入
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?——孙子算经
线性方程组
- 由系数唯一确定
- 通常由高斯消元法解决
- 齐次线性方程组:常数项全部为0
- 非齐次线性方程组:常数项不全部为0
行列式
对于方阵(行数=列数)定义一种特别的运算——行列式:
如何计算:
如果阶数更高,如何计算?
全排列
n个不同元素所有不同排列方式总数:Pn=n∙(n-1)∙∙∙2∙1=n!
逆序数
对于一个排列,标准顺序规定为从小到大,大数在小数前面就称为逆序。一个排列中逆序的数目称为逆序数,用τ表示:τ(53214)=4+2+1=7
n阶行列式解法
- 教科书式解法:
- 实际上:
- 将矩阵转化为上(下)三角形矩阵
- 将高阶行列式拆分成二阶/三阶行列式
克拉默法则
定义
当系数行列式不等于0时,其解唯一,且:
其中 |Ai| 就是把 |A| 中第i列元素换成常数向量,而其余各列保持不变得到的。
性质
当系数行列式不等于0时,方程组有唯一解
对于齐次线性方程组:
- 其有非零解的充要条件为其系数行列式为0
- 其仅有零解的充要条件为其系数行列式不为0
当方程组中方程的个数与未知量的个数不同时,抑或系数行列式为0时,克拉默法则失效
矩阵
定义
对线性方程组的抽象→矩阵
线性方程组:Ax=b,其中,
A: 系数矩阵,x: 未知量向量, b: 常数向量
计算
- 矩阵的加减法——对应位置元素做运算:
- 矩阵的标量乘法——每一个元素均乘以该常数:
- 矩阵的向量乘法——第一个矩阵的列数和第二个矩阵的行数相等:
性质
矩阵的秩
行秩:线性无关的行的最大数目
列秩:线性无关的列的最大数目
行秩 = 列秩
线性相关
线性相关:α_1, …,α_n不全为0
不失一般性,假设α1不为0,则上式可变形为:
所以,线性相关性的核心是一个向量可由其它向量组合得来
- 线性无关:α_1, …,α_n全为0
所以,线性无关性的核心是一个向量不可由其它向量组合得来
矩阵的转置
- 对于矩阵A,其转置定义为A^T,有:
本质:行列互换
性质:
矩阵的逆
- 定义
对于方阵(行数等于列数)A,若存在一个矩阵B,使得:AB=BA=E(E为单位矩阵),则称B是A的逆矩阵,记为A^(-1),A被称为可逆矩阵;A和B互为逆矩阵。
矩阵可逆的充要条件是:它是满秩的
逆矩阵的唯一性:若矩阵A是可逆的,则A的逆矩阵是唯一的
性质:
神经网络中的矩阵/向量
基本概念
- 输入层:输入的数据(图像,文本)
- 隐藏层:神经网络处理过程
- 输出层:输出神经网络判别结果
- 数据载体:矩阵/向量
- 运算方式:矩阵乘法(+激活函数)(激活函数:做一些非线性的处理)
经过神经网络的处理,最终输出层两个节点表示各个分类所对应的的概率值。
举例:二分类
输入:
隐藏层权重矩阵:
隐藏层偏置矩阵:
输出层:softmax函数:
- 前向传播
- Softmax处理
∴ 该输入为第二种标签的可能接近于100%,判定为第二类
线性空间
定义
设V是一个非空集合,P是一个域,若:
1、在V中定义一种运算——加法,使得V中任意两个元素α与β都依据某一法则对应于V内唯一确定的一个元素α+β,称为α与β的和;
2、在P与V的元素间定义了一种运算,称为数量乘法,即对V中任意元素α与P中任意元素k,都按某一法则对应V内唯一确定的一个元素kα, 称为k与α的积;
3、若上述加法与数量乘法满足以下条件:
(1) α+β=β+α, ∀α,β∈V;
(2) α+(β+γ)=(α+β)+γ, ∀α,β,γ∈V;
(3)∃零元0∈V, s.t. ∀α∈V, 有α+0=α;
(4) ∀α∈V, ∃β使α+β=0, 记β=-α;
(5) 对P中单位元1, ∀α∈V,有1α=α;
(6) ∀k,l∈P, ∀α∈V,有(kl)α=k(lα);
(7)∀k,l∈P, ∀α∈V,有(k+l)α=kα+lα;
(8)∀k∈P, ∀α,β∈V,有k(α+β)=kα+kβ
则称V为域P上的一个线性空间,或向量空间
线性变换
定义
线性空间V上的一个变换A称为线性变换,若对于V中任意元素α,β和数域P中任意k,都有:
实质
符合上述定义的每一个方阵都代表着一种线性变换
- 零变换是线性变换
几何意义
- 旋转
- 拉伸
特征值与特征向量
定义
对于n阶方阵A, 若有数λ以及非零n维向量x使得:Ax=λx,则称数λ为矩阵A的一个特征值,x为矩阵A关于λ的一个特征向量。
几何意义
在方阵A的变换作用下,特征向量x沿着其所在方向伸缩了λ倍。
特征多项式
设A为n阶方阵,
后者为一关于n各未知量以及n个方程的齐次线性方程组
回忆:对于其次线性方程组,其有非零解的充要条件是系数行列式为0:
称|A-λI|为A的特征多项式:
- 通过求解(2)式得到A的特征值
- 将求得的特征值代入(1)式中求得对应的特征向量
NumPy中的矩阵操作
模块与包
模块:以.py结尾的Python源代码文件
- NumPy
- sys
- time
- ……
包:模块的集合
NumPy的导入
1 | import numpy as np # 导入NumPy模块 |
1 | print(np.version.version) # 查看当前安装的NumPy的版本 |
NumPy的基本数据结构
1 | a = np.array([[1, 2, 3], [4, 5, 6]]) # NumPy中基本数据类型-数组的声明 |
1 | print("数组a的维度个数为: ", a.ndim) # 数组的维度 |
1 | print("数组a的各个维度长度为: ", a.shape) # 数组各个维度的长度 |
1 | print("数组a中元素总数为: ", a.size) # 数组里元素总数 |
1 | print("数组a中元素类型为: ", a.dtype) # 数组元素的类型 |
1 | b = np.arange(0, 20, 5) # 用arange函数创建数组 (开始值,终值,步长) |
1 | b.reshape(2, 2) # 改变数组的形状 |
1 | c = np.linspace(0, 2, 10) # 用linspace函数创建数组(开始值,终值,元素个数) |
1 | zero_arr = np.zeros((3,4)) # 快速创建元素全为0的数组 |
1 | one_arr = np.ones((2,3,4), dtype=np.int64) # 快速创建元素全为1的数组,并将类型设置为整型 |
1 | eye_arr = np.eye(3) # 快速创建对角阵 |
NumPy数组的切片和索引
1 | arr = np.array([1, 2, 3, 4, 5, 6]) |
1 | for ele in arr: # 对数组中每个元素的遍历 |
1 | arr = arr.reshape(2,3) # 更改arr数组的形状 |
1 | print(arr[0,:]) # 在arr数组里选择第一维度的第一个子序列 |
1 | print(arr[0, 0]) # 在arr数组里选择第一维度的第一个子序列里的第一个元素 |
1 | print(arr[:, 1]) # 在arr数组里选择第二维度的第二个子序列里的所有元素 |
NumPy数组的基本操作
1 | arr1 = np.array([[1, 2], [3, 4]]) # 声明两个二维数组 |
1 | print(arr2-arr1) # 两个数组元素级别的差运算 |
1 | print(arr2+arr1) # 两个数组元素级别的和运算 |
1 | print(arr2*arr1) # 两个数组元素级别的乘运算 |
1 | print(arr2/arr1) # 两个数组元素级别的除运算 |
1 | print(arr1**2) # 数组元素级别的乘方运算 |
1 | print(arr1@arr2) # 两个数组之间的矩阵乘积运算 |
1 | print(np.dot(arr1, arr2)) # 使用dot进行的两个数组之间的矩阵乘积运算 |
1 | print(arr1.T) # 数组的转置 |
1 | arr3 = np.array([[1, 2, 3], [4, 5, 6]]) |
NumPy求解线性方程组
1 | # NumPy中array与matrix的异同 |
1 | # 得到矩阵的转置 |
1 | # 得到矩阵的逆 |
1 | import numpy as np |