2012-05-20 79 views
2

我們在matlab中有一個張量308 x 22 x 29 x 12 x 492020 它非常大。我們做了分解,它運行良好。現在我們正試圖重建它以獲得一些預測。當我們運行它時,當我們完成最後一個維度的乘法運算時,它會隨着內存不足而崩潰。我在matlab中重構分解張量

我試圖將我們的張量變成2×2矩陣,以使重建更容易。我找不到辦法,我嘗試在matlab中使用重塑函數,但沒有成功。所以基本上我想知道一種在matlab中將(308 x 22 x 29 x 12 x 492020)張量轉換爲二維矩陣的方法。

只是爲了解釋一點數據。我們有一個用戶搜索汽車的數據庫。我們想要做推薦模式。我們創建了一個有5個維度的張量:308(車型)x 22(車身類型)x 29(價格類別)x 12(製造年度)x 492020(用戶)。然後,我們運行張量分解,現在我們可以對最後一個分解的維度進行聚類,以便通過搜索對用戶進行分組,建立一些搜索日誌依賴關係。到此爲止我們都很好。現在我們想從它的分解版本中重構張量,以獲得一些可以作爲預測的新記錄。鑑於張量是巨大的,我們需要一種扁平化來重建的方法,如果有人可以分享一些關於如何做的示例matlab代碼,那將是一件好事,因爲我對matlab相對來說比較新。所以我想將5D張量轉換成2D

+3

這是1.1e12元素;如果每個都是雙倍的話那就需要8TB的內存。我認爲這是不可能的。 –

+0

我懷疑你有張量。我從來沒有聽說過一個接近這個尺寸的人。那是什麼樣的轉變? – duffymo

+0

當然它存在,我們甚至能夠沒有任何問題地分解它,花了2分鐘在高性能服務器上。 – fenix2222

回答

1

爲了估計「聚集」用戶的樣本重構誤差,您不需要重構整個張量。例如,您可以對單個用戶進行抽樣,並比較重建的切片並隨時收集統計信息。通常在機器學習中,您希望通過使用「樣本外」來交叉驗證模型 - 即從測試集中隨機分割訓練集。

我會觀察到身體類型是汽車模型的一個屬性,價格大概是每個模型的年齡(和條件)的函數。因此,在這種情況下,您確實沒有足夠的獨立尺寸。

你的492020用戶適合記憶的原因可能是因爲張量很稀疏。重組分解張量通常很密集(雖然排名降低),除非您對這些因素進行稀疏處理。無論如何,使用分解形式的計算更有效率。

我很擔心你的「做聚類」步驟 - 塔克分解是線性的(如主分量),非負張量因子分解可能更接近你想要做的事情..給每個用戶分配一個非負混合向量一些「典型」偏好。 「聚類」往往意味着難以分類,而不是模糊。

2

如果你在MATLAB變量列表中有很大的5D張量,並且你能夠訪問它的個人元素,比如說MyTensor(123,17,15,4,123456),那麼你可以做,如果你有足夠的存儲空間。我沒有處理任何大小數據的經驗,但如果您可以訪問它,那麼您可以重新構建它。如果您將所有內容全部寫入磁盤逐個元素或逐片或者超立方體的n維超片,則可以使用正在運行的數字分隔文件,然後以正確的順序從這些文件中加載和重構元素/片/超文本,那麼你會有你的2D矩陣。如果元素訪問適用於您的5D張量,我會先創建一個小5D矩陣並將其轉換爲2D矩陣,以查看維度是否按照正確的順序排列,並且只使用訪問您的巨大5D張量的方法。之後,您可以用完全相同的代碼重建您的巨大5D張量。

+0

+1我同意。我認爲,內存不足以將數據的兩個副本放在一起。所以,首先將它保存到磁盤(例如二進制)。然後逐一閱讀。你知道訂單,所以把它放在矩陣的適當位置。 – petrichor

+0

只是爲了更多地解釋數據。我們有一個用戶搜索汽車的數據庫。我們想要做推薦模式。 – fenix2222

+0

鑑於張量是巨大的,我們需要壓扁它來進行重建的一種方式,這將是很好,如果有人可以分享如何做到這一點一些示例MATLAB代碼,因爲我是比較新的MATLAB。所以我想將5D張量轉換成2D – fenix2222