日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用Elasticsearch实现推荐系统

發布時間:2024/1/17 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Elasticsearch实现推荐系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聚合:找出喜歡這部電影的人們同時還喜歡哪些電影

假設你運營了一個電影網站,你有很多用戶,并且想知道如何推薦給這些用戶他們喜歡的電影。一個辦法是,把每個用戶作為一個文檔創建索引,如下所示(movies_liked被設置為被分詞的字段,并且用于搜索):

PUT recs/user/1 { "movies_liked": ["Forrest Gump", "Terminator", "Rambo", "Rocky", "Good Will Hunting"]} PUT recs/user/2 { "movies_liked": ["Forrest Gump", "Terminator", "Rocky IV", "Rocky", "Rocky II", "Predator"]} PUT recs/user/3 { "movies_liked": ["Forrest Gump", "The Thin Red Line", "Good Will Hunting", "Rocky II", "Predator", "Batman"]} PUT recs/user/4 { "movies_liked": ["Forrest Gump", "Something about Mary", "Sixteen Candles"]}

我們想給喜歡《終結者》的用戶進行推薦。也就說,我們需要知道喜歡《終結者》這部電影的用戶還喜歡哪些電影。這是非常常見的“購物籃分析” - 推薦系統的基礎組件?!百徫锘@分析”來源于分析用戶的購物籃并且統計出用戶感興趣物品間的關系。研究案例表明,通常在雜貨鋪購買尿片的人同時會選擇購買啤酒。深入洞察此類行為將有助于提升用戶和商家的價值。本文我們聚焦在《終結者》并找出對這部電影可能感興趣的潛在用戶。

利用那些存儲了用戶觀影歷史的ElasticSearch文檔,我們如何找出看過《終結者》的觀眾喜歡什么呢?立刻能想到的辦法是進行“項”的聚合。項聚合可以得出當前搜索結果中特定字段所包含的項的數量。在某些應用中項可能會是電影的ID,但是在這個案例中使用“標題”。我們將搜索“終結者”關鍵詞并聚合結果中的“movies_liked”字段從而得出觀看《終結者》的用戶同時喜歡其他電影的名稱以及數量。最終結果展示如下:

"movies_like_terminator": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "Forrest Gump","doc_count": 2}, {"key": "Rocky","doc_count": 2}, {"key": "Terminator","doc_count": 2}, {"key": "Good Will Hunting","doc_count": 1} }

通過上述的用戶記錄,你可以了解到喜歡《終結者》的用戶中有兩個人同時喜歡《阿甘正傳》,兩個人同時喜歡《洛奇》。此外,如果我們對你最喜歡的電影重復這樣的操作(搜索《終結者》或者《鐵血戰士》或者《情到深處》等你喜歡的電影),然后你會得到一些協同過濾:發起一個搜索,找到那些和你喜歡同樣電影的用戶。然后你可以比較下還未看過的電影和你喜歡的電影同時出現的次數。

但是這種簡單計數的方法是否足夠好呢?我們在其它文章中進行了討論,認為用簡單統計同時出現的次數的方法實現推薦系統是一種很差的方法。簡單計數法優先考慮的是全局的普遍關系,而不是有意義的關系。例如在這個例子中,每個人都喜歡《阿甘正傳》。如果我們用這種方法做推薦,那么每個用戶都被推薦了《阿甘正傳》。我們把這種問題稱為“奧普拉讀書俱樂部”問題,這些關系普遍存在但不是特別有用。

這里更有趣的是關于電影《終結者》的相關計數結果。以《洛奇》為例。每個喜歡《洛奇》的用戶都喜歡《終結者》,竟然有100%的重合率!換句話說,《洛奇》在有條件時(喜歡看《終結者》)出現的的比率為100%,在全局中(無條件時)出現的比率僅為50%(有2人喜歡《洛奇》,共有4人)。從這個結果來看,《洛奇》非常適合推薦給喜歡《終結者》的用戶的。

使用顯著項度量人和物之間的關系

要解決簡單計數法帶來的問題,利用顯著項來聚合是一個更好的方法。這種聚合方法度量了我們所需要的這種在統計學意義上更重要、更有意義的推薦的關系。它的作用不是計算簡單的項的計數,而是計算項在當前結果中相比于在背景語料庫中的統計顯著性。在《購物籃筐分析》一文中,我們討論了正反兩種評價顯著性的不同方法。現在,我們來探討一下顯著項能干什么。
在我們深入之前,我們先把這種方法拿出來看看:

POST recs/user/_search {"query": {"match": {"movies_liked": "Terminator"}},"aggregations": {"movies_like_terminator": {"significant_terms": {"field": "movies_liked","min_doc_count": 1}}} }

上面(與簡單計數法)唯一的的不同是我們用到了significant_term運算。為了讓這個操作在我們這個極小規模的數據集上能獲得較好的結果,我們將min_doc_count設為1(項關聯的文檔數大于等于1)。
事實上,這一查詢解決了以上的問題,我們可以發現《阿甘正傳》在推薦中沒有出現,得到的推薦顯得更合適:

"buckets": [{"key": "Rocky","doc_count": 2,"score": 1,"bg_count": 2 }, {"key": "Terminator","doc_count": 2,"score": 1,"bg_count": 2 }, {"key": "Rambo","doc_count": 1,"score": 0.5,"bg_count": 1}, {"key": "Rocky IV","doc_count": 1,"score": 0.5,"bg_count": 1}]

