這幾天我對推薦引擎感興趣,我想在這方面提高自己。我目前正在閱讀「Programming Collective Intelligence」我認爲這是關於這個主題的最好的書,來自O'Reilly。但我對如何實現引擎沒有任何想法;我的意思是「不知道」是「不知道如何開始」。在我看來,我有一個像Last.fm這樣的項目。如何創建我自己的推薦引擎?
- 哪裏做(應該在數據庫端或後端執行)我開始創建 推薦引擎?
- 需要什麼水平的數據庫知識?
- 是否有任何可用於幫助或任何資源的開源軟件?
- 我應該做的第一步是什麼?
這幾天我對推薦引擎感興趣,我想在這方面提高自己。我目前正在閱讀「Programming Collective Intelligence」我認爲這是關於這個主題的最好的書,來自O'Reilly。但我對如何實現引擎沒有任何想法;我的意思是「不知道」是「不知道如何開始」。在我看來,我有一個像Last.fm這樣的項目。如何創建我自己的推薦引擎?
我已經建立了一個自己的視頻門戶。我的主要想法是收集關於一切的數據:
接下來我創建了函數,它返回上面每個點的(id,weight)元組列表。有些人只考慮有限數量的視頻(例如,最後50人),有些人通過例如評分,標籤計數(更常被標記=表達不足)來修改權重。有跡象表明,返回下面的列表功能:通過全文檢索
這些都將通過視頻ID的權重只是總結合併成一個列表,T母雞按重量分類。這對於大約1000個視頻現在非常有效。但你需要做後臺處理或極端緩存,以便迅速。
我希望我可以儘快將它降低到通用推薦引擎或相似度計算器,並作爲rails/activerecord插件發佈。目前它仍然是我的項目中很好的一部分。
爲了給一個小提示,在Ruby代碼它看起來像這樣:
def related_by_tags
tag_names.find(:all, :include => :videos).inject([]) { |result,t|
result + t.video_ids.map { |v|
[v, TAG_WEIGHT/(0.1 + Math.log(t.video_ids.length)/Math.log(2))]
}
}
end
我會感興趣的其他人如何解決這樣的算法。
這已經成爲一顆寶石了嗎? – 2012-05-17 02:45:04
Apperently沒有,該項目被凍結,我想它會永遠持續...... :-(所以,除非會有另一個項目對我來說,這使得利用這一點,我可能不會 – hurikhan77 2012-05-27 15:47:03
拆分出來。@ hurikhan77我在一個類似的音樂推薦引擎上工作,我對選擇數據庫感到困惑,我想過的是將靜態數據存儲在關係數據庫中,並且用戶事件(比如play等)存儲在Elastic-search中並處理它。 – Gaurav 2015-03-25 15:58:58
這真的是一個非常大的問題,所以即使我能給你一個詳細的答案,我懷疑我會有時間......但我有一個建議,看看格林·林登的博客和他的關於基於項目的協作過濾的論文。 Greg在亞馬遜使用基於項目的方法實現了推薦引擎的想法,他真的知道他的東西,他的博客和論文非常可讀。
博客:http://glinden.blogspot.com/ 紙:http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344(恐怕你需要登錄全讀它,因爲你是一個CS的學生,這應該是可能的)。
編輯 你也可以看看Infer.Net,它們包括建立一個推薦系統對電影數據的例子。
最近由Filmaster.com發佈了開源(AGPLv3許可)示例推薦引擎。它以C++編寫,並使用作爲Netflix挑戰一部分生成的白皮書中的最佳實踐。關於它的文章,可以發現:http://polishlinux.org/gnu/open-source-film-recommendation-engine/ 和代碼是在這裏:http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp
提出建議可以在可劃分爲兩個主要部分:
特徵提取對於推薦的對象非常具體。例如,對於音樂,對象的某些功能可能是歌曲的頻率響應,功率,流派等。用戶的功能可能是年齡,位置等。然後,您爲每個用戶創建一個矢量,歌曲與矢量的各種元素對應於不同的感興趣的特徵。
執行實際建議只需要經過深思熟慮的特徵向量。請注意,如果您不選擇正確的功能,您的推薦引擎將失敗。這就像要求你根據我的年齡告訴我我的性別。當然,我的年齡可能會提供一些信息,但我認爲你可以想象更好的問題。無論如何,一旦你有每個用戶和歌曲的特徵向量,你將需要培訓推薦引擎。我認爲最好的方法是讓大量用戶進行人口統計測試,然後告訴你他們喜歡的特定歌曲。在這一點上,你有你需要的所有信息。你的工作是根據你所掌握的信息繪製一個決策邊界。考慮一個簡單的例子。你想預測一個用戶是否喜歡AC/DC的基於年齡和性別的「Back in Black」。想象一下顯示100個數據點的圖表。 x軸是年齡,y軸是性別(1是男性,2是女性)。黑色標記表示用戶喜歡這首歌,而紅色標記表示他們不喜歡這首歌。我的猜測是,這個圖表可能會有很多與男性和年齡在12到37歲之間的用戶相對應的黑色標記,而其餘的標記將是紅色的。所以,如果我們要手動選擇一個決策邊界,那麼這個區域就是一個矩形,它佔據了大部分黑色標記。這就是所謂的決策邊界,因爲如果一個全新的人來找你並告訴你他們的年齡和性別,你只需要在圖表上畫出他們,並詢問他們是否屬於這個框。
所以,這裏最困難的部分是找到決策邊界。好消息是你不需要知道如何做到這一點。你只需要知道如何使用一些常用工具。你可以看看使用神經網絡,支持向量機,線性分類器等。再次,不要讓大牌騙你。大多數人不能告訴你這些事情真的在做什麼。他們只知道如何插入並獲得結果。
我知道這有點遲,但我希望這可以幫助任何人在這個線程上絆倒。
我有一個2部分的博客基於協作過濾的推薦引擎在Hadoop中實現。
http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/
http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/
這裏是該開源項目 https://github.com/pranab/sifarish
隨意如果你喜歡它使用GitHub的倉庫。
你的背景是什麼?你已經知道如何編程?用什麼語言?什麼是你的重點 - 我會猜測後端的邏輯,但如果你也想要頁面看起來不錯,這是一個額外challgenge ;-) – 2009-09-10 21:37:47
我是cs學生我有良好的知識c,c + +,java和c#上網站方面我有數據庫中間的MySQL和一個小oracle的PHP。 – 2009-09-10 21:40:22
您需要的是一些軟件工程知識,例如如何引出和分析需求。如果你知道你真的想要什麼,其他技術已經不再是問題了。 – 2011-12-25 01:15:44