原文鏈接:各種互聯網中常見的推薦算法錦集
我們在上網購物、看小說、買電影票的時候,都會遇到各種各樣的推薦,給我們推薦一些我們曾經買過或收藏過的同類型產品,或者是推薦一些我們看過的小說題材相同的小說。那這些產品推薦都是如何實現的呢?
我們今天就來聊聊這些“無聊”的算法。
在互聯網的應用中,常用的推薦算法有:協同過濾推薦算法(Collaborative Filtering Recommendation)、內容推薦算法(Content-based Recommendation)、相似性推薦算法(Similarity Recommendation)、關聯規則推薦算法(Association Rule Based Recommendaion)。不同的算法都有不同的應用場景,合理的應用這些算法,能夠為我們帶來更多的經濟效益。
協同過濾推薦算法(Collaborative Filtering Recommendation)
協同過濾算法在電子商務領域可以說是炙手可熱,很多的電商平台都是使用的它來做的自己平台的商品推薦。
啥是協同過濾呢?
簡而言之,就是找到相同興趣的群體,將這個群體中感興趣的其他信息推薦給用戶。
我們用一個簡單的例子來說明這個算法:
我喜歡看網絡小說,但是,看網絡小說最討厭的是什么?就是書荒。一本書看完了,下一本看什么呢?挨個的翻開看幾章?浪費時間。看書評吧,不是噴子就是托。
這個時候,協同過濾就有用了。
我是用戶A,我喜歡看《極品家丁》、《斗破蒼穹》、《誅仙》,這些是我的興趣。怎么定義我的興趣呢?可以是我看過超過100章的書,可以是我收藏的書,可以是我好評過的書,總之,我們要先行定義一個緯度。
我的興趣有了,其他用戶也會有同樣的興趣,當其他用戶的興趣和我的興趣相同時,就可以把這些用戶感興趣的書都推薦給我了。
具體的實施步驟如下:
我們先要建立一個大表,X軸就是我們所有的小說(從數據庫中可以獲得),Y軸就是我們所有的用戶(從數據庫中可以獲得)。

然后我們將每個用戶感興趣的小說在XY的交叉點中都標注出來(在日志中可以獲得),也就如下表示:

標注出來以后,我們就可以看到,我這個葛大爺的愛好是《極品家丁》、《斗破蒼穹》和《誅仙》,而張大爺和李大爺和我有相同的興趣愛好。而張大爺和李大爺還比我多看了一些小說,而這多出來的部分,就體現除了協同,也就可以作為對我的推薦了。

下一次,當我打開看小說的APP的時候,系統就可以向我推薦這兩本小說了,而我也就有很大的可能性去打開觀看。
內容推薦算法(Content-based Recommendation)
啥是內容推薦算法呢?
內容推薦算法,其實就是對於用戶的歷史數據進行分析,抽象出內容的共性,然后根據這些共性進行推薦的算法。
我們也舉一個例子來說明一下:
我還是喜歡看小說,我經常通過一些條件來搜索小說,我常常搜索:完本、玄幻、200萬字以上。而我搜索的行為,就成了我的歷史日志記錄。根據我的這些日志記錄進行共性的抽象,然后在根據抽象出來的共性內容去搜索小說,然后把這些小說推薦給我。
具體的實施步驟如下:
我通過搜索,選中了3本書並且進行了閱讀,而這三次我分別搜索了
玄幻、男頻、完本、200萬字以上
玄幻、男頻、完本、100-200萬字
玄幻、男頻、連載、不限

