【知识发现】基于用户的协同过滤推荐算法python实现
生活随笔
收集整理的這篇文章主要介紹了
【知识发现】基于用户的协同过滤推荐算法python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、協(xié)同過濾推薦算法分為兩類,分別是基于用戶的協(xié)同過濾算法(user-based collaboratIve filtering),和基于物品的協(xié)同過濾算法(item-based collaborative filtering)。
? ? ? 1)基于用戶的協(xié)同過濾算法是通過用戶的歷史行為數據發(fā)現用戶對商品或內容的喜歡(如商品購買,收藏,內容評論或分享),并對這些喜好進行度量和打分。根據不同用戶對相同商品或內容的態(tài)度和偏好程度計算用戶之間的關系。在有相同喜好的用戶間進行商品推薦。
? ? ? 2)基于物品的協(xié)同過濾算法與基于用戶的協(xié)同過濾算法很像,將商品和用戶互換。通過計算不同用戶對不同物品的評分獲得物品間的關系。基于物品間的關系對用戶進行相似物品的推薦。這里的評分代表用戶對商品的態(tài)度和偏好。
2、這里做了初步的實現基于用戶的協(xié)同過濾,相關理論可以進一步查閱。
# -*- coding: utf-8 -*- ''' Created on 2017年9月18日@author: Jason.F ''' import time import pandas as pd import math import numpy as np from operator import itemgetter def Recommend(user,df_test,W,TopK=3):rvi=1 #用戶v對物品i的興趣,默認為1#TopK:與用戶user興趣最接近的k個用戶rank=dict()#df_itemU=df_sample[df_sample['userid'] == user]#u_items=list(set(df_itemU['itemid'].values))for v,wuv in sorted(W[user].items(),key=itemgetter(1),reverse=True)[0:TopK]:df_itemV=df_test[df_test['userid'] == v]v_items=list(set(df_itemV['itemid'].values))for i in v_items:#if i in u_items:# continueif i not in rank.keys():rank[i]=0rank[i] +=wuv*rvi return rank #返回推薦的物品def UserSimilarity(df_sample):#計算用戶相似度#建立物品到用戶的倒排表item_users=dict()item_list = list(set(df_sample['itemid'].values))#獲取物品列表for item in item_list:item_users[item]=set()df_user=df_sample[df_sample['itemid'] == item]user_list= list(set(df_user['userid'].values))#獲取物品對應的用戶列表for user in user_list: item_users[item].add(user)#計算用戶之間物品相似度C = dict()N = dict()#初始化for u in list(set(df_sample['userid'].values)):N[u]=0for v in list(set(df_sample['userid'].values)):if u!=v:AddTwoDict(C,u,v,0)W=C #初始化相似度字段#計算 for item,users in item_users.items():for u in users:N[u] += 1for v in users:if u==v:continue#根據用戶行為計算用戶相似度,改良余弦相似度公式C[u][v] +=( 1/math.log(1+len(users)) )#計算用戶相似度矩陣for u,related_users in C.items():for v,cuv in related_users.items():W[u][v]=cuv/math.sqrt(N[u]*N[v])return W#二維詞典插入 def AddTwoDict(theDict, key_a, key_b, val): if key_a in theDict: theDict[key_a].update({key_b: val}) else: theDict.update({key_a:{key_b: val}})#計算準確率指標 def Precision(df_test,W,N=5):hit=0all=0#N最靠前的5個物品for user in list(set(df_test['userid'].values)):rank=Recommend(user,df_test,W)df_item=df_test[df_test['userid'] == user]for item,pui in sorted(rank.items(),key=itemgetter(1),reverse=True)[0:N]:if item in list(set(df_item['itemid'].values)):hit+=1all += Nreturn hit/(all*1.0)#召回率 def Recall(df_test,W,N=5):hit=0all=0#N最靠前的5個物品for user in list(set(df_test['userid'].values)):rank=Recommend(user,df_test,W)df_item=df_test[df_test['userid'] == user]for item,pui in sorted(rank.items(),key=itemgetter(1),reverse=True)[0:N]:if item in list(set(df_item['itemid'].values)):hit+=1all += len(df_item)return hit/(all*1.0)if __name__ == '__main__': start = time.clock() #導入數據df_sample = pd.read_csv("D:\\tmp\\ratings.csv",names=['userid','itemid','ratings','time'],header=0) df_sample_=df_sample[['userid','itemid']]#模型訓練W=UserSimilarity(df_sample)#模型預測#rank=Recommend(1,df_sample,W)#user=1#print (rank)#模型評估,準確率指標df_test=df_sample.sample(frac=0.2)#抽20%來測試print (Precision(df_test,W))#準確率print (Recall(df_test,W))#準確率end = time.clock() print('finish all in %s' % str(end - start))要結合實際業(yè)務定義相關參數,以及采集樣本(興趣度或偏好)。
基于物品的協(xié)同過濾實現類似。
總結
以上是生活随笔為你收集整理的【知识发现】基于用户的协同过滤推荐算法python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【知识发现】隐语义模型LFM算法pyth
- 下一篇: 【正一专栏】登贝莱,该不该来!