精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

500行SQL快速實現UCF

開發 前端
UCF通常是User-base Collaborative Filter的簡寫;大體的算法思路是根據用戶行為計算相似群體(鄰居),為用戶推薦其鄰居喜好的內容;感覺是不是很簡單、那廢話不多說先擼個SQL。

[[381092]]

寫在前面話

UCF通常是User-base Collaborative Filter的簡寫;大體的算法思路是根據用戶行為計算相似群體(鄰居),為用戶推薦其鄰居喜好的內容;感覺是不是很簡單、那廢話不多說先擼個SQL。

SQL

  1. select uid1,uid2,sim 
  2. from ( 
  3.     select uid1 
  4.         ,uid2 
  5.         ,cnt12 / sqrt(cnt1*cnt2) sim 
  6.         ,row_number() over(partition by uid1 order by cnt12 / sqrt(cnt1*cnt2) desc) sim_rn 
  7.     from ( 
  8.         select a.uid uid1 
  9.             ,b.uid uid2 
  10.             ,count(a.iid) cnt12  
  11.         from tb_behavior a 
  12.         join tb_behavior b 
  13.         on a.iid = b.iid 
  14.         where a.uid <> b.uid 
  15.         group by a.uid,b.uid 
  16.     ) a12 
  17.     join (select uid,count(iid) cnt1 from tb_behavior group by uid) a1 
  18.     on a12.uid1 = a1.uid 
  19.     join (select uid,count(iid) cnt2 from tb_behavior group by uid) a2 
  20.     on a12.uid1 = a2.uid 
  21. ) tb_neighbour 
  22. where sim > 0.1 and sim_rn <= 30 

讀者實現的話只需要把上面的tb_behavior表替換成自己業務的用戶行為即可;iid,uid分別對應物品id和用戶id;

根據共現相似度,即共同喜好的物品個數比上各自喜好物品總數乘積取平方;最后截斷用戶最相似的前30個鄰居作為推薦的依據。

上面構造了鄰居表,下面就是根據鄰居的喜好為用戶推薦了,具體sql如下:

  1. select uid1,iid 
  2. from ( 
  3.     select uid1 
  4.         ,iid 
  5.         ,max(sim) score 
  6.         ,row_number() over(partition by uid1 order by max(sim) desc) user_rn 
  7.     from tb_neighbour a12 
  8.     join (select uid,iid from tb_behavior) a2 
  9.     on a12.uid2 = a2.uid 
  10.     join (select uid,collect_set(iid) iids1 from tb_behavior group by uid) a1 
  11.     on a12.uid1 = a1.uid 
  12.     where not array_contaions(iids1,a2.iid) 
  13.     group by uid1,iid 
  14. ) tb_rec 
  15. where user_rn <= 500 

這里說明下包括上面的top30鄰居和用戶top500的最大推薦列表都是工程優化,截斷節約些存儲;具體讀者可以根據自己業務需要進行設置;

然后大概說下各個表的含義:a1表是用戶已消費過的物品,a2表是用戶每個鄰居喜好的物品;那么也就是說從鄰居喜好的物品中過濾掉已經消費的

物品整體根據共現相似度進行排序。

思考

但思路很簡單、實際作者開發中總會遇到各種各樣的問題,下面就撿幾個主要的和大家一起討論下:

  • 1.join引起的數據傾斜問題:tb_neighbour表很大,往往熱點物品會占據80%的曝光和消費記錄,如何解決?
  • 2.增量更新問題:上面的框架,tb_behavior表每次都是全量計算,是否能改造成增量更新鄰居表和推薦結果,并減少計算時間呢?

join引起的數據傾斜問題

先思考問題1,既然我們目的是求相似鄰居,物品join只是為了關聯上一組用戶對,那自然的想法是可以根據feed做近似采樣、相似度精度也幾乎無損失。

