gpt4 book ai didi

python - 在 numpy 中高效计算 parafac/CP 产品

转载 作者:太空狗 更新时间:2023-10-30 00:03:33 26 4
gpt4 key购买 nike

这道题关注的是numpy。

我有一组矩阵,它们的列数相同但行数不同。我们称它们为 A、B、C、D 等,让它们的尺寸为 IaxK IbxK、IcxK 等

我想要的是有效地计算 IaxIbxIc... 张量 P 定义如下:P(ia,ib,ic,id,ie,...)=\sum_k A(ia,k)B(ib,k)C(ic,k)...

所以如果我有两个因素,我最终会得到简单的矩阵乘积。

当然我可以通过外部产品“手动”计算这个,比如:

    def parafac(factors,components=None):
ndims = len(factors)
ncomponents = factors[0].shape[1]
total_result=array([])
if components is None:
components=range(ncomponents)

for k in components:
#for each component (to save memory)
result = array([])
for dim in range(ndims-1,-1,-1):
#Augments model with next dimension
current_dim_slice=[slice(None,None,None)]
current_dim_slice.extend([None]*(ndims-dim-1))
current_dim_slice.append(k)
if result.size:
result = factors[dim].__getitem__(tuple(current_dim_slice))*result[None,...]
else:
result = factors[dim].__getitem__(tuple(current_dim_slice))
if total_result.size:
total_result+=result
else:
total_result=result
return total_result

不过,我还是想要一些计算效率更高的东西,比如依赖内置的 numpy 函数,但是我找不到相关的函数,有人可以帮我吗?

干杯,谢谢

最佳答案

非常感谢大家的回答,折腾了一天,终于找到了解决办法,所以贴在这里记录一下

此解决方案需要 numpy 1.6 并使用 einsum,它是强大的巫毒魔法

基本上,如果你有 factor=[A,B,C,D] 和 A,B,C 和 D 矩阵列数相同,那么您将使用以下方法计算 parafac 模型:

import numpy
P=numpy.einsum('az,bz,cz,dz->abcd',A,B,C,D)

所以,一行!

在一般情况下,我会这样结束:

def parafac(factors):
ndims = len(factors)
request=''
for temp_dim in range(ndims):
request+=string.lowercase[temp_dim]+'z,'
request=request[:-1]+'->'+string.lowercase[:ndims]
return einsum(request,*factors)

关于python - 在 numpy 中高效计算 parafac/CP 产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761159/

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