八分鍾就看懂 | 推薦系統 (協同過濾) 原來這么簡單
上禮拜剛在Amazon買了TOTORO的汽車貼紙,這幾天打開Amazon都是這些相關的推薦。

哈哈,不管你是在國內,還是國外,用淘寶還是Amazon,你應該都有這種體驗吧;
有時候,哪怕你沒有買,只有瀏覽了幾樣商品,這些網站也會給你一些相關推薦。

不懂推薦系統背后原理的人,會覺得,
“哇!這原來就是傳說中的人工智能推薦啊,好了解我哦”
懂得人:“哦,這個網址,背后用的是哪個算法啊。”
今天,不管你懂不懂,八分鍾保證你看懂推薦系統背后的原理。
01 日常生活中的2種簡單的推薦方法
- 第一種就是非定制的推薦系統;
- 第二種就是定制化的推薦系統。
什么叫做非定制化的推薦系統呢?
簡單來說就是,什么最熱賣,什么關注的人多,就推薦你什么。
比如,水果店老板發現最近西瓜銷量排第一,於是呢,老板逢人就推薦西瓜。

這樣就產生一個問題了。
一個有糖尿病的老爺爺去買水果,老板也向他推薦西瓜。如果你是這位老爺爺,你肯定要不高興了吧。
“糖分這么高,還使勁推薦我這個,還是換一家吧。”

原本好好的生意,就這樣泡湯了。
老板,想了想,我是不是應該改變一下推薦方法啊。
比如,年紀大的人,我推薦獼猴桃,維生素豐富還能降血糖。小姑娘呢,可以推薦她們檸檬,美白又減肥。

上面的故事,就是平時我們日常生活中,會用到的推薦系統:
定制化的推薦系統,和非定制化的推薦系統。
02 定制化推薦系統的推薦方法
講到定制化的推薦系統里面常用的方法,一般常用的有兩大類。
第一種:協同過濾(collaborative filtering),什么是協同過濾呢,這個我們過會詳細講,因為這是目前蠻常用的推薦方法。
第二種:基於內容的推薦(content-based recommendation)。
基於內容的推薦大致是,我看了一篇關於足球的報道,之后又向我推薦了足球的相關報告。里面用的技術就是基於內容的推薦。

還有一些其他的推薦方法,比如co-occurrence,或者把幾種方法的結果都綜合組合一下的方法。
今天這篇文章,主要就是講的是推薦系統里的明星算法,也就是前面說的第一種:協同過濾 (collaborative filtering)~~
03 協同過濾是什么
協同過濾這個算法,目的就是找相似。
其中:找相似,可以是找相似的人,也可以找相似的東西。
-
比如,我們找到相似的一群人,我們就能用其中一些人喜歡的東西,推薦給另一個人;
-
找相似的東西的,如果一個人喜歡一樣東西,那么我再推薦她另一樣東西,因為這兩樣東西很相似。
講了這個兩個例子,是不是覺得協同過濾最重要的就是找相似啊,哈哈,那我們就講講這個算法的核心部分,怎么找相似。
04 協同過濾相似怎么找
我們都知道,坐標里面的兩個點,如果他們的夾角越小,那么這兩個點越相近(這里肯定有人要問為什么不是距離,這個問題后面會說)。

下面我們做個小練習,回顧一下初中知識,
- 第一張圖兩個從原點出發的點,他們之間的夾角是30度,cos𝜽是0.86;
- 第二張圖夾角是90度,cos𝜽是0;
- 第三張圖夾角是150度,cos𝜽是-0.86。
是不是發現,角度越小,cos𝜽就越接近1,角度越大,cos𝜽就越接近-1。
那找相似我們就能直接用cos𝜽的大小來描述啦。
上面這個問題,用初中知識就能算出cos𝜽。
但是現實生活的例子是很復雜的呀,比如突然從xy軸的兩維, 變成xyz的三維,或者很多維的話,算cos𝜽怎么辦?
05 相似度的計算公式
下面引出相似度的計算公式,我們舉個例子,具體講下這個公式含義。

A點坐標是(0,2,3);
B點坐標是(5,2,0)
那這兩個點的cos𝜽就是
分子: 0* 5+2* 2+3* 0 = 4
分母:sqrt(0^2 + 2^2 + 3^2) * sqrt(5^2 + 2^2 + 0^2) = 19
分子除以分母,得出來cos𝜽 = 0.21。
根據我們之前說的越相似,cos𝜽越接近於1來看。你說,A點和B點,算是接近還是不接近呢?
06 化妝品網站的推薦例子 (找相似的人user-based)
來講一個電商網站的推薦例子。
小美一直喜歡在網上買化妝品,今天晚上,她又打開了常去的網站,逛逛。
這時候,網站的主頁上,正好有一個定制化推薦廣告位,需要給小美推薦一個美妝產品。

小美呢,以前在這個網站上買過口紅,眼影和香水,還給她們評價給過分。
除了小美的購買的記錄,我們還知道,其他人的購買記錄和評分,比如小麗,小紅,小花。
我們是不是能夠利用其他人的信息,來找到小美最可能買的東西,推薦給她呢?
這樣問題變得很簡單了,只要用我們之前說的,找小美和其他所有人之間的cos𝜽,然后挑幾個最接近她的人,看她們買過什么,給的評價怎么樣,然后推薦給小美,就行了。
首先第一步,我們先產生一個表格,豎着的是人,橫着的是化妝品,里面內容是她們給的化妝品評分。