下面我試著實現下這種思路:

  1. with tb_behavior_sample as ( 
  2.     select uid,iid  
  3.     from ( 
  4.         select uid 
  5.             ,iid 
  6.             ,row_number() over(partition by iid order by rand()) feed_rn 
  7.         from tb_behavior 
  8.     ) bh 
  9.     where feed_rn <= 50000 
  10. )  
  11.  
  12. select uid1,uid2,sim 
  13. from ( 
  14.     select uid1 
  15.         ,uid2 
  16.         ,cnt12 / sqrt(cnt1*cnt2) sim 
  17.         ,row_number() over(partition by uid1 order by cnt12 / sqrt(cnt1*cnt2) desc) sim_rn 
  18.     from ( 
  19.         select a.uid uid1 
  20.             ,b.uid uid2 
  21.             ,count(a.iid) cnt12  
  22.         from tb_behavior_sample a 
  23.         join tb_behavior_sample b 
  24.         on a.iid = b.iid 
  25.         where a.uid <> b.uid 
  26.         group by a.uid,b.uid 
  27.     ) a12 
  28.     join (select uid,count(iid) cnt1 from tb_behavior group by uid) a1 
  29.     on a12.uid1 = a1.uid 
  30.     join (select uid,count(iid) cnt2 from tb_behavior group by uid) a2 
  31.     on a12.uid1 = a2.uid 
  32. ) tb_neighbour 
  33. where sim > 0.1 and sim_rn <= 30 

這里用了hive的with as語法,讀者可自行查閱,篇幅有限,就不展開了;feed_rn就是隨機采樣了50000條,實際操作時讀者可以先統計下item的分布、大概找到一個閾值;

比如取top10的item的出現次數作為閾值;那計算相似度時分子最多減小10,分母不變。這對大多數情況精度應該足夠了,而且因為避免了數據傾斜,大大降低了計算時間。

增量更新問題

問題2是一個工程問題,lambda架構能使初始結果效果不錯,可直接上線灰度了;在此基礎上再加小時或者天增量;kappa架構相對就比較繁瑣、需要一開始就設計增量流程。

精度方面也需要一定的累積;不過如何選擇,讀者可以根據自己的數據量和熟悉程度自行選擇;作者這里僅以kappa架構說明。

重新review上面sql,我們發現我們僅需要記錄下cnt12,cnt1,cnt2,iids1這些計算關鍵即可,其中iids2是用戶鄰居喜好的物品數組;數值類型可累加更新、

數組類型合并起來比較麻煩,一種解決方案是注冊UDF;這里采取另一種這種的方案:把iids1合并成字符串,過濾的時候再分割為字符串數組。

  1. with tb_behavior_sample_incr as ( 
  2.     select uid,iid  
  3.     from ( 
  4.         select uid 
  5.             ,iid 
  6.             ,row_number() over(partition by iid order by rand()) feed_rn 
  7.         from tb_behavior_incr 
  8.     ) bh 
  9.     where feed_rn <= 50000 
  10. )  
  11.  
  12. insert overwrite table tb_neighbour 
  13. select uid1,uid2,sim 
  14. from ( 
  15.     select uid1 
  16.         ,uid2 
  17.         ,sum(cnt12) / sqrt(sum(cnt1)*sum(cnt2)) sim 
  18.         ,row_number() over(partition by uid1 order by sum(cnt12) / sqrt(sum(cnt1)*sum(cnt2)) desc) sim_rn 
  19.     from ( 
  20.         select uid1,uid2,cnt12,cnt1,cnt2 
  21.         from tb_neighbour 
  22.         union all 
  23.         select a.uid uid1 
  24.             ,b.uid uid2 
  25.             ,count(a.iid) cnt12  
  26.             ,cnt1 
  27.             ,cnt2 
  28.         from tb_behavior_sample_incr a 
  29.         join tb_behavior_sample_incr b 
  30.         on a.iid = b.iid 
  31.         where a.uid <> b.uid 
  32.         group by a.uid,b.uid  
  33.     ) a12 
  34.     join (select uid,count(iid) cnt1 from tb_behavior_incr group by uid) a1 
  35.     on a12.uid1 = a1.uid 
  36.     join (select uid,count(iid) cnt2 from tb_behavior_incr group by uid) a2 
  37.     on a12.uid1 = a2.uid 
  38.     group by uid1,uid2 
  39. ) tb_neighbour 
  40. where sim > 0.1 and sim_rn <= 30 

