【问题标题】:Tensorflow not able to invert matrixTensorflow 无法反转矩阵
【发布时间】:2017-11-27 00:14:35
【问题描述】:

我有一个 71*71 的有限 float64 矩阵,摘录如下。 numpy.linalg.inv 可以反转该矩阵,但 tensorflow.matrix_inverse 会出现此错误:

InvalidArgumentError(参见上面的回溯):输入不是 可逆的。 [[节点:MatrixInverse_1 = MatrixInverseT=DT_FLOAT, 伴随=假, _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 阵列?
  • 是的,这不是全部,因为它很大。它只是一排。只是为了让人们不要求提供数据。它只是一堆浮点数,numpy可以处理它。
  • 你的矩阵是可逆的吗? stackoverflow.com/q/41841509/1140684
  • 很可能你的矩阵有一个病态的前导块,tf.matrix_inverse 无法消除(因为它只使用部分旋转)但可以被np.linalg.inv 消除(我认为使用全旋转)。这并不意味着np.linlag.inv 给了你一个很好的逆向——事实上这不太可能。如果是M = tf.matmul(XT, X).eval(),检查np.dot(np.linalg.inv(M), M),看看你是否得到了接近单位矩阵的东西。
  • 或者只是检查np.linalg.cond(M) - 如果它是一个高得离谱的数字,即使np.linalg.inv 吐出一些东西,你也永远不会得到一个有用的逆。跨度>

标签: numpy tensorflow


【解决方案1】:

我认为原因是您的矩阵不可逆。一种选择是使用 NumPy 支持的Moore-Penrose matrix inversion 作为np.linalg.pinv()。将矩阵转换为可逆矩阵的另一种选择是将np.eye(dims) 添加到矩阵中。它会增加误差,但根据矩阵中数字的范围,这是一个很好的近似值。

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多