Тензорный продукт Python

У меня следующая проблема. Из соображений производительности я использую numpy.tensordot, поэтому мои значения хранятся в тензорах и векторах. Один из моих расчетов выглядит так:

введите здесь описание изображения

<w_j> — ожидаемое значение w_j, а <sigma_i> — ожидаемое значение sigma_i. (Возможно, теперь я должен был назвать это сигма, потому что это не имеет ничего общего со стандартным отклонением) Теперь для дальнейших расчетов мне также нужна дисперсия. Чтобы получить дисперсию, мне нужно рассчитать: введите здесь описание изображения

Теперь, когда я реализовал первую формулу в python с помощью numpy.tensordot, я был очень счастлив, когда она сработала, потому что это довольно абстрактно, и я не привык к тензорам. Код действительно выглядит так:

erc = numpy.tensordot(numpy.tensordot(re, ewp, axes=1), ewp, axes=1)

Теперь это работает, и моя проблема состоит в том, чтобы записать правильную форму для второй формулы. Одна из моих попыток была:

serc = numpy.tensordot(numpy.tensordot(numpy.tensordot(numpy.tensordot
(numpy.tensordot(re, re, axes=1), ewp, axes=1), ewp, axes=1)
, ewp, axes=1), ewp, axes=1)

Но это дает мне скаляр вместо вектора. Еще одна попытка была:

serc = numpy.einsum('m, m', numpy.einsum('lm, l -> m',
numpy.einsum('klm, k -> lm', numpy.einsum('jklm, j -> klm',
numpy.einsum('ijk, ilm -> jklm', re, re), ewp), ewp), ewp), ewp)

Векторы имеют длину l, а размерность тензора l * l * l. Я надеюсь, что моя проблема понятна и спасибо заранее!

Редактировать: первая формула может быть записана в python также как: erc2 = numpy.einsum('ik, k -> i', numpy.einsum('ijk, k -> ij', re, ewp), ewp)


person HighwayJohn    schedule 14.10.2016    source источник


Ответы (1)


Вы можете сделать это с помощью ряда сокращений, например:

p1 = np.tensordot(re,ewp,axes=(1,0))
p2 = np.tensordot(p1,ewp,axes=(1,0))
out = p2**2

Пояснение

Во-первых, мы могли бы разделить его на две группы операций:

Group 1: R(i,j,k) , < wj > , < wk > 
Group 2: R(i,l,m) , < wl > , < wl > 

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

Теперь, чтобы вычислить R(i,j,k) , ‹ wj >, ‹ wk и получить (i) , нам нужно выполнить поэлементное умножение по второй и третьей осям R на w , а затем выполнить sum-reduction по этим осям. Здесь мы делаем это в два этапа с двумя tensordots -

[1] R(i,j,k) , < wj > to get p1(i,k)
[2] p1(i,k) , < wk > to get p2(i)

Таким образом, мы получаем вектор p2. Аналогично со второй группой результатом будет идентичный вектор. Итак, чтобы получить окончательный результат, нам просто нужно возвести этот вектор в квадрат, то есть p**2.

person Divakar    schedule 14.10.2016