张量流中numpy.linalg.pinv的替代方案

Rah*_*hul 4 python numpy python-3.x tensorflow

我正在寻找tensorflow中numpy.linalg.pinv的替代方案.到目前为止,我发现tf.matrix_inverse(input, adjoint=None, name=None)如果矩阵不可逆,张量流只会引发错误.

Ped*_*dro 8

TensorFlow提供了一个SVD操作,因此您可以非常容易地计算伪逆:

def pinv(A, b, reltol=1e-6):
  # Compute the SVD of the input matrix A
  s, u, v = tf.svd(A)

  # Invert s, clear entries lower than reltol*s[0].
  atol = tf.reduce_max(s) * reltol
  s = tf.boolean_mask(s, s > atol)
  s_inv = tf.diag(tf.concat([1. / s, tf.zeros([tf.size(b) - tf.size(s)])], 0))

  # Compute v * s_inv * u_t * b from the left to avoid forming large intermediate matrices.
  return tf.matmul(v, tf.matmul(s_inv, tf.matmul(u, tf.reshape(b, [-1, 1]), transpose_a=True)))
Run Code Online (Sandbox Code Playgroud)

  • +1,这应该是接受的答案.但是,或许可以选择`b`?除了计算A +*b之外,用户可能还需要伪逆用于其他目的吗? (2认同)

Nik*_*ble 1

我不知道张量流中的 numpy.linalg.pinv 替代方案,但正则化是矩阵不可逆的替代方案。一个例子:

try: 
    result = tf.matrix_inverse(input, adjoint=None, name=None)
except: 
    input += np.identity((input.shape))* c 
    result = tf.matrix_inverse(input, adjoint=None, name=None)
Run Code Online (Sandbox Code Playgroud)

其中 c 是常数并且应该非常小,例如 c = 0.000001

然而,矩阵求逆的计算量相当大,只有在必要时才应该进行。有关详细信息,请参阅:不要反转该矩阵