使用TensorFlow的tf.linalg.eigh计算特征值特征向量验证结果不匹配
问题原因分析
- 调用了错误的TensorFlow API
tf.linalg.eigh是专门用于计算**实对称矩阵(或复数厄米矩阵)**特征值与特征向量的接口,你定义的示例矩阵[[0,1],[-2,-3]]不属于实对称矩阵,使用该接口计算得到的特征值、特征向量结果本身就是错误的,自然无法满足特征值定义式。
计算一般方阵的特征值与特征向量应当使用tf.linalg.eig接口。 - 特征值验证的矩阵乘法顺序错误
特征分解的矩阵形式为A = V @ Λ @ tf.linalg.inv(V),其中V是特征向量按列堆叠得到的矩阵、Λ是特征值构成的对角矩阵,对应的验证式应当是A @ V = V @ Λ,你在验证时写的tf.matmul(tf.linalg.diag(eigVals),eigVects)是Λ @ V,乘法顺序完全相反,就算特征值特征向量计算正确,这样算出来的结果也不会匹配。
正确验证示例代码
import tensorflow as tf # version 2.6.0 # 定义示例矩阵 ex1 = tf.convert_to_tensor([[0,1],[-2,-3]],dtype=tf.float32) # 调用正确的API计算一般方阵的特征值、特征向量 eigVals, eigVects = tf.linalg.eig(ex1) # 转为实数值方便验证(本例特征值均为实数) eigVals_real = tf.cast(eigVals, tf.float32) eigVects_real = tf.cast(eigVects, tf.float32) # 正确验证:计算A@V 和 V@Λ av = tf.matmul(ex1, eigVects_real) lambda_v = tf.matmul(eigVects_real, tf.linalg.diag(eigVals_real)) # 打印结果对比,两者误差在浮点精度范围内完全一致 print(av) print(lambda_v)
内容的提问来源于stack exchange,提问作者colton
相关产品推荐
相关产品推荐

