天天看點

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

推薦系統

這個部落格我們讨論一個有用的算法,也就是大家感興趣的能變現的算法----推薦算法。

現在,當我們浏覽網頁的時候,伺服器都會記錄使用者的行為,來分析我們的喜好并且推薦相關的資訊。

舉個例子吧,電影評分~~~

假設,我們營運了一家視訊點播網站,就類似愛奇藝、優酷。在這種網站裡面,使用者會對電影、電視劇等的進行評分,

一般都是1星到 5 星的。覺得好看就給五星,覺得不好看就給 1 星之類的。而且這個評分對于這種網站而言還都挺重要

的。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

我們列出了五部電影,如上圖。同時,我們有四個使用者,将它們分别編号成1,2,3,4。

那麼這些都是我們的資料,為了能夠更好地表達我們這裡的這個問題,我們需要引入一些符号。

我們的資料主要是兩類:愛情片和動作片,然後兩類使用者,如上圖。

那麼推薦系統的問題定義就是,給定了這樣的資料 r(i,j) 和 y(i,j),我們需要對于所有這些沒有被評價的電影(上圖?)

預測特定使用者對于特定電影的評分可能是多少。在這個例子中,我們的樣本很少——電影隻有五部,使用者隻有四位,

而且大多數使用者都對大多數電影進行了評分,不過在實際中,每個使用者可能隻對一小部分電影進行過評價,畢竟作為

一家視訊網站,我們一定會有非常多的影片,而我們的任何一個特定的使用者都隻能看過其中一小部分。

是以,需要開發一個推薦系統,能夠自動地幫我們把這裡面的缺失值填補起來,這樣我們就可以看看使用者還沒有看過

哪些電影,然後根據我們預測的評分來為使用者進行推薦。也就是我們需要預測使用者感興趣的電影,然後把這些電影推

薦給使用者。

如何開發推薦算法?

基于内容推薦

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

基于内容的推薦:

對于我們之前的資料集。要怎麼預測(?)的值是多少呢?我們假設對于每一部電影,我們有關于它們的一些特征。

比如說,每個電影都有兩個特征(愛情/動作)。那麼,每一部電影就都可以表示成一個向量。

為了做出預測,我們可以針對每一個使用者,把它對不同元素的電影的評分看作是一個獨立的線性回歸問題。

是以,我們就需要對每一個使用者計算出它們對電影特征的喜好程度,也就是做一次線性回歸,這樣我們就可以了解每

一個使用者對不同電影元素的喜好程度,那麼對于使用者沒有看過的影片,我們隻需要簡單地計算一下電影元素及使用者喜