我們根據上訴內容進行抽象,可以得到一個最終的結果,就是玄幻、男頻、不限、不限的結果,根據這個結果,我們可以去進行搜索,然后按照最新更新或者小說熱度對結果集進行排序后推薦給用戶,這樣,這個結果也能夠滿足用戶的需求。
當然,如果用戶查詢的次數非常多,導致結果的精度差,我們還可以有其他的一些手段來提高精確度,例如只使用最近3天的查詢記錄或者只使用最近3次查詢記錄。
相似性推薦算法(Similarity Recommendation)
協同過濾推薦算法和內容推薦算法都是需要用戶有一定量的歷史數據,然后再根據這些歷史數據進行分析再進行推薦。
那針對新用戶應該怎么辦呢?那么相似性推薦算法就能夠解決這個問題。
啥是相似性推薦算法?
相似性推薦算法,也叫相似度推薦算法,是通過對物品的特性進行分析,然后找出類似物品進行推薦的一種算法。
在相似性算法中,有一個距離(Distance)的概念,兩者的距離越近,表示兩者相似性越高,距離越遠,則相似性越低。通過這個概念,如果我點擊了一個小說,那么系統就可以根據這個小說於其他小說的相似性高低,為我推薦合適的小說了。
而計算這個距離,又有非常多的方式,這也是相似性算法的核心。有歐幾里得距離(Eucledian Distance)曼哈頓距離(Manhattan Distance)明可夫斯基距離(Minkowski distance)余弦相似度(Cosine Similarity)等等很多種算法,我這里就不具體講算法了(我也講不明白,哈哈,大家有興趣可以自己百度)。
具體實施步驟如下:
我還是喜歡看小說,我打開了《誅仙》這本書,這本書都有些什么屬性呢?
我們為小說設置了8個屬性,也就相當於8個維度,我們將《誅仙》這本書的所有屬性作為了原點,然后通過距離算法計算這些屬性之間的距離,匯總后,總距離最近的,也就是最值得推薦的。
假設:屬性相同的距離為0,反之為1。
我們就可以得到distance = f(題材)+f(作者)+f(狀態)+……+f(類型);
我們去遍歷所有的小說,然后計算這個距離。找到一本《誅仙前傳:蠻荒行》的書。這本書的屬性有6個都與《誅仙》相同,2個不同。最后我們計算出distance為2,是距離最近的一本書,於是進行了推薦。
我們這里雖然將不同的屬性權重都假設相同了,但是在現實中,不同屬性的權重是不同的。也由於這個不是基於用戶的歷史數據來做出的推薦,因此,每個用戶的推薦結果也是相同的。
關聯規則推薦算法(Association Rule Based Recommendaion)
關聯規則推薦是電商中使用比較廣泛的一種推薦算法,最經典的一個案例就是,把啤酒放在尿布的旁邊,能夠提升啤酒的銷量。
啥是關聯規則推薦呢?
要明白關聯規則推薦,先要明白關聯規則。關聯規則就是通過對數據的挖掘和分析,找出物體與物體之間的關聯性。而關聯規則推薦就是依靠物體之間的關聯性進行的一種推薦。
我們還是用我看小說來舉例吧
當我找到一本我喜歡看的書的時候,這本書是《誅仙》,我將它加入到了我的書單中,這時,系統就為了推薦了其他幾本書(《神墓》、《盤龍》等等),告訴我也可以一起加入到書架中,這種推薦,一般就是關聯規則推薦。
關聯規則推薦是如何實施的呢?我們再來說一下具體的實施步驟:
首先,我們要找出數據進行分析。
我們把所有的書單都找到,並且將書單中的書都一一列舉出來。


然后,就開始計算關聯規則的支持度。
什么是支持度(Support)?支持度就是所有書單中,某一本書或者幾本書的組合所占的比例。例如:《誅仙》在所有的書單中都存在,那么它的支持度就是100%,《神墓》只在兩個書單中有,那么它的支持度就是40%。


單個商品的支持度我們計算出來以后,接下來我們就是需要計算多商品組合的支持度了。我們將商品兩兩進行組合,來計算支持度,只有在書單中同時出現這個組合時,才進行計算。我們這里有六本書,那么組合的數量就是15種(5+4+3+2+1=15)。

到這里,其實我們已經可以做出推薦了,我們可以將支持度高的書或組合推薦給用戶,這樣,這個書就更容易被用戶所接受。
接下來,我們就要開始計算關聯規則的置信度了。
什么是置信度(Confidence)?當用戶往書單添加《神墓》的時候,有多大的概率會去添加《盜墓筆記》呢?這個概率就是《神墓》->《盜墓筆記》的置信度。
《神墓》的支持度(S[神])為40%,《神墓》和《盜墓筆記》(S[神->盜])為20%,那么,《神墓》->《盜墓筆記》的置信度就等於50%(S[神->盜]/S[神])
最后,我們就要來分析關聯規則的提升度了
根據支持度的計算,我們發現,收藏《盤龍》書的人,100%都會去收藏《誅仙》,那么是不是說,當用戶將《盤龍》進行收藏的時候,我們去推薦《誅仙》是最好的呢?

No,不是這樣的。我們為什么要去推薦《誅仙》?那是因為我們想提高《誅仙》的閱讀量。但是,我們分析數據后發現,雖然在用戶收藏《盤龍》的時候去推薦《誅仙》,用戶100%會收藏,但是單獨推薦《誅仙》,用戶也是100%收藏。這個關聯規則推薦並不能為《誅仙》帶來更高的閱讀量,因此用戶收藏《誅仙》和收藏《盤龍》的行為是沒有直接關系的。
如何來判斷關聯規則推薦的效果呢?那就是提升度了。
我們用書A->書B的置信度,同書B的支持度做比較,進行計算:
當比值大於1時,代表在收藏書A時推薦書B是有效的;
當比值等於1時,代表在收藏書A時推薦書B是無意義的,兩者沒有關聯;
當比值小於1時,代表在收藏書A時推薦書B是無效的,不如直接推薦書B。
小結
這里只是簡單的拋磚引玉的講了一下這些算法,但是真正的內容還有很多,我也還在持續的學習當中。