微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-计算TensorFlow中两个输入集合的每对之间的成对距离

我有两个收藏.一个由k个维中的m1个点组成,另一个由k个维中的m2个点组成.我需要计算两个集合的每对之间的成对距离.

基本上有两个矩阵Am1,k和Bm2,k我需要得到一个矩阵Cm1,m2.

我可以通过使用distance.sdist轻松地在scipy中执行此操作,并选择许多距离度量之一,而且我也可以在TF中循环执行此操作,但是即使是欧氏距离,我也无法弄清楚如何使用矩阵操作来执行此操作.

解决方法:

几个小时后,我终于在Tensorflow中找到了如何进行此操作.我的解决方案仅适用于Eucledian距离,并且非常冗长.我也没有数学上的证明(只是做了大量的手工操作,我希望使其更加严格):

import tensorflow as tf
import numpy as np
from scipy.spatial.distance import cdist

M1, M2, K = 3, 4, 2

# Scipy calculation
a = np.random.rand(M1, K).astype(np.float32)
b = np.random.rand(M2, K).astype(np.float32)
print cdist(a, b, 'euclidean'), '\n'

# TF calculation
A = tf.Variable(a)
B = tf.Variable(b)

p1 = tf.matmul(
    tf.expand_dims(tf.reduce_sum(tf.square(A), 1), 1),
    tf.ones(shape=(1, M2))
)
p2 = tf.transpose(tf.matmul(
    tf.reshape(tf.reduce_sum(tf.square(B), 1), shape=[-1, 1]),
    tf.ones(shape=(M1, 1)),
    transpose_b=True
))

res = tf.sqrt(tf.add(p1, p2) - 2 * tf.matmul(A, B, transpose_b=True))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(res)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