zl程序教程

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

当前栏目

7.4 诱导范数

7.4 范数
2023-09-14 09:06:54 时间

  前面一篇文章说过,把向量范数的计算方法用在矩阵上,不能用相同的名字。那什么样的矩阵范数才能用向量范数相同的名字呢?答案就是诱导范数induced norm或自然范数Natural Norm。诱导范数不是把向量范数的计算方法直接用在矩阵上,它的计算方法比较另类。是这样定义的,已知一个向量范数 ∥ x ∥ α \parallel x\parallel_{\alpha} xα,它诱导的矩阵范数为:
∥ A ∥ α = max ⁡ ( ∥ A x ∥ α ∥ x ∥ α ) , x ≠ 0 \parallel A\parallel_\alpha=\max(\frac{\parallel Ax\parallel_\alpha}{\parallel x\parallel_\alpha}),x\ne 0 Aα=max(xαAxα),x=0
  也即是说遍历所有非零向量,让矩阵乘以这个向量得到的向量的范数,再除于向量的范数。然后在这些商里找最大值。那什么是算子范数呢?公式和诱导范数差不多。算子范数operator norm,是两个向量范数诱导出的矩阵范数,定义如下:
∥ A ∥ ( α , β ) = max ⁡ ( ∥ A x ∥ α ∥ x ∥ β ) , x ≠ 0 \parallel A\parallel_{(\alpha,\beta)}=\max(\frac{\parallel Ax\parallel_\alpha}{\parallel x\parallel_\beta}),x\ne 0 A(α,β)=max(xβAxα),x=0
  也就是说,诱导范数是算子范数 α = β \alpha=\beta α=β的特殊场景。
  但是这个定义,太难计算了吧,遍历所有向量再求最大值,计算量是无穷的。不过对于常见的诱导范数,前人总结出了计算方法。

1-范数

  1-范数的计算就是求最大列和,所以也叫列范数,或列和范数。计算公式:
∥ A ∥ 1 = max ⁡ 1 ≤ j ≤ n ∑ i = 0 m ∣ a i j ∣ \parallel A\parallel_1=\max_{1\le j\le n}\sum_{i=0}^m|a_{ij}| A1=1jnmaxi=0maij
  Python代码:

    def one_norm(self):
        array = [[abs(e) for e in vector] for vector in self.__vectors]
        sum_array = [sum(vector) for vector in array]
        return max(sum_array)

  要注意是模长的和,对于实数是绝对值。

2-范数

  2-范数,也叫谱范数,它的计算方法,前人也总结了。公式如下:
∥ A ∥ 2 = λ m a x ( A H A ) = σ 1 \parallel A\parallel_2=\sqrt{\lambda_{max}(A^HA)}=\sigma_1 A2=λmax(AHA) =σ1
  就是 A H A A^HA AHA的最大特征值开根号。也就是A的最大奇异值 σ 1 \sigma_1 σ1,所以也等于樊畿1-范数。Python代码:

    # 2-范数
    def two_norm(self):
        return math.sqrt(max(self.sigular_values()))
    
    # 暂时用海森堡法求奇异值
    def sigular_values(self):
        m = Matrix(self.transpose()) * self
        # 用海森堡法计算
        from com.youngthing.mathalgorithm.linearalgebra.hessenberg import Matrix as M
        return [math.sqrt(e) for e in M(m.__vectors).eigen_values()]

  我这里直接导入了我之前写的海森堡算法代码求特征值。

无穷范数

  无穷范数也叫行范数,或行和范数,计算方法如下:
∥ A ∥ 1 = max ⁡ 1 ≤ i ≤ m ∑ j = 0 n ∣ a i j ∣ \parallel A\parallel_1=\max_{1\le i\le m}\sum_{j=0}^n|a_{ij}| A1=1immaxj=0naij
  Python代码:

    # 无穷范数
    def infinite_norm(self):
        return Matrix(self.transpose()).one_norm()

  在这里我为了复用代码,直接转置一下求1-范数,就等于无穷范数了。
  至于p不为1和2的向量p-范数的诱导范数,是非常难求的,而且实际应用较少,所以很少有人研究。