2016-09-28 22 views
14

Tôi đang cố gắng phân tích ma trận 3D bằng thư viện python scikit-tensor. Tôi quản lý để phân hủy Tensor của tôi (với kích thước 100x50x5) thành ba ma trận. Câu hỏi của tôi là làm thế nào tôi có thể tạo ma trận ban đầu một lần nữa bằng cách sử dụng ma trận phân hủy được tạo ra với hệ số Tensor? Tôi muốn kiểm tra xem sự phân hủy có ý nghĩa gì không. Mã của tôi là như sau:Tái tạo một Tensor sau khi hệ số tensor

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) 

Tôi đang sử dụng phân tích kinh điển như được cung cấp từ hàm scikit-tensor library cp_als. Ngoài ra kích thước mong đợi của ma trận bị phân hủy là gì?

+0

cp.py nói: $ Một \ approx \ sum_ {r = 1}^{xếp hạng} \\ vec {u} _r^{(1)} \ outer \ cdots \ outer \\ vec {u} _r^{(N)} $. Bạn đã thử chưa Điều này phải giống hệt với "P.totensor()" – Bort

+0

@Bạn có nghĩa là các dòng 145 và 146 của cp.py không? –

Trả lời

6

Sản phẩm CP, ví dụ, 4 ma trận

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

thể được thể hiện bằng Einstein notation như

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

hoặc trong NumPy như

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

nên ở bạn trường hợp r bạn sẽ sử dụng

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

hoặc, trong trường hợp 3-ma trận của bạn

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

sktensor.ktensor.ktensor cũng có phương thức totensor() thực hiện chính xác này:

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

Hey Nils cảm ơn câu trả lời. Bạn có chắc về điều này? Tôi đã cố gắng soạn lại ma trận và kết quả không gần với thiết bị căng thẳng. –

+0

Vâng, nó phụ thuộc vào cách tốt nhất bạn có thể phân hủy tensor ở nơi đầu tiên. Nếu epsilon của bạn to thì cả hai sẽ khác biệt đáng kể. –

+0

Các tham số ngoại trừ số thứ nguyên tiềm ẩn mà tôi có thể xử lý trong trường hợp thuật toán cp_als là gì? –

Các vấn đề liên quan