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