2016-09-28 19 views
14

Próbuję rozłożyć macierz 3D przy użyciu biblioteki Pythona scikit-tensor. Udało mi się rozłożyć mój Tensor (o wymiarach 100x50x5) na trzy macierze. Moje pytanie brzmi: jak mogę ponownie skomponować matrycę początkową, używając rozłożonej matrycy wytworzonej przy użyciu faktoryzacji Tensor? Chcę sprawdzić, czy dekompozycja ma jakiekolwiek znaczenie. Mój kod jest następujący:Ponownie skomponuj tensor po faktoryzacji z tensorem

import logging 
from scipy.io.matlab import loadmat 
from sktensor import dtensor, cp_als 
import numpy as np 

//Set logging to DEBUG to see CP-ALS information 
logging.basicConfig(level=logging.DEBUG) 
T = np.ones((400, 50)) 
T = dtensor(T) 
P, fit, itr, exectimes = cp_als(T, 10, init='random') 
// how can I re-compose the Matrix T? TA = np.dot(P.U[0], P.U[1].T) 

Używam rozkład kanoniczny, zgodnie z scikit-tensorowych cp_als funkcji biblioteki. Jaka jest oczekiwana wymiarowość rozłożonych matryc?

+0

cp.py mówi: $ A \ approx \ sum_ {r = 1}^{rank} \\ vec {u} _r^{(1)} \ outer \ cdots \ outer \\ vec {u} _r^{(N)} $. Czy próbowałeś tego? Powinno to być identyczne z "P.totensor()" – Bort

+0

@ Czy masz na myśli linie 145 i 146 cp.py? –

Odpowiedz

6

Preparat CP, na przykład, cztery matryce

X_{abcd} = \displaystyle\sum_{z=0}^{Z}{A_{az} B_{bz} C_{cz} D_{dz} + \epsilon_{abcd}}

może być wyrażona za pomocą Einstein notation jak

X_{abcd} = A_{az} B_{bz} C_{cz} D_{dz} + \epsilon_{abcd}

lub numpy jak

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

tak w Tobie r przypadek należałoby użyć

numpy.einsum('az,bz->ab', P.U[0], P.U[1]) 

lub, w przypadku 3-macierzy

numpy.einsum('az,bz,cz->abc', P.U[0], P.U[1], P.U[2]) 

sktensor.ktensor.ktensor również metodę totensor() który robi dokładnie to:

np.allclose(np.einsum('az,bz->ab', P.U[0], P.U[1]), P.totensor()) 
>>> True 
+0

Hej Nils dziękuje za odpowiedź. Jesteś tego pewien? Próbowałem ponownie skomponować matrycę, a wynik nie był bliski tensorowi głównemu. –

+0

Cóż, to zależy od tego, jak ładnie możesz rozłożyć tensor w pierwszej kolejności. Jeśli twój epsilon jest duży, te dwa będą zauważalnie różne. –

+0

Jakie są parametry oprócz numeru ukrytego wymiaru, który mogę obsłużyć w przypadku algorytmu cp_als? –

Powiązane problemy