首页 > 解决方案 > 用于计算推荐性能的 NDPM(基于归一化距离 > 性能度量)的 python 函数?

问题描述

我正在寻找 NDPM 的 python 函数,但找不到任何来源!所以写了我自己的脚本并离开这里,如果有人需要的话可以找到。如果有人知道任何用于推荐系统的 NDPM 包,请在评论中告知

标签: pythonrecommender-systems

解决方案


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))

推荐阅读