gpt4 book ai didi

Python - 使用大型 NumPy 数组难以计算分区函数

转载 作者:行者123 更新时间:2023-11-28 17:49:44 26 4
gpt4 key购买 nike

我使用 itertools、lambda 函数和大型 NumPy 数组以一种非常紧凑的方式计算类 Ising 模型的配分函数。给定一个由 N 节点和 Q“状态”/节点组成的网络,我有两个数组,h-fields 和 J-联轴器,尺寸分别为 (N,Q)(N,N,Q,Q)。然而,J 是上三角的。使用这些数组,我一直在使用以下方法计算分区函数 Z:

# Set up lambda functions and iteration tuples of the form (A_1, A_2, ..., A_n)
iters = itertools.product(range(Q),repeat=N)
hf = lambda s: h[range(N),s]
jf = lambda s: np.array([J[fi,fj,s[fi],s[fj]] \
for fi,fj in itertools.combinations(range(N),2)]).flatten()

# Initialize and populate partition function array
pf = np.zeros(tuple([Q for i in range(N)]))
for it in iters:
hterms = np.exp(hf(it)).prod()
jterms = np.exp(-jf(it)).prod()
pf[it] = jterms * hterms

# Calculates partition function
Z = pf.sum()

此方法适用于小的 NQ,比如 (N,Q) = (5,2)。但是,对于较大的系统 (N,Q) = (18,3),由于内存问题,此方法甚至无法创建 pf 数组,因为它具有 Q ^N 非平凡元素。关于如何克服此内存问题或如何更改代码以在子数组上工作的任何想法?

编辑:在jf 的定义中犯了一个小错误。已更正。

最佳答案

您可以通过将 Z 初始化为 0 并在每次迭代中将其递增 jterms * iterms 来避免大型数组。但是,这仍然不能使您摆脱 Q^N 数字的计算和求和。为此,您可能需要想出一种方法来简化分区函数的代数运算。

关于Python - 使用大型 NumPy 数组难以计算分区函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com