2017-02-28 29 views
4

我正在尋找一種在tensorflow中替代numpy.linalg.pinv。 到目前爲止,我發現tensorflow只有tf.matrix_inverse(input, adjoint=None, name=None),如果矩陣不可逆,它將引發錯誤。tensorflow中的numpy.linalg.pinv的替代

+0

如果矩陣不可逆,您可以選擇使用正則化。 –

+0

@NikolasRieble,請提供示例 – Rahul

+0

'pinv()'基於SVD,而Tensorflow具有SVD功能......我不打算提供示例:) – gboffi

回答

1

我不知道numpy.linalg.pinv在tensorflow中的替代品,但正則化是在矩陣不可逆時的替代方案。一個例子:

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) 

其中c是常數,並且應該是很小的例如c = 0.000001

然而矩陣求逆是相當昂貴的計算,只應如果neccesary完成。欲瞭解更多信息,請參閱:do not invert that matrix

+1

如果OP有擴展最終評論他們可以按照'x←pinv(A)@ b'(OP暗示的路線)或(根據你的建議)找到'x',他們可以按如下方式進行:'b ^←AT @ b','A ^←AT @ A'並使用例如LU分解,線性系統_'A^x = b ^'_ – gboffi

2

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))) 
+0

+1,這應該是被接受的答案。但是,也許讓'b'可選?除了計算A + * b之外,用戶可能需要僞逆來達到其他目的。 – MiniQuark