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

时间:2017-02-28 06:28:12

标签: python python-3.x numpy tensorflow

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

5 个答案:

答案 0 :(得分:8)

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

auto

答案 1 :(得分:2)

我不知道张量流中的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)

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

然而,矩阵求逆在计算上相当昂贵,只有在必要时才应该进行。有关详细信息,请参阅:do not invert that matrix

答案 2 :(得分:2)

您可以将tensorflow numpyreturn tf.py_func(np.linalg.pinv, [input], tf.float32) 的{​​{3}}合并,如下所示:

$(".quarter").on('click', function(){
    if( userTurn===true && isOn===true){
        var color = $(this).attr('id');
        clearTimeout(buzz);
        buttonClick(color);
    } 
})

答案 3 :(得分:1)

遵循numpy的pinv实施的实现:

def pinv(a, rcond=1e-15):
    s, u, v = tf.svd(a)
    # Ignore singular values close to zero to prevent numerical overflow
    limit = rcond * tf.reduce_max(s)
    non_zero = tf.greater(s, limit)

    reciprocal = tf.where(non_zero, tf.reciprocal(s), tf.zeros(s.shape))
    lhs = tf.matmul(v, tf.matrix_diag(reciprocal))
    return tf.matmul(lhs, u, transpose_b=True)

这支持伪逆的单次和批量计算:

# Pseudo-inverse of one (4, 3) matrix, has shape (3, 4)
pinv(tf.random_normal((4, 3)))

# Pseudo-inverses of two (4, 3) matrices, has shape (2, 3, 4)
pinv(tf.random_normal((2, 4, 3)))

谢谢@Andy Tsai的提示!

答案 4 :(得分:0)

支持批处理以加快计算速度的另一种方法是将tf.diag替换为tf.matrix_diag。像这样:

def pinv(a, rcond=1e-15):
    s, u, v = tf.svd(a)
    # Ignore singular values close to zero to prevent numerical overflow
    limit = rcond * tf.reduce_max(s)
    non_zero = tf.greater(s, limit)

    reciprocal = tf.where(non_zero, tf.reciprocal(s), tf.zeros(s.shape))
    lhs = tf.matmul(v, tf.matrix_diag(reciprocal))
    return tf.matmul(lhs, u, transpose_b=True)