import numpy as np
import pandas as pd
A = np.array([[1, 2], [1, 1]])
type(A) #numpy.ndarray
AM = np.mat(A)
type(AM) #numpy.matrix
关于两种对象类型的选取:
- NumPy中的matrix类型对象和MATLAB中的matrix类型等价,和NumPy中数组类型对象底层基本结构不同;
- 在NumPy中,针对大规模数据,数组类型对象的计算速度要快于矩阵类型对象;
- 矩阵类型对象可以通过运算符直接进行矩阵乘法,而二维数组要进行矩阵乘法(及其他矩阵运算),则必须要使用包括
linalg
(线性代数运算)模块在内的相关函数。
矩阵形变及特殊矩阵的构建
函数 | 描述 |
---|---|
a.T | 数组a转置(行列互换) |
np.eye(n) | 创建包含n个分量的单位矩阵(对角线元素为1,其他元素为0) |
np.diag(a1) | 以a1中各元素,创建对角矩阵(除对角线元素外,其他元素均为0) |
np.triu(a) | 取矩阵a中的上三角矩阵 (左下角的元素均为0) |
np.tril(a) | 取矩阵a中的下三角矩阵 (右上角的元素均为0) |
a.reshape(m, n) | 重新设置矩阵的形状(行列) |
矩阵运算
描述 | 解释/函数 | 结果 |
---|---|---|
矩阵维数 | a1.ndim | 数值 |
矩阵的形状 | a1.shape | 元组(row, col) |
每个对应位置元素相乘 | a1 * a2 | 与原向量/矩阵形状相同的向量/矩阵 |
逐元素相乘后相加 | 点积(内积),向量,矩阵通用 ,建议使用vdot(a1, a2) | 一个数值 |
矩阵乘法 | 代数学意义的矩阵相乘;a1(m,n)的列需要等于a2(n,k)的行 ;matmul(a1, a2); a1.dot(a2) | a1行(m)a2列(k)的矩阵,其中元素(m,k)为a1的第m行元素与a2的第k列元素对应相乘并相加 |
矩阵的迹 | 对角线元素相加;trace(A) | 一个数值 |
矩阵的秩 | 矩阵中行或列的极大线性无关数,且矩阵中行、列极大无关数总是相同的;linalg.matrix_rank(A) | 一个数值 |
矩阵A的行列式 | np.linalg.det(A) ;A必须是方阵 | 一个数值 |
矩阵求逆 | np.linalg.inv(A) ;A需要是满秩方阵 | 一个矩阵 |
- 线性无关:矩阵中的一列不能被其他列的线性组合所表示。
- 求矩阵的秩可用于降维(可被其他列的线性组合表示的列可被去掉)。
- 行列式可以简单将其理解为矩阵的一个基本性质或者属性,通过行列式的计算,我们能够知道矩阵是否可逆,从而可以进一步求解矩阵所对应的线性方程。实际上行列式是矩阵进行线性变换的伸缩因子。
- 矩阵的行列式为0,则矩阵不满秩
- 方程组的系数矩阵若存在逆矩阵,则该方程组有唯一解。
矩阵方程求解
令
则有
即
然后在矩阵方程左右两端同时左乘其逆矩阵,即可解出X的取值
- 代码实现:
A = np.array([[20, 8], [8, 4]])
A
B = np.array([[28, 12]]).T
B
np.linalg.matrix_rank(A) #判断A是否满秩
np.linalg.det(A) #判断A是否满秩(行列式是否为0)
np.linalg.inv(A) #若A满秩,则可以求A的逆矩阵
np.matmul(np.linalg.inv(A), B) #B左乘A的逆矩阵
- 类似于上述的矩阵方程,可以直接使用Numpy提供的
linalg.solve
函数求解:
np.linalg.solve(A, B)
最小二乘法
np.linalg.lstsq(X, y, rcond=-1)
# X为特征矩阵;y为标签数组
变量相关性
X = np.random.randn(20)
y = X + 1
np.corrcoef(X, y)