TensorFlow 1.14特征分解报错求助:同逻辑Numpy代码正常
问题解决:TensorFlow 1.14中正确实现特征分解
你的错误根源是用Numpy的特征分解函数处理TensorFlow张量——K_reg是TensorFlow计算图中的张量对象,而非Numpy数组,np.linalg.eig无法直接处理,必须改用TensorFlow自带的特征分解API,同时适配TF1.x的静态图运行机制。
关键修改点
- 修正错误导入:原代码
from tensorflow.linalg import inv eig语法错误,需用逗号分隔导入项; - 替换特征分解函数:用TensorFlow 1.14提供的
tf.linalg.eig(通用矩阵)或tf.linalg.eigh(实对称/厄米特矩阵,更高效)替代np.linalg.eig; - 适配TF1.x静态图:需要通过会话(Session)运行计算图,才能得到具体数值结果。
修正后的完整代码
import tensorflow as tf from tensorflow.linalg import inv, eig # 修正导入语法 # 假设Xn、Yn、n已提前定义 _, Ux, _ = tf.linalg.svd(Xn, full_matrices=False, compute_uv=True) # 投影X和Y到主成分 Yproj = tf.matmul(tf.transpose(Ux), Yn) Xproj = tf.matmul(tf.transpose(Ux), Xn) _, Uyx, Vyx = tf.linalg.svd(tf.matmul(Yproj, tf.transpose(Xproj)), full_matrices=False, compute_uv=True) K_reg = tf.matmul(Uyx, tf.transpose(Vyx)) # TensorFlow中执行特征分解 eigval_tensor, eigvec_tensor = tf.linalg.eig(K_reg) # TF1.x需通过会话运行获取结果 with tf.Session() as sess: Eigval_Proc, Eigvec_Proc = sess.run([eigval_tensor, eigvec_tensor])
补充说明
- 如果
K_reg是实对称矩阵(从你的计算逻辑看,Uyx和Vyx是SVD得到的正交矩阵,K_reg大概率是正交矩阵,属于实对称矩阵的子集),推荐用tf.linalg.eigh,它计算更快且返回的特征值是有序的; - 若坚持用Numpy处理,需先将张量转为Numpy数组:
Eigval_Proc, Eigvec_Proc = np.linalg.eig(K_reg.eval(session=sess)),但这种方式会破坏TF计算图的连贯性,不推荐。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

