Python3——np.linalg.norm

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。

在線性代數中,一個向量通過矩陣轉換成另一個向量時,原有向量的大小就是向量的範數,這個變化過程的大小就是矩陣的範數。

矩陣的範數

首先假設矩陣的大小爲m∗nm∗n,即m行n列。

  1. 1-範數,又名列和範數。顧名思義,即矩陣列向量中絕對值之和的最大值。
    A1=maxji=1maij ||A||_1=\max_j{\sum_{i=1}^{m}{|a_{ij}}|}
  2. 2-範數,又名譜範數,計算方法爲ATAA^TA矩陣的最大特徵值的開平方。
    A2=max(λ) ||A||_2=\sqrt{\max{(\lambda)}}
  3. -範數,又名行和範數。顧名思義,即矩陣行向量中絕對值之和的最大值。
    A1=maxji=1naij ||A||_1=\max_j{\sum_{i=1}^{n}{|a_{ij}}|}
  4. F-範數,Frobenius範數,計算方式爲矩陣元素的絕對值的平方和再開方。
    AF=i=1mj=1naij ||A||_F=\sqrt{\sum_{i=1}^{m}{\sum_{j=1}^{n}{|a_{ij}}|}}

向量的範數計算方法有以下5種:

  1. 1-範數,計算方式爲向量所有元素的絕對值之和。
    x1=inxi ||x||_1=∑_{i}^{n}{|x_i|}
  2. 2-範數,計算方式同歐式距離。
    x2=(inxi2) ||x||_2=\sqrt{(∑_{i}^{n}|xi|^2)}
  3. -範數,所有向量元素中的最大值。
    x=maxixi ||x||_∞=\max_i|x_i|
  4. −∞−-範數,所有向量元素中的最小值。
    x=minixi ||x||_-∞=\min_i|x_i|
  5. pp-範數,所有向量元素絕對值的p次方和的1/p次冪。
    x2=(inxip)p ||x||_2=\sqrt[p]{(∑_{i}^{n}|xi|^p)}

在Python中,我們利用norm函數來計算範數,具體如下:

norm(x, ord=None, axis=None, keepdims=False)是numpy庫裏linalg現行代數模塊中計算矩陣向量範數的方法。

ord 矩陣範數 向量範數
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 (abs(x)ord)ord\sqrt[ord]{\sum(abs(x)^{ord})}

參數
----------
x : 輸入數組,如果axis是None,那麼x必須是一維或二維
ord : 可選{非零整數, inf, -inf, ‘fro’, ‘nuc’},具體如上表所示
axis : 可選{整數,2元組, None}
   如果“axis”是一個整數,它指定“x”的軸計算向量的範數。如果“axis”是一個二元組,則指定包含二維矩陣的座標軸,以及這些矩陣的矩陣範數計算。如果“axis”爲空,那麼是對整體所有的數計算。
keepdims : 布爾值, optional
   當 True時, 返回維度爲1的結果。
   當False時,結果將是根據原始的“x”的維度正確廣播。

注意:嚴格來說,當 ord <= 0 時,不符合數學上的範數公式,但它仍然適用於各種數值目的。

import numpy as np
a = np.arange(12)
print(a)
b = a.reshape((3, 4))
print(b)
print(np.linalg.norm(a))
print(np.linalg.norm(b))
print(np.linalg.norm(b, 'fro'))
print(np.linalg.norm(b, 'nuc'))

print(np.linalg.norm(a, np.inf))
print(np.linalg.norm(a, -np.inf))
print(np.linalg.norm(a, 1))

print(np.linalg.norm(b, np.inf, axis=1))
print(np.linalg.norm(b, -np.inf, axis=0))
print(np.linalg.norm(b, 1))
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
22.4944437584
22.4944437584
22.4944437584
24.3646384993
11.0
0.0
66.0
[  3.   7.  11.]
[ 0.  1.  2.  3.]
21.0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章