從對推薦一無所知到作過幾個推薦系統,再到完成一個推薦系統生態框架的設計,以爲是時候沉澱下來一些知識,而後繼續找好吃的。《推薦系統隨便談》系列將從最簡單的推薦系統提及,並隨着業務需求增多和認識深刻來複雜化系統設計,中間偶爾分享一些其餘人的設計思路。框架
推薦,你們最熟悉的就是亞馬遜的「看了這件商品的用戶還看了」,「購買了這件商品的用戶還購買了」,例子夠簡單易懂吧。實際上推薦能夠認爲是搜索的補充,搜索是用戶的一種主動行爲,目標十分明確,只是不知道答案,須要搜索引擎告訴我。而推薦目的在於用戶不知道本身明確的需求時,告訴用戶你可能喜歡某些東西。OK,有構建搜索引擎或推薦引擎經驗的同窗可能會發現他們的聯繫其實很是密切,後文再說這些複雜的地方。工具
回到亞馬遜的例子,實際上咱們能夠簡單地創建起一個相似亞馬遜的推薦引擎,這裏我們說是《推薦系統隨便談》系列的v1.0系統把。只須要統計每一個商品與其餘商品的同時被購買或瀏覽次數,按多到少排序,就能夠獲得某個商品的共同購買列表(商場大媽都會啊!)。是的,我們小白最粗暴的解決方案就是從表面上學人家這樣搞。。oop
item_co_occurrence = {} item_co_occurrence["A"] = {} item_co_occurrence["A"]["B"] = 2 item_co_occurrence["A"]["C"] = 1 item_co_occurrence["A"]["D"] = 3 item_co_occurrence["B"] = {} item_co_occurrence["B"]["A"] = 2 item_co_occurrence["B"]["D"] = 1 item_co_occurrence["C"] = {} item_co_occurrence["C"]["A"] = 1
若是你真這樣作,那麼問題就來了。。。大媽神氣地對經理說,我算出來的結果是,買了XXX的用戶還購買的最多的商品是塑料袋!媽蛋,坑爹麼這是@&#¥%.....若是簡單的統計共同出現,那麼很容易會被熱門物品或者常見並無做用的物品佔據了你的候選推薦前幾位。性能
稍微聰明的同窗會說,我得加個預處理,把你說的熱門物品或者常見且沒有做用的物品,好比裝東西的塑料袋給刪了。看起來是正確的,可是你要怎麼刪才合理?搜索引擎
這時候搞過搜索引擎的同窗站出來講,咱們作文本處理時關鍵詞提取的思想好像能夠複用?「常見且沒有做用的物品」其實就是「停用詞」,「熱門」但對總體沒有貢獻的物品也同樣能夠經過tf-idf來計算獲得。是的,百度一下tf-idf,你會發現次數計算只是其中一個步驟而已。因此實際上計算兩兩物品相關信息時能夠採用更加科學的方法,如互信息,類tf-idf,餘弦距離等,固然也須要考慮自身數據是否有特殊分佈。spa
通過預處理和屢次調整計算公式,大媽信心滿滿的把工具給了苦逼碼農,說:我跑出來效果不錯,拿去用吧!可是碼農實際使用時發現確實肉眼看效果還能夠,可是我一個事務,或者說一個交易可能有10+個商品,我這樣搞單機怎麼跑那麼多的東西啊!!大媽摔桌子(╯‵□′)╯︵┻━┻說:媽蛋,作個東西又要效果又要效率!!那你就搞幾臺破機器一塊兒跑啊。大媽一言道出真諦,讓碼農想起了Hadoop神器!!把大媽的程序用Map-Reduce過程來改造,map過程枚舉,sort按字母序排,reduce過程merge計數。設計
恩,初版推薦系統完成!雖然效果和性能都很是銼,可是感謝大媽指導!你們期待下大媽用更好的方法來解決問題把。code