我有一个 2x2 矩阵,由来自其他输入J00, J01, J10, J11
变量定义。由于矩阵很小,我能够通过首先计算迹线和行列式来计算光谱范数
J_T = tf.reduce_sum([J00, J11])
J_ad = tf.reduce_prod([J00, J11])
J_cb = tf.reduce_prod([J01, J10])
J_det = tf.reduce_sum([J_ad, -J_cb])
然后求解二次
L1 = J_T/2.0 + tf.sqrt(J_T**2/4.0 - J_det)
L2 = J_T/2.0 - tf.sqrt(J_T**2/4.0 - J_det)
spectral_norm = tf.maximum(L1, L2)
这有效,但它看起来相当丑陋,并且不能推广到更大的矩阵。有没有更干净的方法(也许是我缺少的方法调用)来计算spectral_norm
?
矩阵J
的谱范数等于矩阵的最大奇异值。
因此,您可以使用tf.svd()
执行奇异值分解,并取最大的奇异值:
spectral_norm = tf.svd(J,compute_uv=False)[...,0]
其中J
是你的矩阵。
笔记:
- 我使用
compute_uv=False
因为我们只对奇异值感兴趣,而不是奇异向量。 J
不需要是方形的。- 此解决方案也适用于
J
具有任意数量的批次维度的情况(只要最后两个维度是矩阵维度)。 - 省略号
...
操作的工作方式与在 NumPy 中一样。 - 我采用
0
指数,因为我们只对最大的奇异值感兴趣。