grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens
生活随笔
收集整理的這篇文章主要介紹了
grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據從
MovieLens數據下載地址
https://grouplens.org/datasets/movielens/下載。
我選的是1MB版本,大約10W+評分,9K+電影,600+用戶。
使用ratings.csv,格式為userId,movieId,評分,時間戳。
步驟:
1、解析CSV文件,構建訓練集。
2、計算物品相似度矩陣,并歸一化。
3、給指定用戶推薦TopN。
#!/usr/bin/python3import mathimport csvimport datetimeimport?heapqdef BuildTarin(startTime): """ 處理數據集,格式: 用戶ID:{物品ID,評分} """ train = dict() with open('/Users/liupeng/Downloads/ml-latest-small/ratings3.csv') as f: f_csv = csv.reader(f) for row in f_csv: userId=row[0] itemId=row[1] score=row[2] train.setdefault(int(userId),{}) train[int(userId)][int(itemId)] = float(score) endTime=datetime.datetime.now() print('處理數據集耗時:{0}秒'.format((endTime-startTime).seconds))????return?traindef ItemSimilarity(train): """ 計算物品-物品相似度矩陣 物品相似度 w(i,j)=(N(i)∩N(j))/sqrt(N(i)*N(j)) """ startTime = datetime.datetime.now() #物品-物品矩陣 格式:物品ID1:{物品ID2:同時給兩件物品評分的人數} C=dict() #物品-用戶矩陣 格式:物品ID:給物品評分的人數 N=dict() for userId,items in train.items(): for itemId,source in items.items(): N.setdefault(itemId,0) #給物品打分的人數+1 N[itemId] += 1 C.setdefault(itemId,{}) for i in items.keys(): if(i==itemId): continue C[itemId].setdefault(i,0) #同時給兩個物品打分的人數 C[itemId][i] += 1 #如果要對活躍用戶懲罰 #C[itemId][i]+=1/math.log(1+len(items)*1.0) endTime=datetime.datetime.now() print('處理矩陣耗時:{0}秒'.format((endTime-startTime).seconds)) ############################################################### startTime = datetime.datetime.now() #計算物品相似度矩陣 W=dict() for itemId,relatedItems in C.items(): W.setdefault(itemId, []) for relatedItemId,count in relatedItems.items(): W[itemId].append([relatedItemId,count/math.sqrt(N[itemId]*N[relatedItemId])]) #歸一化 wmax = max(item[1] for item in W[itemId]) for item in W[itemId]: item[1] /= wmax endTime=datetime.datetime.now() print('計算物品相似度耗時:{0}秒'.format((endTime-startTime).seconds)) return W def Recommendation(train,userId,W,K,N): """給用戶推薦物品列表 Args: train:訓練集 userId:用戶ID W:物品相似度矩陣 K:取和物品j最相似的K個物品 N:推薦N個物品 Return: 推薦列表 """ startTime = datetime.datetime.now() rank=dict() items=train[userId] #遍歷用戶評分的物品列表 for itemId,score in items.items(): #取出與物品itemId最相似的K個物品 for j,wij in sorted(W[itemId],key=lambda x: x[1],reverse=True)[0:K]: #如果這個物品j已經被用戶評分了,舍棄 if j in items.keys(): continue #對物品ItemID的評分*物品itemId與j的相似度 之和 #rank.setdefault(j,0) #rank[j] += score*wij rank.setdefault(j,{}) rank[j].setdefault("weight",0.0) rank[j].setdefault("reason",{}) rank[j]["weight"] += score*wij rank[j]["reason"][itemId]=score*wij endTime=datetime.datetime.now() print('推薦耗時:{0}秒'.format((endTime-startTime).seconds)) #堆排序,推薦權重前N的物品 return heapq.nlargest(N, rank.items(), key=lambda x: x[1]['weight']) if __name__ == "__main__": startTime = datetime.datetime.now() #構建訓練集 train=BuildTarin(startTime) #計算物品相似度矩陣 W=ItemSimilarity(train) #給用戶推薦TopN topN=Recommendation(train,1,W,10,5) endTime = datetime.datetime.now() print ('總耗時:{0}秒'.format((endTime - startTime).seconds)) print(topN) 結果:總結
以上是生活随笔為你收集整理的grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盈建科弹性板6计算_硅酸钙板的安装技巧和
- 下一篇: python安装多少位_python安装