Tensorflow эффективный попарно внутренний продукт

В Tensorflow (python), учитывая матрицу X формы (nxd), где каждая строка является точкой данных, я хотел бы вычислить попарно внутренние произведения этих n точек данных, то есть верхний треугольник XX '.

Конечно, я мог бы вычислить весь XX и извлечь его верхний треугольник, но это означает, что я бы вычислял недиагональные элементы дважды. Как эффективно вычислить их в Tensorflow (python), вычисляя внутренний продукт только один раз на пару?

1 ответ

С NumPy вы можете сделать это:

import numpy as np

A = np.random.randn(5, 3)
inds = np.triu_indices(5) # upper triangle indices

# expensive way to do it
ipu1 = np.dot(A, A.T)[inds]


# possibly less expensive way to do it.
ipu2 = np.einsum('ij,ij->i', A[inds[0]], A[inds[1]])

print(np.allclose(ipu1, ipu2))

Это выводит True. В Tensorflow нет встроенной функции triu_indices, но написать ее при необходимости несложно, посмотрев на код numpy. У него есть einsum.

Другие вопросы по тегам