矩陣分解之: 特徵值分解(EVD)、奇異值分解(SVD)、SVD++

 

目錄:

1.矩陣分解

    1.1 矩陣分解的產生原因

    1.2 矩陣分解作用

    1.3 矩陣分解的方法

    1.4 推薦學習的經典矩陣分解算法

2. 特徵值分解(EVD)

3. 奇異值分解(SVD)

4. SVD++

5.SVD/SVD++在協同過濾中的應用

 

1. 矩陣分解

1.1 矩陣分解的產生原因

在介紹矩陣分解之前,先讓我們明確下推薦系統的場景以及矩陣分解的原理。對於推薦系統來說存在兩大場景即評分預測(rating prediction)與Top-N推薦(item recommendation,item ranking)。

  1. 評分預測場景主要用於評價網站,比如用戶給自己看過的電影評多少分(MovieLens),或者用戶給自己看過的書籍評價多少分。其中矩陣分解技術主要應用於該場景。
  2. Top-N推薦場景主要用於購物網站或者一般拿不到顯式評分信息的網站,即通過用戶的隱式反饋信息來給用戶推薦一個可能感興趣的列表以供其參考。其中該場景爲排序任務,因此需要排序模型來對其建模。因此,我們接下來更關心評分預測任務。

對於評分預測任務來說,我們通常將用戶和物品表示爲二維矩陣的形式,其中矩陣中的某個元素表示對應用戶對於相應項目的評分,1-5分表示喜歡的程度逐漸增加,?表示沒有過評分記錄。推薦系統評分預測任務可看做是一個矩陣補全(Matrix Completion)的任務,即基於矩陣中已有的數據(observed data)來填補矩陣中沒有產生過記錄的元素(unobserved data)。值得注意的是,這個矩陣是非常稀疏的(Sparse), 稀疏度一般能達到90%以上,因此如何根據極少的觀測數據來較準確的預測未觀測數據一直以來都是推薦系統領域的關鍵問題。

其中,推薦系統的評分預測場景可看做是一個矩陣補全的遊戲矩陣補全是推薦系統的任務,矩陣分解是其達到目的的手段。因此,矩陣分解是爲了更好的完成矩陣補全任務(欲其補全,先其分解之)。之所以可以利用矩陣分解來完成矩陣補全的操作,那是因爲基於這樣的假設:假設UI矩陣是低秩的,即在大千世界中,總會存在相似的人或物,即物以類聚,人以羣分,然後我們可以利用兩個小矩陣相乘來還原它

1.2 矩陣分解作用

  • 矩陣填充(通過矩陣分解來填充原有矩陣,例如協同過濾的ALS算法就是填充原有矩陣)
  • 清理異常值與離羣點
  • 降維、壓縮
  • 個性化推薦
  • 間接的特徵組合(計算特徵間相似度)

1.3 矩陣分解的方法

  • 特徵值分解。

  • PCA(Principal Component Analysis)主成分分析,分解,作用:降維、壓縮。

  • SVD(Singular Value Decomposition)分解,也叫奇異值分解。

  • LSI(Latent Semantic Indexing)或者叫LSA(Latent Semantic Analysis),隱語義分析分解。

  • PLSA(Probabilistic Latent Semantic Analysis),概率潛在語義分析。PLSA和LDA都是主題模型,PLSA是判別式模型。

  • NMF(Non-negative Matrix Factorization),非負矩陣分解。非負矩陣分解能夠廣泛應用於圖像分析、文本挖掘和語言處理等領域。

  • LDA(Latent Dirichlet Allocation)模型,潛在狄利克雷分配模型。LDA是一種主題模型,將文檔集中每篇文檔的主題以概率的形式給出,可以用於主題聚類或者文本分類,是生成式模型。LDA作爲主題模型可以應用到很多領域,比如:文本情感分析、文本分類、個性化推薦、社交網絡、廣告預測等方面。

  • MF(Matrix Factorization)模型,矩陣分解模型。矩陣分解其實可以分爲很多種:

    1. 基本矩陣分解(Basic Matrix Factorization),basic MF分解。
    2. 正則化矩陣分解(Regularized Matrix Factorization)。

    3. 概率矩陣分解(Probabilistic Matrix Factorization),PMF。

    4. 非負矩陣分解(Non-negative Matrix Factorization),NMF。

    5. 正交非負矩陣分解(Orthogonal Non-negative Matrix Factorization)。

  • PMF(Probabilistic Matrix Factorization),概率矩陣分解。

  • SVD++

關於矩陣分解的方法大概就是上面這些。矩陣分解的主要應用是:降維、聚類分析、數據預處理、低維度特徵學習、特徵學習、推薦系統、大數據分析等。上面把主要的矩陣分解方法給列出來了,比較混亂,再給大家擺上一張矩陣分解發展的歷史:

