高维对称随机张量 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 的自动方法。
据我所知,在 torch
和 numpy
中都没有相应的功能,但可以添加所有维度置换张量以使其在每个维度上对称。
这有:
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 分钟,但不确定这是否适合您的情况。
您还可以预先计算这些张量(或者甚至使用多台机器),保存它们并根据需要加载。
我希望创建一个随机对称张量,这样对于索引的每个排列 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 的自动方法。
据我所知,在 torch
和 numpy
中都没有相应的功能,但可以添加所有维度置换张量以使其在每个维度上对称。
这有:
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 分钟,但不确定这是否适合您的情况。
您还可以预先计算这些张量(或者甚至使用多台机器),保存它们并根据需要加载。