тензор потока питона l2 по оси - PullRequest
0 голосов
/ 27 января 2019

Я использую Python 3 с тензорным потоком. У меня есть матрица, каждая строка - это вектор, я хочу получить матрицу расстояний - это компьютер, использующий l2 норма потерь , каждое значение в матрице будетбыть расстоянием между двумя векторами

например

Dij = l2_distance(M(i,:), Mj(j,:)) 

Спасибо

edit: это не дубликат из , что другой вопрос касается вычислениянорма для каждой строки матрицы, мне нужно попарное расстояние нормы между каждой строкой до каждой другой строки.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Этот ответ показывает, как вычислить попарную сумму квадратов разностей между коллекцией векторов.Просто посткомпоновав с квадратным корнем, вы получите желаемые попарные расстояния:

M = tf.constant([[0, 0], [2, 2], [5, 5]], dtype=tf.float64)
r = tf.reduce_sum(M*M, 1)
r = tf.reshape(r, [-1, 1])
D2 = r - 2*tf.matmul(M, tf.transpose(M)) + tf.transpose(r)
D = tf.sqrt(D2)

with tf.Session() as sess:
    print(sess.run(D))

# [[0.         2.82842712 7.07106781]
#  [2.82842712 0.         4.24264069]
#  [7.07106781 4.24264069 0.        ]]
0 голосов
/ 27 января 2019

Вы можете написать операцию TensorFlow на основе формулы евклидова расстояния (потеря L2).

enter image description here

distance = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(x1, x2))))

Пример будет

import tensorflow as tf

x1 = tf.constant([1, 2, 3], dtype=tf.float32)
x2 = tf.constant([4, 5, 6], dtype=tf.float32)

distance = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(x1, x2))))

with tf.Session() as sess:
  print(sess.run(distance))

Как указал @fuglede, если вы хотите вывести попарные расстояния, тогда мы можем использовать

tf.sqrt(tf.square(tf.subtract(x1, x2)))
...