文章轉自公衆號【機器學習煉丹術】,關注回覆「煉丹」便可得到海量免費學習資料哦!算法
最近找工做的時候發現,機器學習算法工程師每每和推薦算法 相關聯,以前對推薦算法並不瞭解,因此如今我也是零基礎入門一下推薦算法。這篇文章是我我的的學習筆記。
app
協同過濾推薦算法是誕生最先,最爲基礎的推薦算法。 算法經過對用戶歷史行爲數據的挖掘發現用戶的偏好,基於不一樣的偏好對用戶進行羣組劃分並推薦品味類似的商品。機器學習
協同過濾算法分爲兩類:學習
其實我一開始對這個協同過濾 的概念不太瞭解,直到看了collaborative這個單詞的釋義,就是兩個物體同時出現的頻率。
大數據
基於用戶的協同過濾算法是經過用戶的歷史行爲數據 發現用戶對商品或內容的喜歡,例如(商品的購買,收藏,內容評價或者分享內容等)。根據不一樣用戶對相同商品或者內容的態度和偏好程度計算用戶之間的關係。在有相同喜愛的用戶之間進行商品推薦。網站
換句話說 , 假如A和B用戶都購買了一樣的三本書,而且都給出了5星好評,那麼就認爲A和B是同一類用戶。而後把A購買的另一本書推薦給B。編碼
如今考慮一種最簡單的狀況,5個用戶都購買了兩種商品,而後並對商品進行打分,以下圖:
spa
最簡單的方法就是畫圖,加入用商品1的評分做爲Y軸,商品2的評分做爲X軸,那麼就能夠獲得下面的散點圖:
3d
常見的想法能夠用歐幾里得距離來衡量用戶之間的類似度。blog
除了用歐氏距離來衡量,皮爾遜相關度是另外一種計算用戶間關係的方法。如今考慮下面這一種更加複雜、也更加接近真實場景的數據:
其實呢?皮爾遜相關係數其實就是兩個變量之間的協方差和標準差的比值:
再換一個寫法,就是下面這個公式:
對於這個,並不陌生。皮爾遜相關係數在-1到1之間。0表示不相關,1表示極強正相關,-1表示極強負相關。
如今來簡單計算一下上面例子中,用戶A與用戶B之間的皮爾遜相關係數。
\(\mu_A=(3.3+6.5+2.8+3.4+5.5)/5=4.3\)
\(\mu_B=(3.5+5.8+3.1+3.6+5.1)/5=4.22\)
\(\sum^n_{i=1}(X_i-\bar{X})(Y_i-\bar{Y})=7.49\)
\(\sum^n_{i=1}(X_i-\bar{X})^2=10.34\)
\(\sum^n_{i=1}(Y_i-\bar{Y})^2=5.428\)
\(r=\frac{7.49}{\sqrt{10.34}\sqrt{5.428}}=0.99978\)
剩下的Pearson相關係數以下:
假設咱們爲用戶C推薦商品,先檢查類似度列表,發現用戶C和D、E的pearson係數較高。因此認爲這三個用戶有相同的偏好,因此對C推薦D和E買過的商品。可是不能推薦商品1~5,由於這些用戶C已經買過了。
如今咱們找到了用戶D和E買過的其餘的商品A,B,C,D,E,F。而後讓用戶D和E與用戶C的類似度做爲權重 ,計算他們給這些商品打分的加權分數。而後給C按照加權分數從高到低進行推薦。
已經講完了基於用戶的協同過濾算法。這個算法依靠用戶的歷史行爲數據來計算類似度,因此是須要必定的數據積累 ,這其中涉及到冷啓動問題。 對於新網站或者數據量較少的網站,通常會採用基於物品的協同過濾方法。
其實這個和基於用戶的方法很想,就是把商品和用戶互換。經過計算不一樣用戶對不一樣物品的評分得到物品間的關係。而後根據物品間的關係對用戶進行類似物品的推薦。
因此這裏咱們一開始的數據能夠寫成這個樣子:
而後計算出物品之間的相關係數:
假設咱們要給用戶C推薦商品。
在基於用戶的算法中,咱們的流程是:推薦給用戶C->尋找與用戶C相同愛好的用戶->尋找這些用戶購買的其餘商品的加權打分。
如今基於物品的算法中,咱們的流程是。發現用戶C購買了商品4和5,找到一樣購買了4和5商品的其餘用戶123.而後找到其餘用戶123購買的新商品A、B、C
計算獲得商品4和5與新商品ABC之間的相關度。
而後進行加權打分排序。
如上圖,協同算法中,左邊的\(m\times n\)的矩陣中,m表示樣本的數量,n表示商品的數量。矩陣的數值表示用戶對某一個商品的喜愛程度,分數越高表示越喜歡這個物品。0表示沒有買過該商品。
【整個協同過濾包括兩個過程】
【User-based & Item-based】
User-based的基本思想就是用戶A喜歡物品a,用戶B喜歡物品abc,用戶C喜歡物品ac,那麼使用以相關係數爲衡量的最近鄰算法,能夠把用戶C當成用戶A的最近的鄰居,而從推薦給A商品c。
Item-based的基本思想是現根據歷史數據計算物品之間的類似性,而後把用戶喜歡的相相似的物品推薦給用戶。由於咱們知道喜歡a的用戶也喜歡c,因此推斷出物品a和c很是類似,這樣能夠給購買過商品a的用戶推薦商品c。
【User-based缺陷】
而Item-based的話,能夠預先在線下先計算衝不一樣商品之間的類似度,而後把結果存在表中,推薦的時候直接查表。
這個就是差值平方的和的開方。
這個就是以前詳細講解的相關係數。
經過計算兩個向量之間的夾角來計算物品的類似度。由於不一樣的用戶可能有不一樣的性格,可能有一我的給什麼東西打分都很高,另一我的給什麼東西打分都低,這樣的話使用Pearson係數會斷定這兩我的偏好不一樣,而向量餘弦會更加關注用戶給不一樣商品打分的相對狀況。
(PS:其中分子爲兩個向量的內積,即兩個向量相同位置的數字相乘。)
餘弦的優點在於關注相對打分,可是這也是他的缺點。女生相對於籃球,更喜歡足球一些。男生也是如此。難道咱們能說男生女生的喜愛一致嗎?咱們是不能推薦運動用品給這樣的女生的。然而餘弦類似度看不到這些,由於它只關注相對打分。
假設女生給籃球足球打分(1,2),男生打分(8,9)
【cosine】
\(\frac{1*8+2*9}{\sqrt{5}\sqrt{64+81}} \approx 0.9656\)
而Adjective Cosine是讓數值減去物品打分的均值,讓低於平均水平的打分變成負數。這下子向量的方向一下有一個巨大的改變。籃球的均分4.5,足球的均分5.5
【Adjecitve Cosine】
\(\frac{(1-4.5)*(8-5.5)+(2-4.5)*(9-5.5)}{\sqrt{(1-4.5)^2+(2-4.5)^2}\sqrt{(8-5.5)^2+(9-5.5)^2}} \approx -0.945\)
一會兒就把差距體現出來了。
能夠看的出來,餘弦類似度存在必定的問題,因此建議使用調整餘弦類似度與Pearson。
【Adjective Cosine VS Pearson】
以前提到了預測過程(預測用戶給爲打分的商品的打分狀況。)
對用戶已經打分的物品的分數進行加權求和,而權值天然是各個物品與預測物品之間的類似度,而後再除以總權重值得和便可。