好程度的内積就可以預測出使用者對這部電影的評分。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統
[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統
[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

求使用者電影權重參數的過程,如上圖,參考監督學習。

基于内容的推薦算法,實際上跟我們已經讨論過的監督學習算法中的線性回歸本質上是一樣的,在這裡我們同樣有

特征資料,也有标注資料,也就是使用者對看過電影的評分,要做的也是對于使用者沒有看過的電影進行評分預測。不

過這裡面有一個很重要的假設,那就是我們對電影能夠很好地抽取出一些能夠表現使用者喜好的特征元素,比如我們

例子中說的愛情元素以及動作元素。但實際上,這種電影的特征一般都很難提取。怎麼辦呢?

協同過濾

基于上述問題,我們來讨論一種不太需要建構特征的一種推薦算法,這種算法----”協同過濾”。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

這裡是我們電影評分資料集。我們先前假設對于每部影片,都有兩個特征來表示電影的愛情因素和動作因素的強度,

我們需要找人來對這些影片進行标注才能獲得這些特征。當然,這樣做必然會耗費很多的人力物力,也很費時間。而

且通常,我們除了想要有這兩個特征,可能還會想要更多其他的特征。是以,如果靠人來對這些資料進行标注以得到

特征的話,幾乎是不可能的。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

那麼,我們稍微改變一下解決這個問題的思路。例如,有一個資料集,不知道它們的特征值。比如,這裡的資料,我

們知道使用者對于一些電影的評分,但是我們對于這些電影可能一無所知,我們不知道這些電影有多浪漫,也不知道這

些電影有多少動作成分。是以,我們這裡把電影的所有特征都表上問号。

稍稍改變一下我們原先的假設,比如現在我們對使用者進行了訪談,得到了使用者對于愛情元素和動作元素的喜愛程度(

就是電影特征參數 θ1, θ2...)。

這樣,對于每一個使用者 j,我們都知道他對不同電影元素的喜好程度,這樣,我們其實就可以推算出每一部電影的愛情

特征取值大約是多少,動作特征取值大約是多少,不關心電影名,隻知道誰喜歡這部電影,誰不喜歡。而且我們也知道

每個人對不同特征的喜好程度,那麼就可以大緻推斷出電影在不同特征上的強度了。是以對于x(1),x1可能就是1,x2

就是0。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統
[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

之前讨論了基于内容的推薦,剛才又讨論了如何根據使用者喜好來預測電影的特征。那麼我們将二者結合起來就可以得到

一個全新的算法。

這就是協同過濾的最基本的算法。

協同過濾,通俗講就是,當我們執行這個算法的時候,我們通過一群使用者得到的資料,這些使用者實際上在高效地進行了

協同合作,隻要使用者對電影進行評分,那麼他實際上就是在幫助算法更好地學習出電影的特征,經過幾次對電影的評分,

那麼系統也就會更加清楚使用者的偏好,這樣就産生了一個良性的循環,使得整個系統對使用者推薦的影片越來越好,同時

也使得對使用者的喜好刻畫得越精确。

在沒有電影特征資訊及使用者對電影特征喜好程度資訊的情況下,怎麼去自動地去學習這兩組資料?

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

我們可以先随機初始化x,然後求出一個θ,然後再求x,然後再求θ,這樣循環往複,疊代式地做。實際上,我們可以

有更加高效地算法,讓我們不需要不斷地來回疊代式地求解θ和x。而是可以同時把θ和x求出來。

簡單地說,我們要做的其實就是把兩個目标函數放在一起,然後同時求解x和θ。是以,我們定義了J函數,如上圖。它

依然是一個代價函數,它的參數是我們的特征x以及參數θ,它本質上就是上面兩個目标優化函數的和。

新定義的J,如果保持x不變,最小化θ,就是第一個式子;如果保持θ不變,求解x,就是第二個式子。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

這就是協同過濾算法。當然,在現實使用地推薦系統中,還有非常多地其他細節,而不僅僅是按照我們這種做法就可以

完全可以勝任一個商業化的推薦系統。但對于推薦而言,我們這裡讨論的協同過濾是一種基礎、經典的算法。它給我們

最大的啟發在于,我們在應對某些問題的時候,即使在沒有特征的時候也可以開展工作,我們可以利用僅有的使用者對影

片的評分就估計出影片的特征以及使用者對于特征的喜好程度。

低秩矩陣分解

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

如何向量化地來實作協同過濾?

我們也讨論一下,利用學習出來的電影特征,我們怎麼找到跟某部電影最相似的其他電影。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統
[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

均值标準化

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

為什麼要在推薦算法中使用均值标準化?

我們來考慮一個這樣的例子:我們有一個使用者,他沒有對任何一部影片評分,那麼加上我們之前的四位使用者——張三、

李四、王二、麻子。我們現在增加了一個使用者,劉五,他對任何一部影片都沒有評過分。我麼來看看在這種情況下,

協同過濾算法會對這個使用者做什麼?

他對每部電影的評分都是0,這似乎不太合理。

[Python嗯~機器學習]---機器學習推薦系統簡述推薦系統

為了解決這種問題,均值标準化。

我們首先要做的就是,計算每一部影片的平均得分,我們把它存在一個新的向量μ中。是以,第一部影片,有兩位用

戶打了5分,兩位打了0分,是以它的平均評分是2.5分。同樣第二部電影也是2.5分,這麼一直下去,最後一部的平均

分是1.25。

那麼,接下來,我們會将使用者的評分,全部減去對應影片的平均得分。

這樣做了以後,每部電影的評分的均值就變成了0。

那麼再接下來,使用這個均值标準化以後的資料來進行協同過濾,也就是我們不再使用原始的使用者評分資料來學習電

影的特征和使用者喜好的參數,而是用這個新的資料來學習參數θ和特征x。

本質上就是對于沒有資訊的使用者,用平均分來推薦

協同過濾就講完了~~~

繼續閱讀