如何计算矩阵中向量之间的欧几里得距离?

3

我希望计算特征向量之间的欧几里得距离,这些向量是从网络中获取的tf.Tensor。

我尝试了以下方法,但出现了错误:

'Tensor' object is not iterable

我想通过矩阵计算每行之间的距离,而不需要逐行迭代。

features, _ = mnist_net(images)
feature_matrix = np.zeros(shape=(FLAGS.batch_size,FLAGS.batch_size))
for i in range (FLAGS.batch_size):
   for j in range (FLAGS.batch_size):
      aa = tf.slice(features,[i,0],[1,50])
      bb = tf.slice(features,[j,0],[1,50])
      feature_matrix[i,j] = tf.sqrt(sum((aa-bb)**2))  

你目前尝试了什么?最好提供一些代码并解释你的尝试。 - Banghua Zhao
这里的“距离”是什么意思?有很多距离度量方法。 - Zito Relova
我已经修复了这个问题,你能帮我解决它吗?@Banghua Zhao@user7374610 - Bobo Xi
1个回答

2
你可以通过tf.norm/tf.linalg.norm轻松实现这一点:
feature_matrix = tf.linalg.norm(features[:, tf.newaxis] - features, axis=-1)

例如:

import tensorflow as tf

with tf.Session() as sess:
    features = tf.placeholder(tf.float32, [None, None])
    feature_matrix = tf.linalg.norm(features[:, tf.newaxis] - features, axis=-1)
    print(sess.run(feature_matrix, feed_dict={features: [[ 1,  2,  3],
                                                         [ 4,  5,  6],
                                                         [ 7,  8,  9],
                                                         [10, 11, 12]]}))

输出:

[[ 0.        5.196152 10.392304 15.588457]
 [ 5.196152  0.        5.196152 10.392304]
 [10.392304  5.196152  0.        5.196152]
 [15.588457 10.392304  5.196152  0.      ]]

编辑:

如果您无法使用 tf.norm,以下是一个等效的实现:

sqdiff = tf.squared_difference(features[:, tf.newaxis], features)
feature_matrix = tf.sqrt(tf.reduce_sum(sqdiff, axis=-1))

我尝试了但是没有成功。错误信息是“模块'tensorflow'没有属性'linalg'”,而Tensorflow的版本是1.0.1。 - Bobo Xi
@BoboXi 哦,对了,试试用 tf.norm ... 不过1.0.1版本相当老了,我不确定那里面是否有这个函数。 - jdehesa
@jdehesa 后面的解决方案可行,非常感谢! - Bobo Xi
@BoboXi,很高兴它起作用了。如果您认为它解决了您的问题,请考虑将答案标记为已接受。 - jdehesa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接