其中tb_behavior_sample_incr,tb_behavior_incr是相應tb_behavior_sample,tb_behavior的增量表;使用union all和group by聚合相同用戶對的結果

kappa架構初次計算即是增量,不斷累積每次增量的結果更新tb_neighbour;相當于lambda初始全量計算的一種回放,直至追到最新的時間分區。

  1. insert overwrite table tb_user_consume 
  2. select uid,substring_index(concat_ws(",",collect_list(iids1)),",",10000) iids1  
  3. from ( 
  4.     select uid,concat_ws(",",collect_set(cast(iid as string))) iids1 
  5.     from tb_behavior_incr 
  6.     union all 
  7.     select uid,iids1 
  8.     from tb_user_consume 
  9. ) a 
  10. group by uid 
  11.  
  12. select uid1,iid 
  13. from ( 
  14.     select uid1 
  15.         ,iid 
  16.         ,max(sim) score 
  17.         ,row_number() over(partition by uid1 order by max(sim) desc) user_rn 
  18.     from tb_neighbour a12 
  19.     join (select uid,cast(iid as string) iid from tb_behavior_incr) a2 
  20.     on a12.uid2 = a2.uid 
  21.     join (select uid,split(iids1,",") iids1 from tb_user_consume) a1 
  22.     on a12.uid1 = a1.uid 
  23.     where not array_contaions(iids1,a2.iid) 
  24.     group by uid1,iid 
  25. ) tb_rec 
  26. where user_rn <= 500 

使用tb_user_consume緩存用戶最近消費的前10000條記錄,將用戶鄰居最新喜好物品推薦給用戶。

寫在后面的話

呼!終于寫完了;雖然說有了上面這一套操作,UCF推薦基本完成;但有沒有更好的方式呢?我想應該就是embedding大法了吧;比如item2vec對用戶聚類,根據聚類

推薦;再或者根據好友關系,推薦好友喜好的物品。前者表征更細致,值得一說的是其也有負采樣策略和checkpoint增量更新;后者好友信任度更高,解釋性更強。

責任編輯:張燕妮 來源: 博客園
相關推薦

2021-06-28 16:05:19

數據庫代碼技術

2021-06-30 13:45:49

SQL數據庫LSM

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2022-10-28 10:18:53

代碼績效Java

2021-12-16 22:59:21

SQL報表應用

2014-05-15 09:45:58

Python解析器

2010-11-16 16:02:08

曙光天河星云

2019-10-17 21:37:28

微信飛機大戰Python

2011-05-16 09:22:28

SQL語言

2022-08-19 07:13:45

SQL方法編程

2011-05-16 09:15:22

SQL語言

2009-11-17 09:47:54

Oracle SQL語

2010-09-01 15:30:24

SQL刪除

2019-06-03 08:52:39

打卡考勤數據庫

2011-11-30 09:46:32

超算TOP500超級計算機

2010-05-19 16:45:59

信息安全網絡安全管理任子行網絡

2010-09-01 17:19:49

SQL刪除TABLE

2020-05-21 14:50:48

代碼機器學習圖像

2011-04-14 10:18:20

數據遷移
點贊
收藏

51CTO技術棧公眾號

