代码拉取完成,页面将自动刷新
同步操作将从 王柏/某宝推荐系统设计 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import pandas as pd
import numpy as np
import math
from sklearn.model_selection import train_test_split
def prediction(df,userdf,Nn=15):#Nn邻居个数
corr=df.T.corr()#建立用户相似度的协方差矩阵
rats=userdf.copy()
for usrid in userdf.index:
dfnull=df.loc[usrid][df.loc[usrid].isnull()]
usrv=df.loc[usrid].mean()#评价平均值
for i in range(len(dfnull)):
nft=(df[dfnull.index[i]]).notnull()
#获取邻居列表
if(Nn<=len(nft)):
nlist=df[dfnull.index[i]][nft][:Nn]
else:
nlist=df[dfnull.index[i]][nft][:len(nft)]
nlist=nlist[corr.loc[usrid,nlist.index].notnull()]
nratsum=0
corsum=0
if(0!=nlist.size):
nv=df.loc[nlist.index,:].T.mean()#邻居评价平均值
for index in nlist.index:
ncor=corr.loc[usrid,index]
nratsum+=ncor*(df[dfnull.index[i]][index]-nv[index])
corsum+=abs(ncor)
if(corsum!=0):
rats.at[usrid,dfnull.index[i]]= usrv + nratsum/corsum
else:
rats.at[usrid,dfnull.index[i]]= usrv
else:
rats.at[usrid,dfnull.index[i]]= 0
return rats
#推荐
def recomm(df,userdf,Nn=15,TopN=1):
ratings=prediction(df,userdf,Nn)#获取预测评分
recomm=[]#存放推荐结果
for usrid in userdf.index:
#获取按NA值获取未评分项
ratft=userdf.loc[usrid].isnull()
ratnull=ratings.loc[usrid][ratft]
#对预测评分进行排序
if(len(ratnull)>=TopN):
sortlist=(ratnull.sort_values(ascending=False)).index[:TopN]
else:
sortlist=ratnull.sort_values(ascending=False).index[:len(ratnull)]
recomm.append(sortlist)
return ratings,recomm
# 读取数据
# df = pd.read_csv('UserBehavior.csv.zip',header=None)
df = pd.concat((chunk for chunk in pd.read_csv('UserBehavior.csv.zip',header=None, chunksize = 10000)))
#给数据加上列名称
df.columns = ['userid', 'num', 'proid', 'D','E']
print(df.head(5))
data1 = df.drop(['D','E'],axis=1)
data = data1.drop(df[df['userid'] > 10000].index)
print(data.shape)
print(data.head(5))
traindata, testdata = train_test_split(data,test_size=0.2, random_state=1)
traindata1 = traindata.groupby(['userid','proid'], as_index= False).count()
testdata1 = testdata.groupby(['userid','proid'], as_index= False).count()
print(traindata1.head(5))
print(testdata1.head(5))
traindf = traindata1.pivot(index = 'userid', columns= 'proid', values= 'num')
print(traindf.head(5))
testdf = testdata1.pivot(index= 'userid', columns= 'proid', values= 'num')
print(testdf.head(5))
traindf.rename(index={i:'usr%d'%(i) for i in traindf.index} , inplace=True)
traindf.rename(columns={i:'pro%d'%(i) for i in traindf.columns} , inplace=True)
testdf.rename(index={i:'usr%d'%(i) for i in testdf.index} , inplace=True)
testdf.rename(columns={i:'pro%d'%(i) for i in testdf.columns} , inplace=True)
userdf=traindf.loc[testdf.index]
#获取预测评分和推荐列表
trainnums,trainrecomm=recomm(traindf,userdf)
print(trainnums)
print(trainrecomm)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。