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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens

發布時間:2023/12/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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