圖1:矩陣分解發展歷史

 

1.3 推薦學習的經典矩陣分解算法

矩陣分解的算法這麼多,給大家推薦幾個經典的算法來學習:

1) 經典的主成分分析(PCA)、奇異值分解(SVD)是機器學習入門必學算法。

2)2003年提出的主題模型(LDA),在當年提出的時候,也是大紅大紫,現在也在廣泛的應用,可以學習一下。

3)概率矩陣分解(PMF),主要應用到推薦系統中,在大規模的稀疏不平衡Netflix數據集上取得了較好的結果。

4)非負矩陣分解(NMF),也很重要。非負矩陣分解及其改進版本應用到很多領域中。

2.特徵值分解(EVD)-理論推導

特徵值分解和奇異值分解在機器學習中都是很常見的矩陣分解算法。兩者有着很緊密的關係,特徵值分解和奇異值分解的目的都是一樣,就是提取出一個矩陣最重要的特徵。

1)特徵值、特徵向量

如果一個向量v是矩陣A的特徵向量,將一定可以表示成下面的形式:

其中,λ是特徵向量v對應的特徵值,一個矩陣的一組特徵向量是一組正交向量。

思考:爲什麼一個向量和一個數相乘的效果與一個矩陣和一個向量相乘的效果是一樣的呢?

答案:矩陣A與向量v相乘,本質上是對向量v進行了一次線性變換(旋轉或拉伸),而該變換的效果爲常數λ乘以向量v。當我們求特徵值與特徵向量的時候,就是爲了求矩陣A能使哪些向量(特徵向量)只發生伸縮變換,而變換的程度可以用特徵值λ表示。矩陣變換遵循:左乘是進行初等行變換,右乘是進行初等列變換。Ref:初等矩陣左乘右乘 影響矩陣行列變換

2)特徵值與特徵向量的幾何意義

一個矩陣其實就是一個線性變換,因爲一個矩陣乘以一個向量後得到的向量,其實就相當於將這個向量進行了線性變換。比如說下面的這個矩陣:

它其實對應的線性變換是圖2的形式:

圖2:矩陣M的線性變換

因爲這個矩陣M乘以一個向量(x,y)的結果是:

上面的矩陣是對稱的,所以這個變換是一個對x、y軸的方向一個拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值大於1時是拉伸,當值小於1時是縮短),如圖2所示。當矩陣不是對稱的時候,假如說矩陣是下面的樣子:

它所描述的變換是下面的樣子:

圖3:M是非對稱矩陣變換

這其實是在平面上對一個軸進行的拉伸變換,如圖3藍色的箭頭所示,藍色的箭頭是一個最主要的變換方向(變換的方向可能不止一個)。如果想要描述好一個變換,那我們就需要描述好這個變換主要的變化方向。

3)特徵值分解

對於矩陣A,有一組特徵向量v,將這組向量進行正交化單位化,就能得到一組正交單位向量。特徵值分解,就是將矩陣A分解爲如下式:

其中,Q是矩陣A的特徵向量組成的矩陣,則是一個對角陣,對角線上的元素就是特徵值。我們來分析一下特徵值分解的式子,分解得到的Σ矩陣是一個對角矩陣,裏面的特徵值是由大到小排列的,這些特徵值所對應的特徵向量就是描述這個矩陣變換方向(從主要的變化到次要的變化排列)。

當矩陣是高維的情況下,那麼這個矩陣就是高維空間下的一個線性變換,這個線性變換可能沒法通過圖片來表示,但是可以想象,這個變換也同樣有很多的變化方向,我們通過特徵值分解得到的前N個特徵向量,就對應了這個矩陣最主要的N個變化方向。我們利用這前N個變化方向,就可以近似這個矩陣變換。也就是之前說的:提取這個矩陣最重要的特徵。

總結:特徵值分解可以得到特徵值與特徵向量,特徵值表示的是這個特徵到底有多麼重要,而特徵向量表示這個特徵是什麼,可以將每一個特徵向量理解爲一個線性的子空間,我們可以利用這些線性的子空間幹很多事情。不過,特徵值分解也有很多的侷限,比如說變換的矩陣必須是方陣。

4)特徵值分解的例子

這裏我們用一個簡單的方陣來說明特徵值分解的步驟。我們的方陣A定義爲:

首先,由方陣A的特徵方程,求出特徵值。

特徵值爲(重數是2)。

然後,把每個特徵值λ帶入線性方程組,求出特徵向量。

當λ=2時,解線性方程組 

解得。特徵向量爲:

當λ=1時,解線性方程組 

。特徵向量爲:

最後,方陣A的特徵值分解爲:

特徵值特徵向量的求解還可以參考求解矩陣特徵值及特徵向量

