这个问题关注numpy。numpy有效计算parafac/CP产品
我有一组矩阵,它们共享相同数量的列并具有不同的行数。让我们称他们为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的功能,但我无法找到相关功能,有人可以帮助我吗?
干杯,感谢
它确实是强大的伏都教,甚至运行的速度是我制作的 – Jaime
的两倍。你有没有比较过这个版本的速度与原来的?我尝试使用四个阵列形状(10,3),(24,3),(15,3)和(75,3)。您的原始版本大约需要2ms,使用'einsum'的版本大约需要7.5ms。 –
看起来爱因斯确实从多核架构中受益,而我的原始东西没有。此外,我已经通过实验注意到它的扩展性更好(真正感兴趣的情况相当于数千行的矩阵和50列的矩阵)。我会试试这个 – antoine