矩阵运算基础、矩阵求导
一、NumPy矩阵运算基础
import numpy as np
import pandas as pd
1. NumPy中的矩阵表示
在NumPy中二维数组(array)和matrix类型对象都可以用于表示矩阵
1.1 利用数组创建矩阵
A = np.array([[1, 2], [1, 1]])
print(A)
print(type(A))
1.2 利用mat创建矩阵
AM = np.mat(A)
print(AM)
1.3 关于两种对象类型的选取说明
1.3.1 NumPy中的matrix类型对象和MATLAB中的matrix类型等价,和NmuPy中数组类型对象底层基本结构不同。
1.3.2 在NumPy中,针对大规数据,数组类型对象的计算速度要快于矩阵类型对象
1.3.3 矩阵类型对象可以通过运算符直接进行矩阵乘法,而二维数组要进行矩阵乘法(及其他矩阵运算),则必须要使用包括linalg(线性代数运算)模块在内的相关函数。
print(AM * AM)
print(A.dot(A))
# 新版NumPy也支持使用符号进行矩阵乘法
peint(A @ A)
2. NumPy中特殊矩阵构造方法
在实际线性代数运算中,常涉及一些特殊矩阵,如单位矩阵、对角矩阵等,相关创建方法如下:
# 创建一个2*3的矩阵
a1 = np.arange(1, 7).reshape(2, 3)
a1
# 转置
a1.T
# 创建单位矩阵
np.eye(3)
注:单位矩阵之所以被称为单位,核心原因在于单位矩阵和任何矩阵相乘,都将返回原矩阵。
a = np.arange(5)
a
np.diag(a)
# 对角线向下偏移一位
np.diag(a, -1)
a1 = np.arange(9).reshape(3, 3)
a1
# 取上三角矩阵
np.triu(a1)
# 上三角矩阵向左下偏移一位
np.triu(a1, -1)
# 上三角矩阵向右上偏移一位
np.triu(a1, 1)
3. NumPy中矩阵基本运算
由于NumPy中我们使用二维数组来表述矩阵,因此二维数组也就具备了数组和矩阵的两种属性。其中数组元素属性决定的基本运算相对简单,基础运算(如加减乘除)就是对应位置元素进行逐元素计算,而矩阵属性决定的运算则稍显复杂,在基础运算上,矩阵和数组的核心区别在于乘法运算。从另一个角度考虑,对于向量和矩阵这种具备一定结构的对象,有很多种容易混淆的计算规则。对于常用的计算规则如下。
3.1 逐元素相乘
a = np.arange(4)
a
a * a
A = a.reshape(2, 2)
A
A * A
3.2 向量点积
所谓点积(也被称为内积),指的是向量或矩阵对应位置元素相乘后相加。向量点积有三种实现方法,分别是dot、vdot和inner。
np.dot(a, a)
(a * a).sum()
np.vdot(a, a)
np.inner(a, a)
3.3. 矩阵乘法
在NumPy中,我们也可以使用诸多方法实现矩阵乘法,包括dot、@、matmul等。
a1 = np.arange(1, 7).reshape(2, 3)
a2 = np.arange(1, 10).reshape(3, 3)
# 矩阵乘法
np.matmul(a1, a2)
上述相乘过程如下所示:
值得注意的是,矩阵相乘要求左乘矩阵的列数和右乘矩阵的行数相同,而内积计算过程则严格要求两个向量/矩阵形状完全一致。
4. NumPy中矩阵代数运算
如果说矩阵的基本运算是矩阵基本性质,那么矩阵的线性代数运算,则是我们利用矩阵数据类型在求解实际问题过程中经常涉及到的线性代数方法,具体相关函数如下:
NumPy中linalg是linear algebra(线性代数)的简写,也是NumPy中保存线性代数相关计算函数的模块。
4.1 矩阵的迹(trace)
矩阵的迹就是矩阵对角元素之和,在NumPy中,可以使用trace函数进行计算
A = np.array([[1, 2], [4, 5]])
A
np.trace(A)
当然对于矩阵的迹来说,计算过程不需要方正
B = np.arange(1, 7).reshape(2, 3)
np.trace(B)
4.2 矩阵的秩
A = np.array([[1, 3, 4], [2, 1, 3], [1, 1, 2]])
np.linalg.matrix_rank(A)
4.3 矩阵的行列式
A = np.array([[1, 2], [4, 5]])
np.linalg.det(A)
4.4 矩阵的逆
对与满秩的方阵来说,可以求其逆矩阵。从基本定义上来看,如果矩阵B和矩阵A相乘能够得到单位矩阵,即:
则称B为A的逆矩阵,也可将B写作。当然逆矩阵的性质是相互的,可以称A、B为互逆
A = np.array([[1, 1], [3, 1]])
np.linalg.inv(A)