3. 奇異值分解(SVD)-理論推導

1)特徵值分解矩陣的缺點: 只能針對方陣,但是我們要分解的大部分都不是方陣

我們前面講了很多特徵值、特徵向量和特徵值分解,而且基於我們以前學習的線性代數知識,利用特徵值分解提取特徵矩陣是一個容易理解且便於實現的方法。但是爲什麼還存在奇異值分解呢?特徵值分解最大的問題是隻能針對方陣,即n*n的矩陣。而在實際的應用中,我們分解的大部分都不是方陣。

舉個例子:

關係型數據庫中的某一張表的數據存儲結構就類似於一個二維矩陣,假設這個表有m行,有n個字段,那麼這個表數據矩陣規模就是m*n。很明顯,在絕大部分情況下,m與n是不相等的。如果這個時候要對這個矩陣進行特徵提取,特徵值分解的方法明顯就不行了。此時,就可以用SVD對非方陣矩陣進行分解。

2)奇異值分解

奇異值分解是一個能適用於任意矩陣的一種分解的方法,對於任意矩陣A總是存在一個奇異值分解:

假設A是一個m*n的矩陣,那麼得到的U是一個m*m的方陣,U裏面的正交向量被稱爲左奇異向量。Σ是一個m*n的矩陣,Σ除了對角線其它元素都爲0,對角線上的元素稱爲奇異值是V的轉置矩陣,是一個n*n的矩陣,它裏面的正交向量被稱爲右奇異值向量。而且一般來講,我們會將Σ上的值按從大到小的順序排列。上面矩陣的維度變化可以參照圖4所示。

圖4:奇異值分解中各個矩陣維度變化

思考:雖說上面奇異值分解等式成立,但是如何求得左奇異向量、右奇異向量和奇異值呢?

答案:由上面的奇異值分解等式,我們是不知道如何拆分矩陣A的。我們可以把奇異值和特徵值聯繫起來。

首先,我們將A和A的轉置做矩陣的乘法,得到一個方陣,用這樣的方陣進行特徵分解,得到的特徵和特徵向量滿足下面的等式:

這裏的 就是左奇異向量。

其次,我們用矩陣A的轉置乘以A,得到一個方陣,用這樣的方陣進行特徵分解,得到的特徵值和特徵向量滿足下面的等式:

這裏的就是我們要求的右奇異向量。

思考:上面我們說的特徵向量組成的就是我們SVD中的U矩陣 ,而的特徵向量組成的矩陣就是我們SVD中的V矩陣,這有什麼根據麼?我們來證明一下,以V矩陣的證明爲例。

上式證明中使用了。與特徵值分解  對比可以看出的特徵向量組成的矩陣就是我們SVD中的V矩陣, 的特徵向量組成的就是我們SVD中的U矩陣。

補充定義:

此外,我們還可以得到奇異值,奇異值求法有兩種:

a) 第一種:

b)第二種:

通過上面公式的證明,我們還可以看出,特徵值矩陣等於奇異值矩陣的平方,也就是說特徵值和奇異值滿足如下關係:

這裏的就是奇異值,奇異值跟特徵值類似,在矩陣Σ中也是從大到小排列。

思考:我們已經知道如何用奇異值分解任何矩陣了,那麼問題又來了,一個m*n的矩陣A,你把它分解成m*m的矩陣U、m*n的矩陣Σ和n*n的矩陣。這三個矩陣中任何一個的維度似乎一點也不比A的維度小,而且還要做兩次矩陣的乘法,這不是沒事找事幹嘛!把簡單的事情搞複雜了麼!並且我們知道矩陣乘法的時間複雜度爲。那奇異值分解到底要怎麼做呢?

補充:兩個矩陣A:m*n,B:n*p相乘,時間複雜度(O(nmp))。分析僞代碼如下:

input:int A[m,n],B[n,p]
Let C be a new matrix of the appropriate size
     for i in 1 to m    
       for j in 1 to p
           Let sum = 0  
           for k in 1 to n    
               sum += A[i,k]*B[k,j]  
           Set Cij = sum

所以兩個矩陣相乘的時間複雜度是

答案:在奇異值分解矩陣中Σ裏面的奇異值按從大到小的順序排列,奇異值從大到小的順序減小的特別快。在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上。也就是說,剩下的90%甚至99%的奇異值幾乎沒有什麼作用。因此,我們可以用前面r個大的奇異值來近似描述矩陣,於是奇異值分解公式可以寫成如下:

其中r是一個遠遠小於m和n的數,右邊的三個矩陣相乘的結果將會使一個接近A的矩陣。如果r越接近於n,則相乘的結果越接近於A。如果r的取值遠遠小於n,從計算機內存的角度來說,右邊三個矩陣的存儲內存要遠遠小於矩陣A的。所以在奇異值分解中r的取值很重要,就是在計算精度和時間空間之間做選擇。

