2016-10-14 3 views
3

다음과 같은 문제가 있습니다. 성능상의 이유로 나는 numpy.tensordot을 사용하고 따라서 내 값을 텐서와 벡터에 저장합니다. 내 계산의 하나는 다음과 같습니다 :파이썬 텐서 곱

enter image description here

<w_j>w_j<sigma_i>sigma_i의 기대 값의 기대 값이다. (아마도 나는 시그마라고 부름을해야합니다. 왜냐하면 그것은 표준 편차와 아무런 관련이 없기 때문입니다) 이제 더 많은 계산을 위해서도 분산이 필요합니다. enter image description here

을 지금이 매우 추상적이고 내가 텐서를 사용하지하고 있기 때문에 일할 때 정말 행복했다 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입니다 : 또 다른 시도였다. 내 문제가 이해되기를 바라며 미리 감사드립니다!

편집 : 첫 번째 공식은 파이썬도 같이 적어 수 있습니다 erc2 = numpy.einsum('ik, k -> i', numpy.einsum('ijk, k -> ij', re, ewp), ewp)

답변

2

당신이 할 수있는 그 같은 감소의 시리즈와 -

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) 끝낼 우리는 w으로 R의 두 번째 및 세 번째 축을 따라 소자 현명한 승산을 수행하고 그 축을 따라 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).

+0

정말 고마워요! 귀하의 답변은 작동합니다 :) – HighwayJohn