高维对称随机张量 numpy/pytorch

Symmetric random tensor with high dimension numpy/pytorch

我希望创建一个随机对称张量,这样对于索引的每个排列 i1, i2,...,ik 我将有:

a[i1][i2]...[ik] = a[pi(i1)][pi(i2)]...[pi(ik)]

其中 pi 是置换函数。例如:

a[1][2][3][4] = a[1][3][2][4] = a[4][2][1][3] = ...

在 2 dim 设置中它是正常的对称性,但我不确定如何实现它(不迭代排列)或者是否有使用 numpy / pytorch 的自动方法。

据我所知,在 torchnumpy 中都没有相应的功能,但可以添加所有维度置换张量以使其在每个维度上对称。

这有:

  • O(size^dims) - 内存复杂度(使用生成器)
  • O(dims! * size^dims) - 运行时间复杂度(虽然 size^dims 是矢量化的并且应该相当快)

虽然不知道如何提高运行时间复杂度,抱歉。这是代码:

import functools
import itertools
import operator

import torch


def symmetricND(size: int, dims: int) -> torch.Tensor:
    data = torch.randn(*[size] * dims)
    return functools.reduce(
        operator.add,
        (
            torch.permute(data, permutation)
            for permutation in itertools.permutations(range(dims))
        ),
    )

和示例用法(4x4x4 对称张量):

symmetric = symmetricND(4, 3)

print(symmetric[0][1][2])
print(symmetric[2][1][0])
print(symmetric[1][2][0])
print(symmetric[1][0][2])

一般来说:运行 只要你能在记忆中保存单个张量,但可能会花费很多时间((3, 7) 在我的笔记本电脑上是即时的,(3, 9)虽然需要大约 1 分钟,但不确定这是否适合您的情况。

您还可以预先计算这些张量(或者甚至使用多台机器),保存它们并根据需要加载。