ALS計算CP分解

2021-10-21 19:32:37 字數 1795 閱讀 7998

眾所周知,cp分解就是將乙個張量分解為一系列秩一張量之和

那麼在計算cp分解之前,首先我們會遇到的乙個問題就是如何確定張量的秩?也就是應該選擇多少個秩一張量來組成原始張量呢?

不幸的是,確定張量的秩是乙個np-hard問題,目前,已知的只能夠確定乙個張量秩的上界。

例如,對於乙個一般的三維張量而言,χ∈r

i×j×

k\chi\in r^

χ∈ri×j

×k, 它的秩遵循如下約束:

計算cp分解最為簡單且常見的乙個方法就是交替最小二乘法als

首先,提起cp分解,大家可能想到的是一系列秩一張量之和的形式,也就是像這張最經典的圖:

但是,在cp分解的計算過程中,大家必須掌握下面這種矩陣展開形式:

如果對於這種形式你還比較陌生,建議先去看一下這篇文章:

cp and tucker 分解

als求解:

假設χ∈ri

×j×k

\chi\in r^

χ∈ri×j

×k,並且秩為 r

rr, 那麼計算該張量的cp分解,就相當於變成了以下問題:

尋找 r

rr 個秩一張量,使得構成的張量 y

yy 與原始張量 χ

\chi

χ 最接近,也就是如下最小化問題:

因此,最為簡單的方法就是應用als,通過固定b

bb和c

cc來求解a

aa, 固定a

aa和b

bb來求解c

cc,固定a

aa和c

cc來求解b

bb,就這樣一直重複這個過程,直至滿足某些收斂準則。

例如,當b

bb和c

cc固定時,這就變成了乙個簡單的線性最小二乘問題,上面的最小化目標函式的形式也可以根據cp分解的矩陣展開形式重寫為以下這樣:

其中:那麼該問題的最優解的形式就是:

接下來,由於khatri-rao積的逆具有特殊形式:

我們可以利用這個性質,將最優解的形式改寫為:

通過這一步改寫,我們在每一步的迭代過程中就只需要計算r×r

r \times r

r×r矩陣的逆,而不是計算乙個jk×

rjk \times r

jk×r

矩陣的逆了。

在得到a尖a尖

a尖(不會打這個符號,有知道的同學告訴我一下,萬分感激)之後,通過標準化就得到了a

aa。這一步就相當於是把λ

\lambda

λ提取出來。

之後呢,就是不斷地重複這個過程,直到滿足某些收斂條件(例如,abc

abcab

c不再變化,與原始張量的距離足夠接近,或者達到了事先設定好地最大迭代輪數等等)。

以上就是利用als計算cp分解的乙個大致流程。

推薦系統ALS矩陣分解

思想類似線性回歸做 大致如下 定義乙個 模型 數學公式 然後確定乙個損失函式,將已有資料作為訓練集,不斷迭代來最小化損失函式的值,最終確定引數,把引數套到 模型中做 矩陣分解的 模型是 損失函式是 我們就是要最小化損失函式,從而求得引數q和p。矩陣分解模型的物理意義 我們希望學習到乙個p代表user...

張量分解(二) CP分解

張量分解系列 張量分解 一 基礎知識 張量分解 二 cp分解 張量分解 三 tucker分解 張量分解 四 tensor train decomposition 張量分解 五 tensorizing neural network 張量分解 六 ttrnn model for video classi...

pyspark實現ALS矩陣分解演算法

準備工作 推薦演算法例項 開啟jupyter notebook,新建乙個python3 notebook import os import sys 動態載入pyspark目錄 spark home os.environ.get spark home sys.path.insert 0,os.path...