成人h视频在线观看| 日韩中文在线不卡| 色香阁99久久精品久久久| 激情网站五月天| 在线观看黄色国产| 91成人网在线观看| 精品免费一区二区三区| 一本大道熟女人妻中文字幕在线| 国产伦精品一区二区三区免.费| 91精品电影| 亚洲福利在线看| 天美星空大象mv在线观看视频| 国内爆初菊对白视频| 香蕉成人久久| 久久国产精品免费视频| 亚洲国产精品成人综合久久久| 国产第一亚洲| 亚洲成a人片综合在线| 天天综合色天天综合色hd| 99久久免费国产精精品| 久久综合中文| 欧美日韩国产成人在线观看| 无码 人妻 在线 视频| 免费网站在线观看人| 99视频在线精品| 欧美人与性动交| 深爱五月激情网| 日韩精品一级| 欧美三片在线视频观看| 搞av.com| sm国产在线调教视频| 久久精品99国产精品日本| 久久久免费精品视频| 在线观看天堂av| 亚洲影院天堂中文av色| 欧美大片一区二区三区| 午夜免费看视频| 天堂av中文在线观看| 亚洲综合图片区| 亚洲综合网中心| 国产中文字幕在线| 不卡免费追剧大全电视剧网站| 91精品国产综合久久香蕉922| 日本高清不卡码| 亚洲第一福利专区| 日韩精品在线一区| 日韩欧美中文在线视频| 激情亚洲小说| 欧美天天综合网| 不卡影院一区二区| 亚洲黄色免费看| 午夜精品久久久久影视| 日韩在线观看a| 超碰免费公开在线| 亚洲日本欧美天堂| 亚洲精品视频一区二区三区| 国产在线日本| 国产婷婷色一区二区三区四区 | 免费中文字幕在线观看| 亚洲大全视频| 超碰91人人草人人干| 黄色片网站在线播放| 久久精品高清| 久久精品国产99国产精品澳门 | 国产91成人video| 国产一级特黄a高潮片| 黄色在线成人| 91精品国产99久久久久久| 强迫凌虐淫辱の牝奴在线观看| 国内精品视频| 日韩一区二区三区电影在线观看| 五月天婷婷在线观看视频| 91精品麻豆| 日韩精品一区二区三区蜜臀| 国产成人av片| 快播电影网址老女人久久| 日韩欧美在线视频| 韩国中文字幕av| 久久三级毛片| 日韩欧美综合在线| 日韩综合第一页| 亚洲欧美tv| 在线日韩第一页| 国产天堂av在线| 国内精品美女在线观看| 91精品国产乱码久久久久久蜜臀| 五月婷婷激情视频| 久久99久久久欧美国产| 99免费在线观看视频| 无码国产伦一区二区三区视频| 久久亚洲一级片| 正在播放一区二区三区| wwwav网站| 成人美女在线观看| 日韩性感在线| 午夜国产在线视频| 国产欧美日韩中文久久| 欧美少妇一级片| 阿v视频在线| 欧美日韩成人激情| 亚洲一区二区在线免费| 成人免费在线观看av| 色综合久久88色综合天天看泰| www.日本精品| 久草这里只有精品视频| 精品国产一区二区三区免费| 国产不卡av在线播放| av在线一区二区| 艳色歌舞团一区二区三区| heyzo在线欧美播放| 欧美中文字幕不卡| 欧美三级一级片| 免费视频成人| 日韩精品免费在线播放| 伊人在线视频观看| 亚洲综合国产激情另类一区| 国产在线视频一区| 日本视频在线观看一区二区三区| 亚洲丝袜另类动漫二区| 国产精品无码专区av在线播放| 日韩一级淫片| 一区二区三区日韩在线| 国产一区二区三区影院| 国产在线精品一区二区夜色| 日本高清久久一区二区三区| 国产盗摄一区二区| 在线成人免费观看| 一本一道久久a久久综合蜜桃| 欧美黑白配在线| 九九久久综合网站| 中文字幕第一页在线播放| av毛片久久久久**hd| 超碰10000| 亚洲午夜国产成人| 一本一本久久a久久精品牛牛影视| 日本熟妇毛茸茸丰满| 国产美女主播视频一区| 性欧美videosex高清少妇| 美女100%一区| 亚洲精品少妇网址| 日韩精品视频免费播放| 国产成人免费视频| 久久久久久久久影视| 一级欧美视频| 日韩中文字幕免费视频| 亚洲国产无线乱码在线观看| 久久久99精品久久| 成人羞羞国产免费网站| 神马久久av| 97av在线播放| 亚洲aⅴ乱码精品成人区| 亚洲综合999| 影音先锋资源av| 国内自拍视频一区二区三区| 91免费版网站在线观看| 亚洲精品一线| 精品久久久久久久久久久久包黑料| 久久久久99精品成人片试看| 国产精品99久久久久久有的能看 | 亚洲AV成人精品| 欧美影视一区| www.成人av.com| 青青在线视频| 精品裸体舞一区二区三区| 欧美成人黄色网| 丁香激情综合国产| www.夜夜爱| 激情小说亚洲图片| 91精品国产成人www| 牛牛澡牛牛爽一区二区| 欧美中文字幕久久| 成年人网站在线观看视频| 黄一区二区三区| 国产精品视频网站在线观看 | 日韩视频中午一区| 国产小视频在线看| 91丨porny丨最新| 成人免费无码av| 欧美独立站高清久久| 亚洲综合在线小说| 午夜影院免费体验区| 欧美日韩免费在线| 蜜桃无码一区二区三区| 另类小说欧美激情| 欧美做暖暖视频| 免费成人av| 欧美激情在线有限公司| 天堂在线观看免费视频| 91久久精品一区二区| 亚洲色图日韩精品| 国产成人在线免费观看| 中文字幕日本最新乱码视频| 日韩在线视屏| 国产精品久久久一区二区三区| 欧美成人黑人| 久久影视电视剧免费网站清宫辞电视 | 国产精品一级无码| 欧美亚洲一区二区三区| 亚洲视频小说| 久草在线综合| 国产伊人精品在线| av手机在线观看| 久久精品国产一区二区三区| 五月天福利视频| 欧美日本乱大交xxxxx| 日本一本高清视频| 国产精品美女一区二区三区 | 亚洲精品aⅴ| 国产成人中文字幕| 99在线视频影院| 色99之美女主播在线视频| 亚洲 欧美 自拍偷拍| 欧美一区二区三区在线观看视频| 国产微拍精品一区| 亚洲欧美日韩成人高清在线一区| 右手影院亚洲欧美| 国产电影一区在线| 性chinese极品按摩| 国产精品久久久久久久久久妞妞 | 在线观看a视频| 日韩av最新在线观看| 国产视频aaa| 欧美婷婷六月丁香综合色| 国产微拍精品一区| 亚洲成人在线免费| 老司机成人免费视频| 日本一区二区视频在线| 黄色网址在线视频| 成人午夜精品在线| 麻豆传媒在线看| 久久99热这里只有精品| 九九视频精品在线观看| 亚洲欧美日韩国产| koreanbj精品视频一区| 欧美三级在线| 国产精品美女在线播放| 欧美偷拍自拍| 欧美午夜免费| 亚洲精品亚洲人成在线| 国产欧美日韩伦理| 91精品国产自产精品男人的天堂| 91久久精品在线| 亚洲男女网站| 成人免费高清完整版在线观看| 不卡亚洲精品| 国产精品免费久久久久久| 国模冰冰炮一区二区| 奇米4444一区二区三区| sis001欧美| 日本三级久久久| xxx欧美xxx| 国产97在线|亚洲| 日本免费一区二区三区四区| 日本免费一区二区三区视频观看| 91精品论坛| 国产精品草莓在线免费观看 | 96国产粉嫩美女| 高清不卡一区| 91精品国产99久久久久久红楼| 久久综合给合| 成人欧美一区二区三区视频| 丰满大乳少妇在线观看网站| 久久大大胆人体| 182tv在线播放| 欧美日产国产成人免费图片| 色呦呦在线观看视频| 欧美精品成人在线| 色偷偷色偷偷色偷偷在线视频| 欧美一级黑人aaaaaaa做受| 一本大道色婷婷在线| 国产精品黄页免费高清在线观看| 全球最大av网站久久| 成人在线小视频| 99精品在免费线中文字幕网站一区| 国产一区二区视频在线免费观看| 色婷婷狠狠五月综合天色拍 | 国产成人中文字幕| 国产一区二区色噜噜| 亚洲在线视频福利| 国产成人夜色高潮福利影视| 久久久久国产精品视频| 成人午夜av| www.国产亚洲| 亚久久调教视频| 免费在线观看污网站| 成人综合在线网站| 91成年人网站| 中文字幕一区二区三区在线播放 | 日韩一二三区在线观看| 精品国产一区二区三区麻豆免费观看完整版 | 国产欧美一区二区色老头 | av日韩亚洲| 91在线色戒在线| 欧美深夜视频| 亚洲高清视频一区二区| 欧美日韩国产探花| 亚洲精品视频导航| 粉嫩一区二区三区在线看| 国产又粗又猛又爽视频| 一区二区三区成人| 久久久999久久久| 亚洲精品在线电影| 最新97超碰在线| 性色av一区二区三区免费| 成人深夜福利| 精品国产第一页| 久久久久久久久丰满| 日本wwww视频| 国产精品69毛片高清亚洲| 在线观看日韩精品视频| 亚洲色大成网站www久久九九| 国产成人综合欧美精品久久| 亚洲综合免费观看高清完整版| 亚洲天堂一区在线观看| 欧美一区二区福利视频| 东凛在线观看| 97超级碰碰碰久久久| 欧美日韩国产一区二区在线观看| 欧美一区二区三区四区夜夜大片| 国产精品hd| 天天综合网日韩| 久久综合狠狠综合久久激情| 精品无码人妻一区二区三| 9191成人精品久久| 成人18在线| 在线观看日韩视频| av免费不卡| 成人在线视频电影| 亚洲最新色图| 小明看看成人免费视频| 久久精品一区二区三区不卡| 欧美成人精品欧美一级私黄| 欧美日本一道本| av电影在线观看网址| 日本一区二区在线免费播放| 国产劲爆久久| 国产一区二区片| 国产精品羞羞答答xxdd| 丁香花五月激情| 欧美一区三区四区| 久草资源在线| 91精品美女在线| 久久精品亚洲欧美日韩精品中文字幕| 18岁视频在线观看| 久久这里都是精品| 亚洲欧美精品一区二区三区| 亚洲精品国精品久久99热| 精品乱码一区二区三四区视频 | 亚洲精品免费在线看| 丝袜美腿亚洲综合| 人妻av无码一区二区三区| 欧美性猛交99久久久久99按摩| 日韩一区二区三区不卡| 亚洲精品在线观看www| 国产剧情av在线播放| 精品久久中出| 亚洲尤物影院| 强伦人妻一区二区三区| 91福利社在线观看| 自拍视频在线播放| 成人国产精品一区| 亚洲电影影音先锋| 韩国三级与黑人| 亚洲成人av电影| 欧美日韩免费做爰大片| 国产精品99久久久久久www| 欧美日韩在线播放视频| 一道本在线免费视频| 亚洲欧洲日韩一区二区三区| 国产精品久久久久久久免费看| 欧美xxxx综合视频| 成人中文字幕视频| 女人和拘做爰正片视频| 久久精品在线观看| 国产女人高潮的av毛片| 欧美第一黄色网| 欧美人妖视频| 国产精品无码一本二本三本色| 国产精品色哟哟网站| 国产高清精品软件丝瓜软件| 海角国产乱辈乱精品视频| 中文字幕亚洲影视| 小明看看成人免费视频| 亚洲成a天堂v人片| 成人欧美亚洲| 99国产盗摄| 久久精品网址| 欧洲美女女同性互添| 亚洲国产另类久久精品| 九色成人搞黄网站| 欧美国产视频一区| 久久综合九色综合欧美就去吻| 国产精品一品二区三区的使用体验| 欧美激情欧美激情| 精品国产91| 男男受被啪到高潮自述| 色国产综合视频| 在线中文字幕第一页| 蜜桃999成人看片在线观看| 久久99国产精品尤物|