第二步,沒有評分的化妝品,我們假設這些人都打0分。
這樣4個小女孩,就變成了之前公式里的4個點。
小美(4,0,0,5,1,0,0)
小麗(5,5,4,0,0,0,0)
小紅(0,0,0,2,4,5,0)
小花(0,3,0,0,0,0,3)

根據前面的公式,我們算出來
- 相似度(小美,小麗) = 0.38
- 相似度(小美,小紅) = 0.32
- 相似度(小美,小花) = 0
這樣看下來,小美和小麗是相對比較相似的,然后是小紅。
通常情況下,我們一般會挑和小美1~3(N)個的相似的人,看他們的評價,綜合算出最后推薦給目標人群的產品。

這個例子里面,我們挑2個人,小麗和小紅,來綜合算出推薦給小美的東西。
由於7樣產品里面,小美買過3樣,有4樣還沒有買過和評價過,所以,我們只要知道,另外4樣小美可能會評價的分數,那么我們就可以挑最高的推薦給她。
利用小麗,和小紅的評價分數和她們與小美相似度,我們就能推算出小美的評價分數.
這里,我們用到的是平均加權方法。

- 小美會給粉餅的打分是 = (5 *0.38 + 0 * 0.32)/(0.38+0) = 5
- 小美會給粉餅的打分是 = (4 * 0.38 + 0 * 0.32)/(0.38+0) = 4.8
- 小美會給乳液的打分是 = (0 * 0.38+5 * 0.32)/(0+0.32) = 5
這樣粉餅和潤膚露都是5,但由於小麗和小紅的相似度最高,她給粉餅是5分,所以我們推薦粉餅給小紅。
等等!讓我們倒退到第二步開頭,
“
第二步,沒有評分的化妝品,我們假設這些人都打0分。
”

打0分合理嗎?
誰說,她們一定都會給那些沒有買過、評價過的化妝品,打0分呀。
如果一個人以前給2個產品分別打過4分,2分。
然后,我們取一個平均值:3分。把這個3分,作為沒買過東西的可能打分,是不是更合理呢?
對的,完全正確。
這個方法在統計里面我們叫做標准化。標准化,不僅解決之前說的不合理性,還能解決每個人的評價標准差異。
比如,有人自認為5分就是她的最高分,而有些人比較嚴格覺得3分就是她認為的最高分。但是,其實3分,5分,都是這些人心目中的最高分。
標准化,就解決了這個問題。
我們回到之前的表格,在沒有評分的地方,我們算出平均值填進去。比如小美的平均值就是(4+5+1)/3 = 10/3; 小麗是(5+5+4)/3 =14/3。。。

為了達到標准化每個人的評價要求差異,我們將每個人的平均值就變成以0為中心,打分低於平均分的是負的數,高於平均分為正數。
公式是(分數-平均分)。

這樣我們有了標准化的打分表,重新算一遍小美和其他人的相似度,取和她最相似的人,綜合平均她們平均打過的分數,選出小美可能會打分最高的推薦給她。

07 化妝品網站的推薦例子 (找相似的物item-based)
記得我之前說,
"
找相似,可以是找相似的人,也可以找相似的東西。
比如,我們找到相似的一群人,我們就能用其中一些人喜歡的東西,推薦給另一個人;
找相似的東西的,如果一個人喜歡一樣東西,那么我再推薦她另一樣東西,因為這兩樣東西很相似呀。
"

上面那個例子就是找相似的人,現在我們說下找相似的東西。
有一天,小美又上網閑逛了,她買過也評分過潤膚露,眼影,香水,睫毛膏,這次只剩下口紅和粉餅沒有買,那下一個該推薦給她口紅呢,還是粉餅呢?
和人人相似一樣,物物相似的表格變成了,豎過來的是化妝品,橫過來的是人。

根據之前的順序,我們算出化妝品之間的相似性,步驟也是先填平均值->標准化->算cos相似度值->挑出幾個和目標物體相似的物體-> 結合物品打分和物品相似值,綜合打分->挑出分數高的推薦給小美。
這樣,我們算出,
- 和口紅最接近的是潤膚露和睫毛膏;
- 和粉餅最接近的是眼影和香水。
根據小美打過其他產品的分數,以及這些產品和口紅、粉餅相似度,我們算出:
- 小美給口紅打分: (0.41 * 2 + 0.59 * 3)/(0.41+0.59) = 2.6
-
小美給粉餅打分: (0.47 * 5 + 0.40 * 4)/(0.47+0.40) = 4.5
粉餅大於口紅,我們推薦粉餅給小美。

08 人人相似和物物相似的推薦哪個更好
現實生活中,其實兩個都有在用。但是物物相似更常用一點。因為每個人都有自己的喜好,用的不當心,容易產生反感。
比如一個男孩子買了啤酒,薯片。一個女孩子買了口紅,啤酒,薯片。根據計算,男孩和女孩很相似,然后推薦口紅給男孩。看起來,是不是很奇怪呀?但是如果你規則定的好,人人相似,也會有很好的效果。
推薦系統里的協同過濾就是這么簡單,最后你們能猜出亞馬遜給我推薦東西的背后,用的是人人相似,還是物物相似嗎?