我試圖將矩陣A(m,r),B(n,r)和C(k,r)分解一個張量(m,n,o)。這就是所謂的PARAFAC分解。 Tensorly已經做了這種分解。使用np.tensordot的矩陣Khatri產品
一個重要的步驟是乘以A,B和C以獲得形狀張量(m,n,o)。
Tensorly做到這一點,如下所示:
def kt_to_tensor(A, B, C):
factors = [A, B, C]
for r in range(factors[0].shape[1]):
vecs = np.ix_(*[u[:, r] for u in factors])
if r:
res += reduce(np.multiply, vecs)
else:
res = reduce(np.multiply, vecs)
return res
不過,我使用的是包(Autograd)不支持np.ix_
操作。因此我寫了一個更簡單的定義如下:
def new_kt_to_tensor(A, B, C):
m, n, o = A.shape[0], B.shape[0], C.shape[0]
out = np.zeros((m, n, o))
k_max = A.shape[1]
for alpha in range(0, m):
for beta in range(0, n):
for delta in range(0, o):
for k in range(0, k_max):
out[alpha, beta, delta]=out[alpha, beta, delta]+ A[alpha, k]*B[beta, k]*C[delta, k]
return out
但是,事實證明,這個實現也有一些autograd不支持的方面。但是,autograd確實支持np.tensordot
。
我想知道如何使用np.tensordot
來獲得這個乘法。我認爲Tensorflow的tf.tensordot
也會有類似的功能。
預期的解決方案應該是這樣的:
def tensordot_multplication(A, B, C):
"""
use np.tensordot
"""
我很驚訝你的'ix_'評論。這已經是很長一段時間了。 'reduce'可能需要在PY3中導入。 – hpaulj
@hpaulj:Numpy確實支持這些。但是,Autograd不允許使用.ix_來計算漸變。請參閱:https://github.com/HIPS/autograd/issues/210 –
'ix_'只是Divakar第一種方法所做的維度擴展。 'reduce'應用乘法部分。 – hpaulj