R

如何執行 SVD 來估算缺失值,一個具體的例子

  • May 27, 2016

在應用 SVD 之前,我已經閱讀了有關如何處理缺失值的精彩評論,但我想通過一個簡單的示例了解它是如何工作的:

       Movie1 Movie2 Movie3
User1     5             4
User2     2      5      5
User3            3      4
User4     1             5
User5     5      1      5

鑑於上面的矩陣,如果我刪除 NA 值,我最終將只有 User2 和 User5。這意味著我的U將是 2 × k。但如果我預測缺失值,U應該是 5 × k,我可以將其與奇異值和V相乘。

你們中的任何人都會通過首先刪除具有缺失值的用戶然後應用 SVD 來填充上面矩陣中的缺失值嗎?請對您應用的程序提供一個非常簡單的解釋,並使您的答案實用(即數字乘以另一個數字給出答案)而不是使用過多的數學符號。

我已閱讀以下鏈接:

stats.stackexchange.com/q/33142

stats.stackexchange.com/q/31096

stats.stackexchange.com/q/33103

SVD 僅針對完整矩陣定義。因此,如果您堅持使用普通 SVD,您需要在之前填寫這些缺失值(SVD 本身不是一種插補算法)。您引入的錯誤有望被您的矩陣分解方法消除(一般假設:數據是由低秩模型生成的)。

像你想做的那樣刪除完整的行是很糟糕的。即使將缺失值設置為零也會更好。

有許多插補策略,但在這種情況下,我會用列平均值(或者可能是行平均值)來插補。這基本上是您在第二個鏈接中推薦的策略。

       Movie1 Movie2 Movie3
User1   5             4
User2   2      5      5
User3          3      4
User4   1             5
User5   5      1      5

變為(列均值;電影的平均得分)

       Movie1 Movie2 Movie3
User1   5      3      4
User2   2      5      5
User3   3      3      4
User4   1      3      5
User5   5      1      5

還有一點:你應該預處理數據。至少從所有值中減去平均值!

看看這個介紹。它提到了 impute+SVD 方法,還討論了更直接的缺失值建模。但在這種情況下,使用了其他算法。

引用自:https://stats.stackexchange.com/questions/214900

comments powered by Disqus