引入

​ 今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?——孙子算经

线性方程组

  • 由系数唯一确定
  • 通常由高斯消元法解决
  • 齐次线性方程组:常数项全部为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
2
a = np.array([[1, 2, 3], [4, 5, 6]])   # NumPy中基本数据类型-数组的声明
print(a)

1
print("数组a的维度个数为: ", a.ndim)  # 数组的维度

1
print("数组a的各个维度长度为: ", a.shape)  # 数组各个维度的长度

1
print("数组a中元素总数为: ", a.size)  # 数组里元素总数

1
print("数组a中元素类型为: ", a.dtype)  # 数组元素的类型

1
2
b = np.arange(0, 20, 5)     # 用arange函数创建数组 (开始值,终值,步长)
print(b)

1
b.reshape(2, 2)         # 改变数组的形状

1
2
c = np.linspace(0, 2, 10)   # 用linspace函数创建数组(开始值,终值,元素个数)
print(c)

1
2
zero_arr = np.zeros((3,4))   # 快速创建元素全为0的数组
print(zero_arr)

1
2
one_arr = np.ones((2,3,4), dtype=np.int64)   # 快速创建元素全为1的数组,并将类型设置为整型
print(one_arr)

1
2
eye_arr = np.eye(3)   # 快速创建对角阵 
print(eye_arr)

NumPy数组的切片和索引

1
2
3
arr = np.array([1, 2, 3, 4, 5, 6])
print(arr[0:4])
print(arr[0:4:2])

1
2
for ele in arr:     # 对数组中每个元素的遍历
print(ele)

1
2
arr = arr.reshape(2,3)     # 更改arr数组的形状
print(arr)

1
print(arr[0,:])            # 在arr数组里选择第一维度的第一个子序列

1
print(arr[0, 0])           # 在arr数组里选择第一维度的第一个子序列里的第一个元素

1
print(arr[:, 1])           # 在arr数组里选择第二维度的第二个子序列里的所有元素

NumPy数组的基本操作

1
2
3
4
5
arr1 = np.array([[1, 2], [3, 4]])     # 声明两个二维数组
print(arr1)
print("********")
arr2 = np.array([[5, 6], [7, 8]])
print(arr2)

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
2
3
print(np.dot(arr1, arr2))   # 使用dot进行的两个数组之间的矩阵乘积运算
print("*" * 10)
print(arr1.dot(arr2))

1
print(arr1.T)      # 数组的转置

1
2
3
4
5
arr3 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr3)
print("arr1中最大元素的索引为: ", np.argmax(arr3)) # 数组中值最大元素的索引
print("arr1中沿第一个轴最大元素的索引为: ", np.argmax(arr3, axis=0)) # 数组中沿第一个维度值最大元素的索引
print("arr1中沿第二个轴最大元素的索引为: ", np.argmax(arr3, axis=1)) # 数组中沿第二个维度值最大元素的索引

NumPy求解线性方程组

1
2
3
4
5
6
# NumPy中array与matrix的异同
import numpy as np
a_arr = np.array([1,2])
print("Array形式的a形状为:", a_arr.shape)
a_mat = np.mat([1,2])
print("Matrix形式的a形状为:", a_mat.shape)

1
2
3
4
5
# 得到矩阵的转置
mat_temp = np.mat([[1,2],[3,4]])
print("此矩阵为:\n", mat_temp)
print('*' * 10)
print("此矩阵的转置为:\n", mat_temp.T)

1
2
3
4
5
6
7
# 得到矩阵的逆
mat_temp = np.mat([[1,2],[3,4]])
print("此矩阵为:\n", mat_temp)
print('*' * 10)
mat_inv = mat_temp.I
print("此矩阵的逆矩阵为:\n", mat_inv)
print("此矩阵与它的逆矩阵相乘得到:\n", np.round(mat_temp.dot(mat_inv))) # np.round用来保留结果到指定位数

1
2
3
4
5
6
7
8
import numpy as np
equa = np.mat([[1,2,3],[4,5,6]])
print("此线性方程组为:\n", equa)
print('*' * 10)
A = np.array([[1,2], [4,5]]) # 2x2系数矩阵
b = np.array([3,6]) # 2x1矩阵(须为列向量的形式)
res = np.linalg.solve(A,b) # 求解该系数矩阵决定的线性方程组
print("此线性方程组的解为:\n", res.reshape(1,2).T)