numpy 中范数的计算
首先,构建一个简单的矩阵
1>>> import numpy as np
2
3>>> X = np.array([[1,1,1],[2,2,2],[3,3,3]])
4
5>>> X
6array([[1, 1, 1],
7 [2, 2, 2],
8 [3, 3, 3]])
9
10>>> X**2
11array([[1, 1, 1],
12 [4, 4, 4],
13 [9, 9, 9]], dtype=int32)
二范数
默认按二范数计算
1>>> np.linalg.norm(X) # 计算矩阵范数
26.48074069840786
3
4>>> np.linalg.norm(X, axis=0) # 按列向量计算范数
5array([3.74165739, 3.74165739, 3.74165739])
6
7>>> np.linalg.norm(X, axis=1) # 按行向量计算范数
8array([1.73205081, 3.46410162, 5.19615242])
直接调用上面的方法等价于下面的计算过程
1>>> np.sqrt(np.sum(X**2)) # 对整个矩阵计算平方和然后开平方根
26.48074069840786
3
4>>> np.sqrt(np.sum(X**2, axis=0)) # 按列计算平方和后开平方根
5array([3.74165739, 3.74165739, 3.74165739])
6
7>>> np.sqrt(np.sum(X**2, axis=1)) # 按行计算平方和后开平方根
8array([1.73205081, 3.46410162, 5.19615242])
方法原型
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
上面只用到了参数 x
放置数据,和参数 axis
指定计算的轴。另一个参数 ord
指按照第几范数计算,它包含下面这些值:
ord | norm for matrices | norm for vectors |
---|---|---|
None | Frobenius norm | 2-norm |
‘fro’ | Frobenius norm | – |
‘nuc’ | nuclear norm | – |
inf | max(sum(abs(x), axis=1)) | max(abs(x)) |
-inf | min(sum(abs(x), axis=1)) | min(abs(x)) |
0 | – | sum(x != 0) |
1 | max(sum(abs(x), axis=0)) | as below |
-1 | min(sum(abs(x), axis=0)) | as below |
2 | 2-norm (largest sing. value) | as below |
-2 | smallest singular value | as below |
other | – | sum(abs(x)**ord)**(1./ord) |
官方文档跳转
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html