FunctionDef get_diversity(item_list, similarity_mat)
get_diversity: 此函数的功能是计算项目列表的多样性。
参数:
- item_list: 项目列表,用于计算多样性。
- similarity_mat: 相似度矩阵,表示项目之间的相似度。
代码描述:
get_diversity
函数接收一个项目列表和一个相似度矩阵作为输入。首先,它检查项目列表的长度。如果列表长度小于或等于1,函数直接返回1.0,表示最大的多样性。对于长度大于1的列表,函数通过遍历项目列表中的每对项目,使用相似度矩阵计算它们之间的不相似度(1减去相似度),并累加这些值。然后,将累加的总和除以项目对的总数(即列表长度乘以列表长度减1,再除以2,因为是无序对),得到平均不相似度,即多样性度量。最后,函数返回计算得到的多样性值。
在项目中,get_diversity
函数被get_results_for_one_collector
方法调用,用于评估用户体验。在该方法中,通过遍历用户的行为列表(actions)、奖励列表(rews)和用户列表(users),对每个用户生成的项目列表调用get_diversity
函数,计算其多样性,并将所有用户的多样性平均值作为整体的多样性指标。这有助于了解推荐系统是否能够为不同的用户提供多样化的内容。
注意:
- 确保传入的
item_list
是有效的项目索引列表,且similarity_mat
正确表示了项目间的相似度。 - 多样性值的范围是0到1,其中0表示完全不多样(即所有项目完全相同),1表示完全多样(即所有项目完全不同)。
输出示例:
如果有一个项目列表[1, 2, 3]
和一个相似度矩阵,其中项目间的相似度均为0.5,则get_diversity
函数的返回值将是0.5,表示这组项目的平均不相似度。
FunctionDef get_novelty(item_list, popularity_list)
get_novelty: 此函数的功能是计算项目列表的新颖度。
参数:
- item_list: 一个项目列表,包含了用户互动的项目ID。
- popularity_list: 一个字典,键为项目ID,值为该项目的流行度。
代码描述:
get_novelty
函数通过项目列表和流行度列表计算给定项目列表的平均新颖度。它首先获取项目列表的长度,然后初始化新颖度(nov)为0.0。对于列表中的每个项目,函数查找其流行度,然后将其负对数加到新颖度变量上。最后,函数将累积的新颖度除以项目列表的长度,得到平均新颖度,并将其返回。
在项目中,get_novelty
函数被 get_results_for_one_collector
函数调用,用于在每个epoch结束时计算一组用户互动项目的平均新颖度。这是通过评估系统中的用户体验来衡量推荐系统推荐内容的新颖性。通过计算所有项目列表的新颖度的平均值,可以得到整体的新颖度指标,这有助于了解推荐系统是否能够向用户推荐他们不太可能自行发现的新颖内容。
注意:
- 确保
popularity_list
中的项目ID与item_list
中的项目ID相匹配,并且流行度值是正确的,因为负对数计算对于非正值是未定义的。 - 该函数假设所有传入的项目ID都在
popularity_list
中有对应的流行度值,如果有项目ID在popularity_list
中找不到,将会引发错误。
输出示例:
假设有一个项目列表[1, 2, 3]
,其对应的流行度列表为{1: 0.5, 2: 0.3, 3: 0.2}
,则get_novelty
函数的返回值可能为1.2039728043259361
,这表示给定项目列表的平均新颖度。
FunctionDef get_serendipity
get_serendipity: 此函数的功能是计算并返回推荐系统中的意外发现度。
参数: 该函数目前不接受任何参数。
代码描述: get_serendipity
函数位于项目的src/core/evaluation/metrics.py
路径下,目前该函数的具体实现尚未完成,仅包含一个pass
语句。这意味着函数的具体逻辑还需要根据推荐系统的需求来进一步开发和完善。意外发现度(Serendipity)是衡量推荐系统推荐结果中新颖性和用户未预期发现的能力的指标。在推荐系统中,除了准确性之外,能够给用户带来意外惊喜的推荐同样重要。因此,开发此函数的目的是为了评估推荐系统能否超出用户的期望,推荐一些用户可能未曾考虑但实际上可能感兴趣的项目。
注意: 由于get_serendipity
函数的实现尚未完成,开发者在使用此函数时需要注意,必须先完成函数的具体实现,包括定义计算意外发现度的算法、确定所需的输入参数等。此外,开发者在实现该函数时应考虑不同类型的推荐系统(如基于内容的推荐、协同过滤推荐等)可能对意外发现度的计算方法有不同的要求。因此,实现时需要灵活调整算法以适应不同的推荐场景。
FunctionDef get_MRR(rec_list, true_list, true_rel)
get_MRR: 该函数用于计算推荐系统的平均倒排名(Mean Reciprocal Rank, MRR)。
参数:
rec_list
: 推荐列表,一个二维列表,其中每个子列表包含对单个用户的推荐项。true_list
: 真实列表,一个二维列表,与推荐列表相对应,每个子列表包含对单个用户的真实感兴趣项。true_rel
: 真实相关性,此参数在当前函数实现中未使用,但可能预留给扩展功能。
代码描述:
函数get_MRR
计算推荐系统的平均倒排名(MRR)。MRR是衡量推荐系统性能的指标之一,特别是在考虑推荐结果的排名时。该函数遍历每个用户的推荐列表(rec_list
),并对于每个用户,检查其真实感兴趣项(true_list
)是否出现在推荐列表中。如果出现,则计算该项的倒排名(即1除以该项在推荐列表中的位置加1,因为位置索引从0开始)。然后,将所有用户的倒排名求和,最后除以用户总数,得到平均倒排名。
在遍历过程中,一旦找到真实感兴趣项在推荐列表中的位置,就会跳出当前循环,转而处理下一个用户的推荐列表。这意味着,对于每个用户,只计算第一个找到的真实感兴趣项的倒排名。
注意:
- 确保
rec_list
和true_list
的结构正确,且它们的长度相等,即每个用户的推荐列表和真实感兴趣列表一一对应。 - 该函数假设每个用户至少有一个真实感兴趣项在推荐列表中。如果某个用户的真实感兴趣项完全不在推荐列表中,则该用户对MRR的贡献为0。
- 索引从0开始,因此在计算倒排名时需要加1以避免除以0的情况。
输出示例: 假设有以下输入:
rec_list = [[1, 2, 3], [4, 5, 6]]
true_list = [[3], [5]]
函数get_MRR
的输出将是0.75。解释如下:对于第一个用户,真实感兴趣项3在推荐列表的第三位,倒排名为1/3;对于第二个用户,真实感兴趣项5在推荐列表的第二位,倒排名为1/2。因此,平均倒排名为(1/3 + 1/2) / 2 = 0.75。
FunctionDef get_HR(rec_list, true_list, true_rel)
get_HR: 此函数用于计算推荐系统的命中率。
参数:
- rec_list: 推荐列表,每个元素是一个推荐项目的列表。
- true_list: 真实列表,每个元素是用户实际感兴趣的项目列表。
- true_rel: 此参数在当前函数实现中未使用,但可能预留给未来扩展,用于考虑相关性评分或其他高级功能。
代码描述:
get_HR
函数通过比较推荐列表(rec_list
)和真实列表(true_list
)中的项目来计算命中率。对于每个用户(或每个列表项),函数首先将推荐列表和真实列表转换为集合,然后计算这两个集合的交集,即同时出现在推荐列表和真实列表中的项目数量。如果交集的大小大于0,表示至少有一个推荐项目是用户实际感兴趣的,这时命中次数(hits
)增加1。最后,函数返回命中次数除以真实列表的总长度,即命中率。
注意:
- 确保
rec_list
和true_list
的长度相同,且每个元素对应同一个用户的推荐列表和真实感兴趣的项目列表。 - 此函数未考虑推荐列表中项目的顺序,只要推荐列表中有任何一个项目出现在真实列表中,即视为命中。
- 参数
true_rel
在当前版本的函数中未被使用,开发者在未来的版本中可能会添加相关性评分的考虑。
输出示例: 假设有以下输入:
rec_list = [[1, 2, 3], [4, 5, 6]]
true_list = [[3, 4, 5], [6, 7, 8]]
函数的返回值将是0.5
,表示有一半的推荐列表成功命中了用户的真实兴趣。
FunctionDef get_AP(rec, true)
get_AP: 该函数用于计算精度均值(Average Precision,简称AP)。
参数:
- rec: 预测结果列表,包含预测为正例的元素。
- true: 真实结果列表,包含实际为正例的元素。
代码描述:
get_AP
函数通过比较预测结果列表rec
与真实结果列表true
来计算精度均值。它首先初始化命中次数hits
和精度总和sum_precs
为0。然后,遍历预测结果列表rec
,对于每个元素,如果该元素也出现在真实结果列表true
中,则将命中次数hits
增加1,并更新精度总和sum_precs
,其中精度是通过命中次数除以当前元素在预测列表中的位置(从1开始计数)来计算的。最后,如果有命中(即hits
大于0),则返回精度总和除以真实正例的数量,否则返回0。
此函数在项目中被get_MAP
函数调用,用于计算平均精度均值(Mean Average Precision,简称MAP)。get_MAP
函数通过对多个推荐列表和对应的真实列表使用get_AP
函数计算各自的AP值,然后计算这些AP值的平均值来得到MAP值,从而评估整体的推荐系统性能。
注意:
- 确保
rec
和true
列表中的元素类型一致,以便正确比较。 - 此函数假设
rec
列表中的元素是根据其预测为正例的概率降序排列的。
输出示例:
假设有预测结果列表rec = [1, 3, 2]
和真实结果列表true = [2, 1]
,则get_AP(rec, true)
的返回值可能为0.75
。这是因为第一个元素(1)和第三个元素(2)是正确的预测,而第二个元素(3)是错误的预测。因此,第一个元素的精度为1(1/1),第三个元素的精度为0.5(2/3),平均精度为(1 + 0.5)/ 2 = 0.75。
FunctionDef get_MAP(rec_list, true_list, true_rel)
get_MAP: 该函数用于计算平均精度均值(Mean Average Precision,简称MAP)。
参数:
- rec_list: 预测结果列表的列表,每个元素是一个包含预测为正例的元素的列表。
- true_list: 真实结果列表的列表,每个元素是一个包含实际为正例的元素的列表。
- true_rel: 真实相关性列表,用于评估预测结果的准确性,本函数中未直接使用。
代码描述:
get_MAP
函数通过计算多个推荐列表(rec_list)与对应的真实列表(true_list)之间的平均精度均值(MAP)来评估推荐系统的整体性能。函数首先初始化累计精度(ap)为0,然后遍历每个推荐列表和真实列表的组合,使用get_AP
函数计算每一对列表的平均精度(AP)。get_AP
函数的详细描述见其文档,它主要负责计算单个推荐列表相对于其对应的真实列表的精度均值。在遍历过程中,将每次计算得到的AP值累加到ap变量中。遍历完成后,将累计的ap值除以真实列表的数量,得到最终的MAP值,作为推荐系统性能的评估指标。
注意:
- 确保
rec_list
和true_list
中的每个列表长度相同,且对应位置的列表代表同一推荐场景的预测结果和真实结果。 true_rel
参数在当前函数实现中未被使用,但可能在扩展或修改函数时提供额外的相关性信息。
输出示例:
假设有两组推荐结果和真实结果,rec_list = [[1, 3, 2], [1, 2, 4]]
和true_list = [[2, 1], [1, 3]]
,则get_MAP(rec_list, true_list, true_rel)
的返回值可能为0.625
。这是因为第一组的AP值为0.75(如get_AP
函数输出示例所示),而第二组的AP值为0.5(第一个元素的精度为1,第二个元素未命中,第三个元素的精度为0.5,平均精度为(1 + 0.5)/ 2 = 0.75),因此MAP值为(0.75 + 0.5)/ 2 = 0.625。
FunctionDef get_Precision(rec_list, true_list, true_rel)
get_Precision: 该函数用于计算推荐系统的精确率。
参数:
- rec_list: 推荐列表,包含多个推荐项的列表,每个推荐项是一个集合。
- true_list: 真实列表,包含多个真实项的列表,每个真实项是一个集合。
- true_rel: 该参数在函数实现中未使用,可能是保留参数,用于未来的功能扩展或其他目的。
代码描述:
函数get_Precision
接收三个参数:rec_list
、true_list
和true_rel
。它的主要目的是计算推荐系统的精确率。精确率是衡量推荐系统性能的关键指标之一,表示为正确推荐的项占推荐总数的比例。
在函数内部,首先初始化两个变量n_union
和recommend_sum
,分别用于记录命中的推荐项数和推荐项的总数。然后,函数通过遍历rec_list
中的每个推荐项来计算精确率。对于每个推荐项,函数将其与对应的真实项(来自true_list
)进行比较,计算两者的交集,即命中的推荐项数。接着,计算每个推荐项的精确率(命中数除以推荐项总数),并将这个值添加到结果列表res
中。
在遍历结束后,函数使用np.mean
计算res
列表中所有精确率的平均值,作为最终的精确率返回。
注意:
- 该函数假设
rec_list
和true_list
的长度相同,且对应位置的推荐项和真实项是相关联的。 - 函数返回的是推荐系统的平均精确率,是一个浮点数。
- 该函数未对输入列表为空的情况进行特殊处理,调用时需要确保输入列表非空,以避免除以零的错误。
输出示例: 假设有以下输入:
rec_list = [[1, 2, 3], [4, 5, 6]]
true_list = [[1, 2], [4, 7]]
函数调用get_Precision(rec_list, true_list, true_rel)
可能返回的平均精确率为0.6667
,表示推荐系统的平均精确率约为66.67%。
FunctionDef get_Recall(rec_list, true_list, true_rel)
get_Recall: 该函数用于计算召回率。
参数:
- rec_list: 推荐列表,包含多个用户的推荐项,每个用户的推荐项以列表形式给出。
- true_list: 真实列表,包含多个用户的真实感兴趣项,每个用户的真实感兴趣项以列表形式给出。
- true_rel: 未在函数体中直接使用,可能是保留参数,用于后续扩展或其他目的。
代码描述: 此函数旨在计算推荐系统的召回率。召回率是衡量推荐系统性能的关键指标之一,它反映了系统能够将用户感兴趣的项推荐给用户的能力。具体计算过程如下:
- 初始化两个变量
n_union
和user_sum
,分别用于记录所有用户的命中数和真实感兴趣项的总数。 - 初始化一个空列表
recalls
,用于存储每个用户的召回率。 - 遍历
rec_list
和true_list
,对于每个用户:- 将推荐列表和真实感兴趣列表转换为集合,以便进行集合操作。
- 计算推荐集合和真实感兴趣集合的交集,即命中的项数。
- 计算真实感兴趣集合的长度,即该用户的真实感兴趣项数。
- 计算并记录该用户的召回率,即命中数除以真实感兴趣项数。
- 累加命中数到
n_union
,累加真实感兴趣项数到user_sum
。
- 计算所有用户召回率的平均值作为最终的召回率,并返回。
注意:
- 输入的
rec_list
和true_list
应当长度相等,且对应位置的元素分别代表同一用户的推荐项和真实感兴趣项。 - 函数返回的是所有用户召回率的平均值,是一个浮点数。
- 函数依赖于
numpy
库来计算平均值,因此在使用前需要确保已经安装了numpy
。
输出示例: 假设有两个用户,第一个用户的推荐列表为[1, 2, 3],真实感兴趣列表为[1, 4],第二个用户的推荐列表为[1, 2],真实感兴趣列表为[2, 3]。则函数的返回值可能为:
0.5
这意味着平均而言,推荐系统能够覆盖用户50%的真实感兴趣项。
FunctionDef get_NDCG(rec_list, true_list, true_rel)
get_NDCG: 此函数的功能是计算推荐系统的归一化折损累积增益(Normalized Discounted Cumulative Gain,NDCG)。
参数:
- rec_list: 推荐列表,包含多个用户的推荐项列表。
- true_list: 真实列表,包含多个用户的真实感兴趣项列表。
- true_rel: 真实相关度列表,包含多个用户的真实感兴趣项的相关度。
代码描述:
函数get_NDCG
接收三个参数:rec_list
、true_list
和true_rel
,分别代表推荐列表、真实列表和真实相关度列表。该函数首先初始化累积变量ndcgs
为0,用于存储所有用户的NDCG值的总和。然后,通过遍历rec_list
中的每个用户推荐列表,对每个用户计算DCG(Discounted Cumulative Gain)和IDCG(Ideal DCG)。计算DCG时,首先将真实列表和真实相关度列表映射为一个字典mapscore
,然后遍历推荐列表中的每个项,如果该项出现在mapscore
中,则计算该项的折损增益并累加到dcg
中。接着,计算IDCG,通过对真实相关度列表进行排序和折损处理得到。最后,将该用户的DCG除以IDCG得到NDCG,并累加到ndcgs
中。函数返回所有用户NDCG的平均值。
注意:
- 确保
rec_list
、true_list
和true_rel
三个列表的长度相同,且对应位置的元素分别属于同一个用户。 true_rel
中的相关度值应为整数。- 本函数依赖于
numpy
库进行数学运算,确保在使用前已正确安装numpy
。
输出示例: 假设有两个用户的推荐列表、真实列表和真实相关度列表如下:
rec_list = [['item1', 'item2'], ['item3', 'item4']]
true_list = [['item2', 'item3'], ['item4', 'item1']]
true_rel = [[2, 1], [1, 3]]
调用get_NDCG(rec_list, true_list, true_rel)
可能返回的NDCG平均值为0.815。这个值表示推荐系统的整体推荐质量,值越高表示推荐结果与用户的实际偏好越吻合。
FunctionDef get_ranking_results(xy_predict, df_true_list, K, metrics, epoch)
get_ranking_results: 此函数的功能是根据预测结果和真实列表,计算不同K值下的多种评估指标。
参数:
- xy_predict: 预测结果的DataFrame,包含"user_id", "item_id"和预测得分"y_pred"。
- df_true_list: 真实的用户-物品交互列表。
- K: 一个元组,包含不同的K值,用于计算Top-K推荐的评估指标。
- metrics: 一个字符串列表,指定需要计算的评估指标。
- epoch: 当前的训练轮次,可选参数。
代码描述: 此函数首先根据"user_id"对预测结果进行分组,并对每个用户的预测得分进行排序,以得到每个用户的Top-K推荐列表。然后,它将这些推荐列表与真实的用户-物品交互列表进行比较,根据指定的评估指标(如召回率、精确度、归一化折损累积增益(NDCG)、命中率(HT)、平均精确率(MAP)、平均倒数排名(MRR))计算每个K值下的评估结果。
在项目中,get_ranking_results
函数被用于不同的用户模型设置中,如run_DeepFM_IPS.py
, run_DeepFM_ensemble.py
, 和 run_Egreedy.py
中的setup_user_model
函数。这些调用场景表明,get_ranking_results
函数主要用于评估推荐系统模型的性能,特别是在考虑不同排名优化目标和损失函数设置下的性能。
注意:
- 确保
xy_predict
和df_true_list
的格式正确,且包含必要的列。 - 在使用之前,需要确保
METRICS
字典已定义,且包含所有需要计算的评估指标的函数。 - 此函数假设
df_true_list
已经正确地与xy_predict
通过"user_id"关联。
输出示例:
{
"Recall@20": 0.1,
"Precision@20": 0.05,
"NDCG@20": 0.12,
"HT@20": 0.15,
"MAP@20": 0.07,
"MRR@20": 0.09,
"Recall@10": 0.08,
"Precision@10": 0.04,
"NDCG@10": 0.1,
"HT@10": 0.12,
"MAP@10": 0.05,
"MRR@10": 0.07,
"Recall@5": 0.05,
"Precision@5": 0.02,
"NDCG@5": 0.08,
"HT@5": 0.1,
"MAP@5": 0.03,
"MRR@5": 0.05
}
此输出示例展示了在不同的K值(20, 10, 5)下,各个评估指标的计算结果。