2010-11-20 110 views
17

請耐心等待我的寫作,因爲我的英文不夠精通。作爲程序員,我想了解在推薦系統或相關係統下實現的算法或機器學習智能。例如,最明顯的例子就是亞馬遜。他們有一個非常好的推薦系統。搞懂:如果你喜歡這個,你也可能會喜歡,或別的東西,如:像在一起的人佔多大比例。如何實現推薦引擎?

當然,我知道亞馬遜是一個大網站,他們投入了大量的人力和財力到這些系統中。但是,在最基本的核心上,我們如何在數據庫中實現類似的東西?我們如何確定一個對象與其他對象之間的關係?我們如何建立一個處理這種事情的統計單位?

我很感激,如果有人可以指出一些算法。或者,基本上,指出我們都可以學習的一些很好的直接參考/書籍。謝謝你們!

+0

亞馬遜的[專利](http://www.google.com/patents/US7113917)詳細介紹了他們的方法。 – arao6 2015-05-02 16:11:27

回答

18

是2種不同類型的推薦引擎。

最簡單的是基於項目的,即「購買產品A的顧客也購買了產品B」。這很容易實現。存儲稀疏對稱矩陣nxn(其中n是項目的數量)。每個元素(m [a] [b])是任何人購買物品'a'以及物品'b'的次數。

另一種是基於用戶的。那就是「像你這樣的人經常喜歡這樣的事情」。這個問題的一個可能的解決方案是k均值聚類。即構建一組集合,其中類似品味的用戶被放置在同一集羣中並基於同一集羣中的用戶提出建議。

更好的解決方案,但更復雜的解決方案是一種稱爲限制玻爾茲曼機器的技術。有對他們的介紹here

+4

@ HTA:@dan_waterworth繪製的「客戶相似性」和「產品相似性」之間的區別是推薦引擎策略中最基本的分界線。 然而,「限制玻爾茲曼機器」和「k均值聚類」應該被視爲「你想使用的任何機器學習技術」的替身。 客戶相似度或產品相似度都可以用矩陣來完成,並且可以用A.I來完成。/stats/M.L.你可以閱讀關於維基百科的內容。 – isomorphismes 2011-03-09 08:56:16

3

第一次嘗試看起來是這樣的:

//First Calculate how often any product pair was bought together 
//The time/memory should be about Sum over all Customers of Customer.BoughtProducts^2 
Dictionary<Pair<ProductID,ProductID>> boughtTogether=new Dictionary<Pair<ProductID,ProductID>>(); 
foreach(Customer in Customers) 
{ 
    foreach(product1 in Customer.BoughtProducts) 
     foreach(product2 in Customer.BoughtProducts) 
      { 
       int counter=boughtTogether[Pair(product1,product2)] or 0 if missing; 
       counter++; 
       boughtTogether[Pair(product1,product2)]=counter; 
      } 
} 

boughtTogether.GroupBy(entry.Key.First).Select(group.OrderByDescending(entry=>entry.Value).Take(10).Select(new{key.Second as ProductID,Value as Count})); 

首先,我計算多久每對產品被一起買的,然後我通過產品組他們選擇前20名的其他產品,就買。結果應該放入產品ID鍵入的某種字典中。

這可能會變得太慢或爲大型數據庫花費太多內存。