2016-09-28 85 views
14

Python kitaplığı scikit-tensor'u kullanarak bir 3D matrisini ayrıştırmaya çalışıyorum. Tensor'umu (100x50x5 boyutlarında) üç matris haline getirmeyi başardım. Sorum şu: Tensör katsayısı ile üretilen ayrıştırılmış matrisi kullanarak ilk matrisi nasıl yeniden oluşturabilirim? Ayrışmanın bir anlamı olup olmadığını kontrol etmek istiyorum.Tensör çarpanlanmasından sonra bir Tensör yeniden oluşturun

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) 

Ben scikit-tensör kütüphane işlevi cp_als sağlanan olarak Kurallı bir oluşuma kullanıyorum: Kodum şudur. Ayrıştırılmış matrislerin beklenen boyutsallığı nedir?

+0

cp.py diyor: $ A \ approx \ sum_ {r = 1}^{rank} \\ vec {u} _r^{(1)} \ dış \ cdots \ dış \\ vec {u} _r^{(N)} $. Bunu denedin mi? Bu, "P.totensor()" – Bort

+0

@Bort ile aynı olmalıdır, cp.py'nin 145 ve 146 çizgilerini kastediyorsunuz? –

cevap

6

örneğin, CP Ürün olan 4 matrisler

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

çok Einstein notation

olarak

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

veya Numpy içinde
numpy.einsum('az,bz,cz,dz -> abcd', A, B, C, D) 

kullanılarak ifade edilebilir senin içinde r durumda size

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

sktensor.ktensor.ktensor da tam olarak yapan bir yöntem totensor() var senin 3-matris durumunda,

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

kullanır veya bu:

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

Hey Nils cevap için teşekkürler. Bundan emin misin? Matrisi yeniden oluşturmaya çalıştım ve sonuç intensor tensörüne yakın değildi. –

+0

Eh, tensörün ilk etapta ne kadar güzel ayrışabileceğine bağlı. Eğer epsilon büyükse, ikisi fark edilir derecede farklı olacaktır. –

+0

cp_als algoritması durumunda kullanabileceğim gizli boyut sayısı dışındaki parametreler nelerdir? –

İlgili konular