У меня следующая проблема. Из соображений производительности я использую 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)