推薦系統應用---電影類

假設MovieRecommendation.com是一個爲互聯網用戶提供電影推薦的網站(下面成爲MR),這個網站只提供電影的鏈接而不提供電影的內容展示。(這個是和hulu,土豆等一些視頻網站不同的地方)

在開始介紹整個網站之前,我們先假設我們擁有豐富的數據源,和許多正版的數據提供商有合作關係。

這個網站和推薦系統有關的包括以下幾個部分:

1、數據倉庫

搭建數據倉庫的作用就是爲了方便網站在提供服務以及進行數據挖掘的時候可以很方便地取到一定格式的數據。

MR的數據倉庫主要包括:

  • 用戶的評分矩陣
  • 推薦系統計算出來的預測評分矩陣
  • 電影的meta data
  • 用戶興趣模型
  • 電影的相似度矩陣
  • 用戶行爲數據
  • 用戶的相似度矩陣

2、推薦系統部分

針對這個網站的特點,考慮到cold start 的問題,我們可以準備兩個推薦系統。

(1)基於collaborative filtering的推薦系統

推薦系統的輸入項是從數據倉庫中取出的用戶評分矩陣(一個非常非常稀疏的矩陣),輸出項爲預測評分矩陣(這個矩陣是個稠密矩陣,因爲是用推薦算法計算之後得到的預測值來填充的矩陣)。

網站剛剛開始的時候,我們主要採用svd算法計算出用戶的預測評分矩陣,然後將這個結果作爲輸入,用item-based cf計算出的預測評分矩陣作爲最終的結果,存到數據倉庫中。

當數據很多的時候,要用user-based cf來計算相似用戶以及和其他算法混合推薦,以增加結果的豐富性。

(2)基於內容的推薦系統

因爲考慮到系統的cold start問題,所以要做一個基於內容的、和用戶行爲無關的、可以離線計算好後“一勞永逸”的基於內容的推薦系統。

首先,從數據倉庫中提取出電影的meta data做聚類,電影的tag(流派、演員、導演、時間等等)作爲聚類的維度,用rock算法對數據進行聚類。

聚類之後,在各類中分別利用這些tag作爲計算相似度的數值指標計算出電影的相似度矩陣,這個是一個上三角矩陣,所以存儲也可以省掉一半空間。

然後,將電影的相似度矩陣存入數據倉庫中,並定期地更新這些矩陣。

3、用戶行爲轉化系統

用戶在使用網站的時候會產生大量的行爲,這些行爲會反映出很多的信息,比如他們對某一部電影的喜好或者厭惡,比如他們對我們的推薦結果的滿意度。

在這裏,我們會用到的用戶行爲會有:

  • 搜索
  • 瀏覽
  • 評分
  • 評論
  • 收藏
  • 分享
用戶行爲轉化系統的作用是將用戶產生的大量行爲量化處理,轉換爲用戶對這個item喜好程度的數據表達。
這中間可能會有很多不到位的地方,比如:一個用戶他搜索一個關鍵詞得到若干頁面後,他點擊了其中的一個頁面,我們是認爲他喜歡還是不喜歡這個item呢?只有評分和評論是最最靠得住的數據,而收藏和分享次之,但也比較有說服力。而瀏覽和搜索的說服力最差。
另外,還有一個問題就是,不同的行爲轉換爲分數的尺度不一致,需要做一個歸一化處理。

4、反饋系統
這個系統的作用是爲了評估推薦系統的推薦效果。
評價一個推薦系統效果好壞的指標有很多種,但在實際的應用中可能更關注的是轉化率(尤其是電商)。
對於我們的網站,轉化率體現在用戶對推薦的電影表示喜歡,他可能評了很高的分數,可能給了一個好評,也可能將這部電影分享到了新浪圍脖。但很多時候,中國的網民並不喜歡作反饋,尤其是他喜歡你的這個推薦結果的時候。但往往是,如果他不喜歡,他會反饋給你一句話,你的網站好爛啊,從此就不再訪問了。
另外,在做論文謀學位的童鞋常常用到的是誤差,將系統的數據分爲訓練集和測試集(前者佔90%,後者佔10%)。
通過用訓練集的數據訓練自己的算法,然後做出推薦,然後和測試集來作比較求誤差。(MAE或者RMSE)
不斷地迭代上述過程,得到最佳的參數,比如svd降維降多少,kNN中取前多少個k等等很多參數。
這裏,我們會用兩種方式來做反饋系統。
從數據倉庫中取出數據後,用誤差指標不斷地優化算法的各種參數,用轉化率作爲評價指標。
如果在做的時候發現,推薦的效果不佳的話,可以考慮加入新的算法做A/B test,以確定哪種算法更有效。

