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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

推荐系统相关算法

發(fā)布時(shí)間:2023/11/29 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 推荐系统相关算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:

   熱門推薦

?  協(xié)同過濾算法

   矩陣分解

   基于內(nèi)容的推薦(文本,標(biāo)簽,特征/profile)

?  ? 基于圖的算法

  ?

內(nèi)容:

熱門推薦:

  熱門推薦本質(zhì)上是一個(gè)排行榜,可能會(huì)考慮到時(shí)間衰減,商品的銷量/流行度,好評(píng),差評(píng)等因素,對(duì)于新用戶引導(dǎo)有一定的作用,但是并不是一個(gè)個(gè)性化的算法

  以下是一些熱門排名的公式實(shí)現(xiàn):

1 def hacker_news_rank( ): 2 #參考自http://www.oschina.net/news/43456/how-hacker-news-ranking-algorithm-works 3 tr = pd.read_csv('../data/train.csv') 4 item = pd.read_csv('../data/news_info.csv') 5 item_action_cnt = tr[['user_id','item_id','action_type']].drop_duplicates().groupby(['item_id'],as_index=False).count()[['item_id','action_type']] 6 item_action_cnt.columns = ['item_id','action_cnt'] 7 item_pop = pd.merge(item[['item_id', 'timestamp']], tr, on='item_id') 8 item_pop = pd.merge( item_action_cnt,item_pop,on='item_id' ) 9 item_pop['pop'] = item_pop['action_cnt'] / pow( ( item_pop['action_time'] - item_pop['timestamp'] )/3600 ,5.8 ) #5.8等于10.8,優(yōu)于1.8,2.8 10 item_pop = item_pop[['item_id','pop']].groupby( ['item_id'],as_index=False ).sum() 11 return item_pop

?

1 def top_pop( ): 2 #參考自《推薦系統(tǒng)實(shí)踐》p130 3 tr = pd.read_csv('../data/train.csv') 4 tr['pop'] = tr['action_time'].apply(lambda t: 1 / (1.0 + 0.2 * (1487433599 - t))) #0.2優(yōu)于0.1和0.5 5 item_pop = tr[['item_id', 'pop']].groupby(['item_id'], as_index=False).sum() 6 return item_pop

?

協(xié)同過濾算法

  協(xié)同過濾算法大概可以分成如下幾步:

   1.構(gòu)建用戶評(píng)分矩陣,每一行是用戶,物品,評(píng)分的三元組

   2.構(gòu)建用戶/物品的倒排索引

   3.計(jì)算物品/用戶的相似度,比如共現(xiàn)相似度,cosine相似度等

   4.預(yù)測用戶對(duì)相似物品的評(píng)分,選取top k 進(jìn)行推薦

以下是一個(gè)python版的簡單實(shí)現(xiàn):

1 #可以優(yōu)化空間,存儲(chǔ)成三角矩陣 2 def get_concur_mat( ): 3 path = "../cache/get_concur_mat.pkl" 4 if os.path.exists(path): 5 sim_mat = pickle.load(open(path, "rb")) 6 else: 7 rat_mat = get_rating_matrix() //用戶評(píng)分矩陣 8 sim_mat = pd.DataFrame() 9 item1_list = [] 10 item2_list = [] 11 item1_item2_score = [] 12 user_groups = rat_mat.groupby( ['user_id'] ) //物品的倒排索引 13 for name,group in user_groups: 14 for pair in permutations(list(group[['item_id','weight']].values), 2): 15 item1_list.append( pair[0][0] ) 16 item2_list.append( pair[1][0] ) 17 item1_item2_score.append( pair[0][1]*pair[1][1] ) 18 sim_mat['item1'] = item1_list 19 sim_mat['item2'] = item2_list 20 sim_mat['score'] = item1_item2_score 21 sim_mat = sim_mat.groupby(['item1', 'item2'], as_index=False).sum() 22 pickle.dump(sim_mat, open(path, 'wb'), True) # dump 時(shí)如果指定了 protocol 為 True,壓縮過后的文件的大小只有原來的文件的 30% 23 return sim_mat 24 25 def get_cosine_sim( ): 26 path = "../cache/cosine_sim_mat.pkl" 27 if os.path.exists(path): 28 sim_mat = pickle.load(open(path, "rb")) 29 else: 30 concur_mat = get_concur_mat() 31 print('----------------load concur_mat--------------------') 32 rat_mat = get_rating_matrix() 33 print('----------------load rat_mat--------------------') 34 rat_mat['score2'] = rat_mat[['weight']] * rat_mat[['weight']] 35 item_sum_s2_vector = rat_mat[['item_id','score2']].groupby(['item_id'],as_index=False).sum() 36 item_sum_s2_vector.index = item_sum_s2_vector['item_id'] 37 item_sum_s2_dict = item_sum_s2_vector['score2'].to_dict() 38 concur_mat['item1_sum_s2'] = concur_mat['item1'].apply( lambda p:item_sum_s2_dict[p] ) 39 concur_mat['item2_sum_s2'] = concur_mat['item2'].apply(lambda p: item_sum_s2_dict[p]) 40 concur_mat['sim'] = concur_mat['score'] / (concur_mat['item1_sum_s2'].apply(math.sqrt) * concur_mat['item2_sum_s2'].apply(math.sqrt)) 41 print('------------ 取前20個(gè)最相似的item ------------------') 42 sim_mat = pd.DataFrame() 43 for item1,group in concur_mat.groupby( ['item1'],as_index=False ): 44 df = group.sort_values( ['sim'],ascending=False ).head( 20 ) 45 df['item1'] = [item1] * len(df) 46 sim_mat = sim_mat.append( df ) 47 # print('---------------------------') 48 sim_mat = sim_mat[['item1', 'item2', 'sim']] 49 pickle.dump(sim_mat, open(path, 'wb'), True) 50 return sim_mat View Code

