這篇文章介紹的主要內容有:
1、使用基於項目的協同過濾構建一個簡單的推薦系統
2、利用SVD來提高推薦系統的效率
3、推薦系統面臨的挑戰
在上一篇文章中已經介紹過了基於用戶、基於項目的協同過濾以及基於內容的過濾。基於用戶的協同過濾,用戶相似度的計算會隨著用戶的增加而增加。
一、基於物品的協同過濾
上面是11個用戶對於10部電影的評價,我們通過其他用戶對電影的評價,來預測用戶沒有看過的電影(評價為0)。實現的效果是,輸入用戶的編號(下標),輸出用戶排名前3最有可能喜歡的電影(用戶沒有評價過的電影),以及預測的評分,電影相似度的計算採用餘弦相似度。整個程序由兩部分組成,第一部分是根據用戶的下標和電影的下標,返回預測用戶對電影的評分。第二部分輸出用戶評價最高的三部電影和評分。
通過傳入電影數據和電影名稱列表以及用戶的下標,就可以預測用戶評分最高的電影是哪些。通過上面的電影數據集可以發現,電影數據矩陣中存在很多的0,其實這也符合實際情況,如果數據更多,矩陣中的0可能會更多。通過SVD來提高推薦的效果。
二、使用SVD提高推薦效果
通過對比發現,基於SVD獲取的評分電影和之前的電影評分略有不同。如果想要比較預測評分的MAE值,可以試著對已知評分進行預測,對比兩個預測評分的MAE值進行評價。先對於沒有使用SVD的協同過濾推薦系統而言,我們只是更改了預測電影評分中的電影之間的相似度的計算。在使用SVD的電影推薦系統中,先對電影數據進行SVD分解,然後通過根據特徵值的平方,取前5個包含整個矩陣能量90%的特徵值(矩陣的能量為累加特徵值的平方和),通過左奇異矩陣和前5個特徵值所構成的對角矩陣,將原始的電影評分矩陣11×10壓縮為10×5,來減少數據中的噪聲,提高推薦效率。
三、推薦系統面臨的挑戰
1、如何來提高推薦系統的運行速度?
在上面的電影推薦系統中,每次運行推薦程序的時候,都需要做SVD分解。從上面的數據來看,做SVD分解的時候,感覺不出什麼。如果,對於大型數據的做SVD分解的時候,會降低程序的速度。而且,每次進行推薦的時候都需要計算物品之間的相似度。我們可以將第一次通過的SVD分解,計算出物品之間的相似度時,將結果進行保存。如果需要再次使用相似度的時候,只需要調用第一次保存的相似度即可。間隔一定時間,需要重新計算相似度來更新保存的相似度。
2、當數據不夠時,如何來保證推薦系統的正常運行?
在使用協同過濾算法設計推薦系統的時候,是需要基於大量的數據,如果數據不夠多的時候可能會導致系統不能夠正常的運行,這個問題也被稱之為冷啟動(cold-start)。對於冷啟動問題,我們可以使用基於內容的推薦,當數據達到一定量的時候,在使用協同過濾進行推薦。
閱讀更多 機器學習之路 的文章