問題場景
已知兩組向量為:
現(xiàn)在要計算中每一個向量和
中每一個向量的歐式距離。
解決思路一
把中向量使用
tf.tile復制m次,把中向量復制n次。
然后按照向量距離公式就可以得到
的距離矩陣了。
缺點:
- 計算量大,復雜度大概是
,
為向量維度。
-
tf.tile后要保存兩個很大的矩陣,占資源
解決思路二
利用完全平方公式,對于距離矩陣中的
元素(表示
中第
個向量和
中的第
個向量之間的歐式距離):
其中的矩陣可以由兩個向量相乘快速計算。
import tensorflow as tf
def euclidean_dist(x, y):
square_x = tf.reduce_sum(tf.square(x), axis=-1)
square_y = tf.reduce_sum(tf.square(y), axis=-1)
# expand dims for broadcasting
ex = tf.expand_dims(square_x, axis=-1)
ey = tf.expand_dims(square_y, axis=-2)
# XY matrix
xy = tf.einsum('bij,bkj->bik', x, y)
# 如果沒有batch_size這個維度,可以寫成:
# xy = tf.einsum('ij,kj->ik', x, y)
# compute distance,浮點防溢出
dist = tf.sqrt(ex - 2 * xy + ey + 1e-10)
return dist
計算dist的時候加上了
1e-10,因為在
處導數(shù)不存在,需要做平滑。
優(yōu)點:
-
和
中向量的平方不用重復計算,加速運算。
-
矩陣是標量矩陣,節(jié)約顯存資源,這個有時很重要!