深入研究JLH顯著評分

到此為止了嗎?我們還需繼續研究:需要理解評分方法在你的數據上是如何工作的。你需要能夠深入了解所使用的評分方法才能建立起真正優秀的推薦系統。如何根據顯著項得到上面的排名?正如我們在《購物籃分析》一文中所見,不同形式的計分方法有它們自己的優缺點。選擇錯誤的方法可能在推薦的質量方面造成嚴重的后果。

我不打算剖析文中出現的所有顯著項(有很多項),但我們還是要深入了解這種方法來教自己如何思考這些問題。這種方法被稱為JLH。評分公式是:

(foregroundPercentage / backgroundPercentage) * (foregroundPercentage - backgroundPercentage)

“Foreground”的意思是該項在當前搜索結果中出現的百分比(檢索結果中用戶喜歡我們的電影名稱百分比)。 例如,《第一滴血》的“Foreground”在《終結者》搜索結果中占比是100%。 “Background” 是整個集合的全局百分比。例如,《第一滴血》的是50%。

JLH對普通物品的評分

你將如何評價某一個評分體系是否適合你的用例?讓我們想象幾個場景,考慮不同場景下的得分。然后,可以批判地思考他們在現實的數據中如何展示。我們繼續使用電影為例,這些數據都是假設的:分析JLH評分所用的并不是Netflix或Movielens網站上的真正數據。

第一個場景,我們已經討論過的是每個人都喜歡的電影。在我們的數據集中,這是《阿甘正傳》。99.999%的用戶喜歡《阿甘正傳》。

事實上,這種非常受歡迎的電影對JLH評分不太好。使用(Foreground / Background),《阿甘正傳》的評分是100 / 99.999,幾乎為1。同樣,(Foreground - Background)=(100 - 99.999),幾乎為0。 正如你將看到的,這是一個相當低的JLH評分。

這樣公平嗎?我認為,在大多數領域里,一個物品被接近100%的用戶喜歡是少見的。更有可能的是,很少有人對電影具有可衡量的偏好。 例如,或許每個人都喜歡《阿甘正傳》,但大多數的“喜歡”是評級或點擊(并不實際觀看),不是100%的用戶與《阿甘正傳》有交集。 當然,我喜歡《阿甘正傳》,但上次我看到它大概是10年前。 這是一個被動的偏好。 當我看到它出現在Netflix上時,我不太可能會興奮。

現實中更常見,最流行的電影或節目是有20%的用戶喜歡的東西。那么JLH的得分如何呢?比如《心靈捕手》,如果這組用戶中的100%都喜歡,那么最高得分將是(100/20)*(100-20)= 5 * 80 = 400。比《阿甘正傳》要高很多。

平均聲望的物品

大多數影片會顯示喜歡此影片用戶的百分比。讓我們來看一個平均電影:《洛奇IV》,有4%的用戶喜歡。

《洛奇IV》使用JLH評分公平嗎?如果“Foreground”的用戶中100%喜歡《洛奇IV》,我們得到(100/4)*(100 - 4)或25 * 96 = 2400。明顯超過被推薦的《心靈捕手》!

更多“正?!逼?/h2>

《心靈捕手》非常受歡迎得分400,《洛奇IV》受歡迎程度一般得分2400。似乎JLH評分方式對于推薦系統來說有些糟糕?讓我們考慮這些“最佳情況”場景的可能性。 100%的用戶喜歡一個電影的同時又喜歡另一個電影合理嗎?喜歡電影的"Foreground"概率偏離“Background”的可能性有多大?

這很大程度上取決于數據中物品偏好的相對分布。例如,人們可以說,如果你喜歡《洛奇III》,你很可能會喜歡《洛奇IV》,也許接近100%重疊。

如果你的數據集“Background”和“Foreground”的差距不大,也許這不是一個大事。 例如,讓我們考慮“Foreground”的值基于以“Background”百分比為中心的正態分布的情況。讓我們考慮“Background”和“Foreground”之間的恒定變化是大約75%的變化(《洛奇IV》大概是7 +/- 3%; 《心靈捕手》大概20 +/- 15%)。 在這些也許更現實的情況下,我們將期望得分:

《洛奇IV》最佳得分:(7/4)*(7-4)= 5.25

《心靈捕手》最佳分數:(35/20)*(35 - 20)= 26.25

第一項(除法)中兩部電影評分接近。另一項(減法)拉開了兩部電影的差距。

為什么會這樣?作為JLH的創建者,Mark Harwood指出,這正是JLH設計的目的。JLH反映了許多推薦系統數據集中看到的模式:受歡迎的物品受歡迎程度不會發生太大變化。如果幾乎每個人都買雞蛋,那么分析煎蛋商品對雞蛋銷量影響就會非常小,即便如此,我們仍然想要這些煎蛋廚師一些建議:即使只能輕微增加雞蛋的銷量也很重要。



作者:力譜宿云_LeapCloud
鏈接:https://www.jianshu.com/p/96c14cb3e210
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

總結

以上是生活随笔為你收集整理的使用Elasticsearch实现推荐系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。