この質問はnumpyに焦点を当てています。
すべて同じ数の列を共有し、異なる数の行を持つ行列のセットがあります。それらを A、B、C、D などと呼び、それらの寸法を IaxK、IbxK、IcxK などとします。
私が望むのは、次のように定義された IaxIbxIc... tensor P を効率的に計算することです: P(ia,ib,ic,id,ie,...)=\sum_k A(ia,k)B(ib,k)C (ic,k)...
したがって、因子が 2 つある場合は、単純な行列積になります。
もちろん、次のような外積を使用してこれを「手で」計算できます。
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関数に依存するなど、計算効率がはるかに高いものが欲しいのですが、関連する関数が見つかりません。誰かが私を助けてくれますか?
乾杯、ありがとう