眾所周知,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...