Tensorflow无法求逆矩阵。

3
我有一个71*71的有限float64矩阵,以下是其中一部分。numpy.linalg.inv可以反转该矩阵,但tensorflow.matrix_inverse会出现以下错误:
InvalidArgumentError(请参见上面的traceback):输入无法反转。[[Node:MatrixInverse_1 = MatrixInverseT = DT_FLOAT,adjoint = false,_device =“/ job:localhost / replica:0 / task:0 / cpu:0”]]
此外,我可以使用张量的评估通过numpy反转它np.linalg.inv(tf.matmul(XT,X).eval()),因此似乎不是数据问题。
有人有解决方案吗?
[   -7.63790894    -5.08866978    -6.6209259    483.20855713
784.34204102   783.43835449    73.17279053    74.09223938
450.47570801   769.8269043    774.1385498    -14.69404697
-13.21867657   812.33081055   811.70593262    -3.88607216
 -5.75979233     3.88607216     5.75979233    -7.88097668    34.2455864
 36.57875061    19.74640274   710.11187744   698.85675049
669.33203125     2.1271162     17.33749199    19.96108818
902.21704102   902.27490234   902.23791504   902.22412109
902.28668213   902.18884277   902.15979004   902.18945312
902.13446045   902.12585449   902.11260986   902.16412354
902.14099121   902.1932373    902.18847656   902.07629395
-12.97049141   -22.87892342   -13.85427094   902.24389648
 -2.24357224   -12.29811287   -12.03248596    -2.06928253
-21.78663063   -18.63744736   -10.67835236   901.97436523
 33.95432281    36.67951584    19.38583755   144.95518494
156.08990479   137.80636597   902.09393311   236.29612732
902.21704102   902.15979004   902.215271     297.27478027
146.19558716    22.00869942]

你让我们看的这些数字是什么?那看起来不像是一个71 x 71的数组? - Paul H
是的,那不是整个东西,因为它很大。它只是一行。这样做只是为了让人们不要要求提供数据。这只是一堆浮点数,而numpy可以处理它。 - Pier-Olivier Marquis
4
你的矩阵是否可逆?https://dev59.com/_57ha4cB1Zd3GeqPkYPH - dgumo
很可能你的矩阵有一个病态前导块,tf.matrix_inverse 无法消除它(因为它仅使用部分主元消元),但可以用 np.linalg.inv 消除它(因为我认为它使用全主元消元)。这并不意味着 np.linlag.inv 给出了一个好的逆矩阵 - 实际上这是相当不可能的。如果 M = tf.matmul(XT, X).eval(),检查 np.dot(np.linalg.inv(M), M) 并看看是否得到接近单位矩阵的结果。 - Daniel F
1
或者只需检查 np.linalg.cond(M) - 如果它是一个非常高的数字,即使 np.linalg.inv 输出了一些东西,你也永远不会得到一个有用的逆。 - Daniel F
1个回答

1

我认为原因是您的矩阵不可逆。一个选择是使用摩尔-彭罗斯矩阵求逆,它由NumPy支持,使用np.linalg.pinv()函数。将您的矩阵转换为可逆矩阵的另一种选择是添加np.eye(dims)到您的矩阵中。这样会带来一些误差,但基于您的矩阵中数字的范围,这是一个很好的近似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接