Python张量积
Python tensor product
我有以下问题。出于性能原因,我使用 numpy.tensordot
并因此将我的值存储在张量和向量中。
我的一项计算如下所示:
<w_j>
是w_j
的期望值,<sigma_i>
是sigma_i
的期望值。 (也许我现在应该称其为 sigma,因为它与标准偏差无关)现在为了进一步计算,我还需要方差。为了获得方差,我需要计算:
现在,当我用 numpy.tensordot
将第一个公式实现到 python 时,我真的很高兴它起作用了,因为这很抽象,而且我不习惯张量。代码看起来像这样:
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)
你可以通过一系列的减少来做到这一点,就像这样 -
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
.
我有以下问题。出于性能原因,我使用 numpy.tensordot
并因此将我的值存储在张量和向量中。
我的一项计算如下所示:
<w_j>
是w_j
的期望值,<sigma_i>
是sigma_i
的期望值。 (也许我现在应该称其为 sigma,因为它与标准偏差无关)现在为了进一步计算,我还需要方差。为了获得方差,我需要计算:
现在,当我用 numpy.tensordot
将第一个公式实现到 python 时,我真的很高兴它起作用了,因为这很抽象,而且我不习惯张量。代码看起来像这样:
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)
你可以通过一系列的减少来做到这一点,就像这样 -
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
.