3)SVD計算舉例

這裏我們用一個簡單的矩陣來說明奇異值分解的步驟。我們的矩陣A定義爲:

3.3 SVD分解的應用

異值分解的應用有很多,比如:用SVD解PCA、潛在語言索引也依賴於SVD算法。可以說,SVD是矩陣分解、降維、壓縮、特徵學習的一個基礎的工具,所以SVD在機器學習領域相當的重要。

1)降維。

通過奇異值分解的公式,我們可以很容易看出來,原來矩陣A的特徵有n維。經過SVD分解後,可以用前r個非零奇異值對應的奇異向量表示矩陣A的主要特徵,這樣就把矩陣A進行了降維。

2)壓縮。

通過奇異值分解的公式,我們可以看出來,矩陣A經過SVD分解後,要表示原來的大矩陣A,我們只需要存儲U、Σ、V三個較小的矩陣即可。而這三個較小規模的矩陣佔用內存上也是遠遠小於原有矩陣A的,這樣SVD分解就起到了壓縮的作用。

 

4.SVD/SVD++ 應用於協同過濾(附Python實現)

上面第二、三節完成了SVD、SVD++的理論推導,證明了要預測用戶對電影的評分,也就是補全稀疏U-I矩陣中的缺省值,但是這個矩陣稀疏度一般能達到90%,很難通過極少的觀測數據來預測缺省值,要完成矩陣補全可以通過將m*n維的U-I矩陣進行SVD/SVD++矩陣分解得到矩陣U_{m*k}V_{k*n},用這兩個小矩陣相乘來還原他,這兩個小矩陣都是稠密矩陣,可以通過訓練得到。因此接下來我們要討論的就是怎麼根據訓練樣本得到U_{m*k}V_{k*n}

4.1 奇異值分解(SVD) 

考慮CF中最爲常見的用戶給電影評分的場景,我們需要一個數學模型來模擬用戶給電影打分的場景,比如對評分進行預測。

將評分矩陣U看作是兩個矩陣的乘積:

其中,uxy 可以看作是user x對電影的隱藏特質y的熱衷程度,而iyz可以看作是特質 y 在電影 z中的體現程度。那麼上述模型的評分預測公式爲:


q 和 p 分別對應了電影和用戶在各個隱藏特質上的特徵向量。

以上的模型中,用戶和電影都體現得無差別,例如某些用戶非常挑剔,總是給予很低的評分;或是某部電影拍得奇爛,惡評如潮。爲了模擬以上的情況,需要引入 baseline predictor.

其中 μ 爲所有評分基準,bi 爲電影 i 的評分均值相對μ的偏移,bu 類似。注意,這些均爲參數,需要通過訓練得到具體數值,不過可以用相應的均值作爲初始化時的估計。

模型參數bi,bu,qi,pu通過最優化下面這個目標函數獲得:


可以用梯度下降方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定pu優化qi,然後固定qi優化pu,交替更新。梯度下降方法中參數的更新式子如下(爲了簡便,把目標函數中的μ+bi+bu+q⊤ipu整體替換爲r^ui):


其中α是更新步長。

具體代碼請參考:SVD --應用於協同過濾(附Python實現)

4.2 SVD++:

某個用戶對某個電影進行了評分,那麼說明他看過這部電影,那麼這樣的行爲事實上蘊含了一定的信息,因此我們可以這樣來理解問題:評分的行爲從側面反映了用戶的喜好,可以將這樣的反映通過隱式參數的形式體現在模型中,從而得到一個更爲精細的模型,便是 SVD++.


其中 I(u) 爲該用戶所評價過的所有電影的集合,yj爲隱藏的“評價了電影 j”反映出的個人喜好偏置。收縮因子取集合大小的根號是一個經驗公式,並沒有理論依據。

模型參數bi,bu,qi,pu,yj通過最優化下面這個目標函數獲得:


與SVD方法類似,可以通過梯度下降算法進行求解。

具體代碼請參考:SVD應用於協同過濾改良版之SVD++(附Python實現)

具體訓練步驟:

1.首先根據統計數據對矩陣U、V,bi,bu,y進行初始化

2.根據已知參數計算評分預測值p

3.根據誤差,利用隨機梯度下降法 對參數進行更新。

 

Ref:

SVD與SVD++  https://www.cnblogs.com/nolonely/p/7337619.html

SVD應用於協同過濾改良版之SVD++(附Python實現)  https://zhuanlan.zhihu.com/p/42269534

推薦系統之矩陣分解家族 https://zhuanlan.zhihu.com/p/35262187

機器學習中SVD總結  https://mp.weixin.qq.com/s/Dv51K8JETakIKe5dPBAPVg

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章