诱导范数"/>
9.4 诱导范数
前面一篇文章说过,把向量范数的计算方法用在矩阵上,不能用相同的名字。那什么样的矩阵范数才能用向量范数相同的名字呢?答案就是诱导范数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}| ∥A∥1=1≤j≤nmaxi=0∑m∣aij∣
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 ∥A∥2=λ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 Mreturn [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}| ∥A∥1=1≤i≤mmaxj=0∑n∣aij∣
Python代码:
# 无穷范数def infinite_norm(self):return Matrix(self.transpose()).one_norm()
在这里我为了复用代码,直接转置一下求1-范数,就等于无穷范数了。
至于p不为1和2的向量p-范数的诱导范数,是非常难求的,而且实际应用较少,所以很少有人研究。
更多推荐
9.4 诱导范数
发布评论