Python求矩阵的范数和行列式

文章目录

scipy.linalg的函数中,往往会提供两种参数,其一是check_finite,当为True时将进行有限检查,另一类是overwrite_xxxx,表示xxxx在计算过程中是否可以被覆写。简洁起见,后文中说a提供覆写开关,就表示存在一个参数overwrite_a,当其为True时,a允许计算过程中被覆写;若说提供有限检查开关,则代表提供check_finite参数。

范数

scipy.linalg中提供了函数norm用来求范数,其定义为

norm(a, ord=None, axis=None, keepdims=False, check_finite=True)

其中ord用于声明范数的阶

ord 矩阵范数 向量范数
None 弗罗贝尼乌斯范数 2-范数
'fro' 弗罗贝尼乌斯范数 -
'nuc' 核范数 -
inf max(sum(abs(a), axis=1)) max ⁡ ( ∣ a ∣ ) \max(\vert a\vert) max(a)
-inf min(sum(abs(a), axis=1)) min ⁡ ( ∣ a ∣ ) \min(\vert a\vert) min(a)
0 - sum(a!=0)
1 max(sum(abs(a), axis=0))
-1 min(sum(abs(a), axis=0))
2 2-范数(最大奇异值)
-2 最小奇异值

a为向量,若ord为非零整数,记作 n n n,设 a i a_i ai为矩阵 a a a中的元素,则矩阵的 n n n范数为

∥ a ∥ n = ∑ i a i n n \Vert a\Vert_n=\sqrt[n]{\sum_{i}a_i^n} an=niain

核范数又称“迹范数” (trace norm),表示矩阵的所有奇异值之和。

Frobenius范数可定义为

∥ a ∥ f = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ 2 = trace ⁡ ( A T A ) = ∑ i = 1 min ⁡ { m , n } σ i 2 \Vert a\Vert_f=\sqrt{\sum_{i=1}^m\sum^n_{j=1}\vert a_{ij}\vert^2}=\sqrt{\operatorname{trace}(A^TA)}=\sqrt{\sum_{i=1}^{\min\{m,n\}}\sigma_i^2} af=i=1mj=1naij2 =trace(ATA) =i=1min{ m,n}σi2

其实质是向量的2-范数在矩阵中的自然推广。

除了scipy.linalg之外,numpy.linalg中也提供了norm,其参数为

norm(x, ord=None, axis=None, keepdims=False)

其中order的可选参数与scipy.linalg中的norm函数相同。

行列式

scipy.linalg中,行列式函数为det,其定义非常简单,除了待求矩阵a之外,就只有a的覆写开关和有限检查。

示例如下

import numpy as np
from scipy import linalg
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
linalg.det(a)
# 0.0
a = np.array([[0,2,3], [4,5,6], [7,8,9]])
linalg.det(a)
# 3.0

scipy.linalg不提供trace函数,但是numpy提供,其定义为

umpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)

其中

  • offset为偏移量,表示相对于主对角线的偏移
  • axis1, axis2 表示坐标轴
  • dtype 用于调整输出值的数据类型
>>> x = np.random.rand(3,3)
>>> print(x)
[[0.26832187 0.64615363 0.09006217]
 [0.63106319 0.65573765 0.35842304]
 [0.66629322 0.16999836 0.92357658]]
>>> np.trace(x)
1.8476361016546932

猜你喜欢

转载自blog.csdn.net/m0_37816922/article/details/129864009
今日推荐