numpy模块可以解决各种线性代数相关的计算,只不过需要调用Numpy的子模块linalg,该模块几乎提供了线性代数所需的所有功能。
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
np.zeros | 生成零矩阵 | np.eye | 生成单位矩阵 |
np.dot | 计算两个数组的点积 | np.diag | 矩阵主对角线与一维数组间的转换 |
np.linalg.det | 计算矩阵行列式 | np.linalg.eigvals | 计算方阵特征根 |
np.linalg.pinv | 计算方阵的Moore-Penrose伪逆 | np.linalg.lstsq | 计算Ax=b的最小二乘解 |
np.linalg.svd | 计算奇异值分解 | np.ones | 生成所有元素为1的矩阵 |
np.transpose | 矩阵转置 | np.inner | 计算两个数组的内积 |
np.trace | 矩阵主对角线元素的和 | np.linalg.eig | 计算矩阵特征根与特征向量 |
np.linalg.inv | 计算方阵的逆 | np.linalg.solve | 计算Ax=b的线性方程组的解 |
np.linalg.qr | 计算QR分解 | np.linalg.norm | 计算向量或矩阵的范数 |
矩阵乘法
#一维数组的点积
import numpy as np
vector_dot = np.dot(np.array([1,2,3]),np.array([4,5,6]))
print('一维数组的点积:\n',vector_dot)
#二维数组的乘法
arr1 = np.array([[1,2,3,4],[4,3,2,1],[9,4,5,3]])
arr2 = np.array([[3,2,4],[3,4,5],[3,5,1],[7,8,3]])
print('两个矩阵:\n')
print('arr1:\n',arr1)
print('arr2:\n',arr2)
arr2d = np.dot(arr1,arr2)
print('二维数组的乘法:\n',arr2d)
OUT:
一维数组的点积:
32
两个矩阵:
arr1:
[[1 2 3 4]
[4 3 2 1]
[9 4 5 3]]
arr2:
[[3 2 4]
[3 4 5]
[3 5 1]
[7 8 3]]
二维数组的乘法:
[[46 57 29]
[34 38 36]
[75 83 70]]
点积函数dot,使用在两个一维数组中,实际上是计算两个向量的乘积,返回一个标量。使用在两个二维数组中,即矩阵的乘法,矩阵乘法要求第一个矩阵的列数要等于第二个矩阵的行数,否则会报错。
diag函数的使用
#diag函数的使用
import numpy as np
arr16 = np.arange(16).reshape(4,-1)
print('4*4的矩阵:\n',arr16)
print('取出矩阵的主对角线元素:\n',np.diag(arr16))
print('由一维数组构造的方阵:\n',np.diag(np.array([5,15,25])))
OUT:
4*4的矩阵:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
取出矩阵的主对角线元素:
[ 0 5 10 15]
由一维数组构造的方阵:
[[ 5 0 0]
[ 0 15 0]
[ 0 0 25]]
特征根与特征向量
A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特征值λ的特征向量。
#计算方阵的特征向量和特征根
import numpy as np
arr17 = np.array([[1,2,5],[3,6,8],[4,7,9]])
print('计算3*3方阵的特征根和特征向量:\n',arr17)
print('计算结果是:\n',np.linalg.eig(arr17))
OUT:
计算3*3方阵的特征根和特征向量:
[[1 2 5]
[3 6 8]
[4 7 9]]
计算结果是:
(array([16.75112093, -1.12317544, 0.37205451]),
array([[-0.30758888, -0.90292521, 0.76324346],
[-0.62178217, -0.09138877, -0.62723398],
[-0.72026108, 0.41996923, 0.15503853]]))
多元线性回归模型的解
多元线性回归一般用来预测连续的因变量,如根据天气状况预测游客数量、根据网站的活动页面预测支付转化率、根据城市人口的收入、教育水平、寿命等预测犯罪率等。该模型可以写成Y = Xβ+ε,其中Y是因变量,X是自变量,ε是误差项。要想根据已知的X来预测Y的话,必须得知道偏回归系数β的值。下面是偏回归系数β的计算公式:
#计算偏回归系数
import numpy as np
X = np.array([[1,1,4,3],[1,2,7,6],[1,2,6,6],[1,3,8,7],[1,2,5,8],[1,3,7,5],[1,6,10,12],[1,5,7,7],[1,6,3,4],[1,5,7,8]])
Y = np.array([3.2,3.8,3.7,4.3,4.4,5.2,6.7,4.8,4.2,5.1])
X_trans_X_inverse = np.linalg.inv(np.dot(np.transpose(X),X))
beta = np.dot(np.dot(X_trans_X_inverse,np.transpose(X)),Y)
print('偏回归系数:\n',beta)
OUT:
偏回归系数:
[1.78052227 0.24720413 0.15841148 0.13339845]
多元一次方程组的求解
#多元一次方程组的求解
#ax + by + z = 34
import numpy as np
a = np.array([[3,2,1],[2,3,1],[1,2,3]])
b = np.array([39,34,26])
X = np.linalg.solve(a,b)
print('三元一次方程组的解:',X)
OUT:
三元一次方程组的解:[9.25 4.25 2.75]
范数的计算
范数常常用来度量某个向量空间(或矩阵)中的每个向量的长度或大小,它具有三方面的约束条件,分别是非负性、齐次性和三角不等性。
#范数的计算
import numpy as np
arr17 = np.array([1,3,5,7,9,10,-12])
# 一范数
resl = np.linalg.norm(arr17,ord = 1)
print('向量的一范数:',resl)
#二范数
res2 = np.linalg.norm(arr17,ord = 2)
print('向量的二范数:',res2)
#三范数
res3 = np.linalg.norm(arr17,ord = 3)
print('向量的三范数:',res3)
OUT:
向量的一范数: 47.0
向量的二范数: 20.223748416156685
向量的三范数: 15.811592197931878