zl程序教程

您现在的位置是:首页 >  其它

当前栏目

7.3 矩阵范数

矩阵 7.3 范数
2023-09-14 09:06:55 时间

定义

   向量有范数,矩阵也有范数,定义和向量范数类似,不过多了一条要求。它的定义如下:

  1. 正定性positivity, ∥ A ∥ ≥ 0 \parallel A\parallel\ge 0 A∥≥0,只有 A = 0 A=0 A=0时才取等号;
  2. 非负齐次性homogeneityscaling, ∥ k A ∥ = ∣ k ∣ ∥ A ∥ \parallel kA\parallel=|k|\parallel A\parallel kA∥=kA
  3. 劣可加性subadditivity或三角不等式triangle inequality ∥ A + B ∥ ≤ ∥ A ∥ + ∥ B ∥ \parallel A+B\parallel \le \parallel A\parallel+\parallel B\parallel A+B∥≤∥A+B
  4. 相容条件submultiplicativity ∥ A B ∥ ≤ ∥ A ∥ ∥ B ∥ \parallel AB\parallel \le \parallel A\parallel\parallel B\parallel AB∥≤∥A∥∥B

  只满足前三个条件的是广义矩阵范数。当然也有国外一些教材把满足前三条的叫矩阵范数,把满足第四条的叫相容矩阵范数Consistent Matrix Norms。矩阵的范数有点多,有和范数、Frobenius范数、最大范数、行范数、列范数、谱范数等,后面三个叫诱导范数。

和范数

  向量的各个分量模长的和,叫做1-范数。但是矩阵各个位置模长的和可不能叫1-范数。至于为什么不能叫,因为矩阵的1-范数属于诱导范数,我会另外写一篇诱导范数的文章来说。矩阵各个位置模长的和叫和范数sum norm,定义如下:
∥ A ∥ S = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ \parallel A\parallel_S=\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}| AS=i=1mj=1naij
  求和范数的Python代码就比较简单了:

    def sum_norm(self):
        result = 0
        for vector in self.__vectors:
            for e in vector:
                result += abs(e)
        return result

Frobenius范数

  同样,矩阵各位置元素模长的平方和再开根号,不能叫2-范数,因为2-范数属于诱导范数。那应该叫什么呢?有个专门的名字Frobenius范数Frobenius norm,或者叫F范数,还可以叫希尔伯特-施密特范数Hilbert-Schmidt norm或舒尔范数Schur norm。定义如下:
∥ A ∥ F = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ 2 \parallel A\parallel_F=\sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}|^2} AF=i=1mj=1naij2
  F范数是考试热门。因为它性质特别多。首先有:
∥ A ∥ F = t r ( A H A ) \parallel A\parallel_F=\sqrt{tr(A^HA)} AF=tr(AHA)
  这个就无需证明了,因为一阶迹是所有对角线元素的和。而复数乘以自己的共轭就等于模长的平方。还有F-范数等于 A H A A^HA AHA所有特征值的和开根号。这也无需证明,因为一阶迹就是所有特征值的和。
  F-范数等于奇异值的平方和再开根号:
∥ A ∥ F = ∑ i = 1 n σ i 2 \parallel A\parallel_F=\sqrt{\sum_{i=1}^n\sigma_i^2} AF=i=1nσi2
  奇异值那个希腊字母很少见,读做西格玛是求和符号的小写形式。所以它也等于沙滕2-范数。
  Python代码:

    # F-范数
    def frobenius_norm(self):
        result = 0
        for vector in self.__vectors:
            for e in vector:
                result += abs(e)**2
        return math.sqrt(result)

最大范数

  矩阵所有元素的模长的最大值同样不能叫无穷范数,所以矩阵范数难受的是向量范数用过的名词都不能用了,要换个名词了,这次换成了最大范数max norm。最大范数不是相容范数,所以属于广义矩阵范数。它的定义如下:
∥ A ∥ M = m a x ( ∣ a i j ∣ ) \parallel A\parallel_M=max(|a_{ij}|) AM=max(aij)
  最大范数为什么不相容?我们只要找个 ∥ A B ∥ > ∥ A ∥ ∥ B ∥ \parallel AB\parallel \gt \parallel A\parallel\parallel B\parallel AB∥>∥A∥∥B的反例就行了。现在就给一个:
∥ 1 1 1 1 ∥ M = 1 ( 1 1 1 1 ) ( 1 1 1 1 ) = ( 2 2 2 2 ) ∥ 2 2 2 2 ∥ M = 2 \begin{Vmatrix}1 & 1\\ 1 & 1\\ \end{Vmatrix}_M=1\\ \begin{pmatrix}1 & 1\\ 1 & 1\\ \end{pmatrix}\begin{pmatrix}1 & 1\\ 1 & 1\\ \end{pmatrix}=\begin{pmatrix}2 & 2\\ 2 & 2\\ \end{pmatrix}\\ \begin{Vmatrix}2 & 2\\ 2 & 2\\ \end{Vmatrix}_M=2\\ 1111 M=1(1111)(1111)=(2222) 2222 M=2
  Python代码:

    # 最大范数
    def max_norm(self):
        array = [[abs(e) for e in vector] for vector in self.__vectors]
        max_vectors = [max(vector) for vector in array]
        return max(max_vectors)