?

?矩陣分解

?舉一個(gè)電影推薦的例子,用戶可能對(duì)星爺?shù)臒o厘頭電影和好萊塢大片比較感興趣,這時(shí)協(xié)同過濾就不能明確滿足用戶的這部分需求了。矩陣分解類的算法針對(duì)此類問題,引入了隱性因子的概念。那么矩陣分解大概可以分成如下幾步:

  1.構(gòu)建用戶評(píng)分矩陣,每一行是用戶,物品,評(píng)分的三元組

?  ?2.設(shè)定隱因子數(shù)量,迭代次數(shù),正則化參數(shù)(單指ALS和SGD優(yōu)化算法)等,并進(jìn)行訓(xùn)練

? ? ? 3.保存用戶矩陣,物品矩陣

  4.預(yù)測用戶對(duì)候選物品的評(píng)分,選取top k 進(jìn)行推薦

以下是一個(gè)python調(diào)用libMF的簡單例子:

1 #!/usr/bin/env bash 2 3 #訓(xùn)練 4 #-l1 0.015,0 -l2 0.01,0.005 -r 0.01 -v 10 -t 10000 -r 0.01 5 bins/mf-train -k 35 -l1 0.015,0 -l2 0,0.05 -t 8000 -r 0.02 data/real_matrix.tr.txt model/libMF_model_l1l2

預(yù)測評(píng)分

1 print( ' 預(yù)測評(píng)分 ' ) 2 rec = pd.DataFrame() 3 user_list = [] 4 rec_items_list = [] 5 sorted_list = [] 6 n = 0 7 feat = ["factor_" + str(i) for i in range(num_factor)] 8 user_mat = user_mat[ ['user_id']+feat ] 9 item_mat = item_mat[ ['item_id']+feat ] 10 for i in range( len(user_mat) ): 11 recitems = [] 12 for j in range( len(item_mat) ): 13 predict = user_mat.ix[i,1:].dot( item_mat.ix[j,1:] ) 14 addAndSortTopK( [item_mat.ix[j,0],predict],sorted_list ) 15 for item_predict in sorted_list: 16 recitems.append( int(item_predict[0]) ) 17 sorted_list.clear() 18 user_list.append( user_mat.ix[i,0] ) 19 rec_items_list.append( " ".join( map(str,recitems) ) ) 20 n += 1 21 if( n%2==0 ):print(' rec users '+str( n )) 22 rec['user_id'] = user_list 23 rec['item_id'] = rec_items_list

?

基于內(nèi)容的推薦(文本,標(biāo)簽,特征/profile)

  多維度分析用戶對(duì)物品的偏好,例如新聞,圖書類的會(huì)對(duì)物品進(jìn)行文本分析,音樂,博客類的可以通過(UGC)標(biāo)簽引導(dǎo)用戶并且記錄用戶累積偏好;最后電商類推薦搭建用戶畫像和商品畫像,進(jìn)行精準(zhǔn)營銷。

實(shí)現(xiàn)代碼待續(xù)~~~

?

?基于圖的算法

待續(xù)~~~

轉(zhuǎn)載于:https://www.cnblogs.com/arachis/p/recSys.html

總結(jié)

以上是生活随笔為你收集整理的推荐系统相关算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。