范数计算
in

范数计算

?> with 0 comment

范数的计算主要使用到了 numpy.linalg.norm 函数,在数学推导中,范数是很常见的规则部分,但是具体的计算过程并不清楚,本篇尝试详细的计算一下。

Numpy函数

x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)

范数的类型

ordnorm for matricesnorm for vectors
NoneFrobenius norm2-norm
‘fro’Frobenius norm
'nuc'nuclear norm
infmax(sum(abs(x), axis=1))max(abs(x))
-infmin(sum(abs(x), axis=1))min(abs(x))
0sum(x != 0)
1max(sum(abs(x), axis=0))as below
-1min(sum(abs(x), axis=0))as below
22-norm (largest sing. value)as below
-2smallest singular valueas below
other$[sumx^{ord}]^{1/ord}$

补充两点:

举例

根据Numpy给出的例子,进行分析:

import numpy as np
a = np.arange(9)-4
b = a.reshape(3,3)
print(a)
print(b)

得到:

a = [-4 -3 -2 -1  0  1  2  3  4]
b = [[-4 -3 -2]
    [-1  0  1]
    [ 2  3  4]]

向量范数

可以看到np.linalg.norm(a)np.linalg.norm(a, ord=2)的输出是一样的。

$-\infty$范数: $$||\textbf{x}||_{-\infty}=\min_i|x_i|$$ ,即所有向量元素绝对值中的最小值

矩阵范数

np.linalg.eig 用于返回矩阵的特征值与特征向量。

注意这个是行向量,而1-范数是列向量绝对值和。

范数计算

def normalizeRows(x):
    ### YOUR CODE HERE
    denom = np.apply_along_axis(lambda x: np.sqrt(x.T.dot(x)), 1, x)
    x /= denom[:, None]
    ### END YOUR CODE
    return x

或者 更简单

def normalizeRows(x):
    ### YOUR CODE HERE
    denom = np.linalg.norm(x,axis=1,keepdims=True)
    x = x/denom
    ### END YOUR CODE

    return x

Numpy中的Axis

设axis=i,则Numpy沿着第i个下标变化的方向进行操作。

举例:data =[[a00, a01],[a10,a11]],

当axis = 0时,沿着第0个下标变化的方向进行操作,也就是a00->a10, a01->a11。

当axis = 1时,沿着第1个下标变化的方向进行操作,也就是a00->a01, a10->a11。

Responses

From now on, bravely dream and run toward that dream.
陕ICP备17001447号·苏公网安备 32059002001895号