python - 用于计算推荐性能的 NDPM(基于归一化距离 > 性能度量)的 python 函数?
问题描述
我正在寻找 NDPM 的 python 函数,但找不到任何来源!所以写了我自己的脚本并离开这里,如果有人需要的话可以找到。如果有人知道任何用于推荐系统的 NDPM 包,请在评论中告知
解决方案
import pandas as pd
import numpy as np
import os
from IPython.display import display
import itertools as iterT
import random
def Cal_NDPM(df, col_sysRank, col_userRank, user_id, ItemsPerUser):
# df : Dataframe
# col_sysRank: system predicted Rank on a recipe for a user
# col_userRank : rank of a recipe for user rank
# user_id : identifier for user
# ItemsPerUser : how many item per user
combinations=[i for i in range (0,ItemsPerUser)] # creat a list of indexes { 0 to ItemsPerUser-1}
listofCombination=list(iterT.combinations(combinations,2)) # creating combination for every items in RecList for a user
listOfSuccessRankPrediction=[] # list for storing number of successful relative rank for each user
for j in list(set(df[user_id].tolist())): # loop to calculate PDM for each user
smallerslice=df[df[user_id]==j].reset_index() #extract reclist for each user
#
s=0 # innitiate counter
for i in list(listofCombination): # compare for every recipe pair in a reclist for a user
if (smallerslice.loc[i[0]][col_sysRank] > smallerslice.loc[i[1]][col_sysRank]) == (smallerslice.loc[i[0]][col_userRank] > smallerslice.loc[i[1]][col_userRank]):
s=s+1 #incriment if successful
listOfSuccessRankPrediction.append(s)
NDPM=sum(listOfSuccessRankPrediction)/(len(list(set(df[user_id].tolist())))*21)
return NDPM
#creating a dataframe
df_list = {'user_id': [i for i in ['U_01','U_02'] for j in range(0,7)],'SysRank':[random.randint(0, 6) for i in range(0,7*len(['U_01','U_02']))],'userRate_basedRank':[random.randint(0, 6) for i in range(0,7*len(['U_01','U_02']))]}
df=pd.DataFrame(df_list)
print(Cal_NDPM(df,'SysRank','userRate_basedRank','user_id',7))