5、用戶興趣模型建立
當用戶不斷地產生數據,建立一個用戶的興趣模型就顯得非常必要。
用戶的興趣是個時間和興趣向量的多元函數。
用戶的興趣可以用幾個帶有權值的關鍵詞來描述,可以寫成行向量和列向量的乘積,行向量是各個興趣的權重,列向量是各個興趣。興趣向量可以通過統計用戶喜歡的電影中的關鍵詞來得到。其實在產品展示的時候可以用標籤雲來說明。(每個標籤就是用戶的興趣,標籤的大小代表權重)
另外,用戶的興趣還是時間的函數,因爲興趣這種東西是隨着時間而慢慢變化的。
用戶興趣模型建立好之後,很容易帶來經濟回報。道理很簡單,你知道某個人喜歡什麼,你投放的廣告自然就會很精準。

下面來模擬用戶使用網站的情況:

當一個用戶在新浪圍脖上看到了我們的網站MovieRecommendation,點擊進入,經過簡單地註冊之後,用戶需要輸入幾個他喜歡的詞,比如搞笑,驚悚,湯姆克魯斯等等。然後用戶會進入一個問答環節。我承認問答環節,總是很讓人討厭,但聰明的產品經理會把這個問答環節做得非常的棒。
在問答環節,用戶會看到一個像自動播放的電子相冊的東西,每張圖片上會顯示一部電影的詳細情況,包括電影的海報,電影的名字,電影的導演和演員,電影的簡介,最最重要的是,有一個問題,包括兩個選項:
  • 您給這個電影打個分唄(後面是五顆星,即:用戶可以打1-5分)
  • 太可惜了,您沒看過這部電影?那請點擊我。
提供哪些電影是很講究的,你需要從基於內容的聚類後得到的各個簇中隨機選擇若干很hot的電影。記得,電影一定要多樣化,而且每個簇都準備幾部備用的,但不宜過多,因爲用戶如果發現你給他看的電影都是他沒看過的,他一定不和你玩了。
經過這一步,我們就會得到這個用戶對幾個簇中的電影的評分。這一步,在某種意義上緩解了下cold start的問題。

用戶從問答環節中解脫出來以後,他會看到目前最火的電影列表(來自於大衆化的推薦結果)
他可能會點擊某個電影頁面進行瀏覽,當他點開後他會看到和這部熱片相似的若干電影(因爲剛剛開始的時候cf不能很好的工作,所以推薦結果會用基於內容的推薦。)
用戶也可能會搜索某部電影,如果他搜索到了的話,那非常好,但一旦他沒有搜索到這部電影的話,我想我們不應該傻傻地對他說,抱歉,您找的電影我們沒有。(這個時候,聰明的做法是:您好,我們已經記錄好您的搜索需求,當我們擁有了這個電影的時候,會第一時間聯繫您)

網站運營了一段日子了,也積累起大量的用戶,我們擁有很多的數據之後,
當用戶打開某個頁面,他可能會看到:
  • 和這個電影相似的電影有。。。
  • 看過這個電影的人還看過。。。
  • 誰也看過這個電影。。。
  • 您可能喜歡這些電影。。。
這些美妙的結果正是因爲cf算法發揮了作用。
這個時候,網站也具有了社交性,通過cf可以算出具有相同taste的用戶羣。
爲用戶推薦的結果更加豐富。

當然,用戶可以在自己的個人主頁上看到自己的興趣向量,以標籤雲的形式展現出來。

好了,下面說說推薦系統在線上是怎麼工作的。

1、猜你喜歡的電影
  • 針對目標用戶,服務器從數據倉庫中提取該用戶在預測評分矩陣的那一行中的前30部電影和分數(按預測分數),形成一個粗糙的推薦列表
  • 因爲列表中有用戶明顯表達過喜歡的或者看過的或者他很討厭的電影,所以要對那個列表進行過濾。
  • 然後對上一步得到的列表進行排序輸出到前臺展示。
2、相關電影
  • 針對目標電影,服務器從數據倉庫中提取該電影在電影相似矩陣中的前8部電影(按相似度排序)

好了,以上就是這個虛構的電影推薦網站的所有內容。
我個人感覺,
  • 數據的積累和數據倉庫的搭建是最最重要的基礎工作。
  • 對用戶行爲數據的分析是最大的技術難點。
  • 當然,如果你的網站做大了,海量數據本身就是個巨大的挑戰。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章