ClassDef MovieLensEnv
MovieLensEnv: MovieLensEnv 类是基于 MovieLens 数据集构建的推荐系统环境。
属性:
mat
: 用户-物品交互矩阵。lbe_user
: 用户标签编码器。lbe_item
: 物品标签编码器。mat_distance
: 物品间的距离矩阵。num_leave_compute
: 用于计算用户是否离开的动作数量。leave_threshold
: 用户离开的距离阈值。max_turn
: 环境中的最大交互次数。random_init
: 是否随机初始化用户和物品。
代码描述:
MovieLensEnv 类继承自 BaseEnv 类,专门用于处理 MovieLens 数据集的推荐系统环境。它通过重写 __init__
方法来初始化环境,其中包括加载环境数据(用户-物品交互矩阵、用户和物品的标签编码器、物品间的距离矩阵)。如果提供了具体的矩阵和编码器,则直接使用这些数据;否则,会通过调用 load_env_data
静态方法来加载数据。
load_env_data
方法负责从 MovieLensData 类中加载必要的环境数据,包括用户-物品交互矩阵、用户和物品的标签编码器以及物品间的距离矩阵。
_determine_whether_to_leave
方法是一个重要的逻辑判断方法,用于判断在给定的时间点和执行的动作下,用户是否会离开。这个判断基于用户的行为序列和物品间的距离矩阵,如果用户最近的一系列动作中包含与当前动作距离小于设定阈值的物品,则认为用户会离开。
注意:
- MovieLensEnv 类是基于 MovieLens 数据集设计的,因此在使用时需要确保有正确的数据集格式和预处理。
- 在使用此环境进行模拟或训练推荐系统时,应注意
leave_threshold
、num_leave_compute
和max_turn
等参数的设置,这些参数会直接影响用户离开的判断逻辑和环境的交互过程。
输出示例: 由于 MovieLensEnv 类主要用于模拟用户与推荐系统的交互过程,因此其输出主要是在每一步动作后的环境状态、即时奖励、是否终止、是否截断以及额外信息的元组。例如:
(state, reward, terminated, truncated, info)
其中 state
表示环境的当前状态,reward
表示执行动作后获得的即时奖励,terminated
表示是否达到终止条件,truncated
表示是否因为某些原因提前终止,info
是一个字典,包含了额外的环境信息,如累积奖励等。
FunctionDef init(self, mat, lbe_user, lbe_item, mat_distance, num_leave_compute, leave_threshold, max_turn, random_init)
init: 此函数的功能是初始化MovieLens环境对象。
参数:
mat
: 评分矩阵,默认为None。如果提供,则直接使用该矩阵作为环境的评分数据。lbe_user
: 用户标签编码器,默认为None。用于将用户ID映射为连续的整数索引。lbe_item
: 电影标签编码器,默认为None。用于将电影ID映射为连续的整数索引。mat_distance
: 电影之间的距离矩阵,默认为None。用于计算电影之间的相似度。num_leave_compute
: 离开计算的数量,默认为5。leave_threshold
: 离开阈值,默认为80。max_turn
: 最大轮数,默认为100。random_init
: 是否随机初始化,默认为False。
代码描述: __init__
函数首先检查是否提供了评分矩阵mat
。如果提供了,就直接使用提供的参数初始化环境状态;如果没有提供,则调用load_env_data
函数加载环境所需的核心数据,包括评分矩阵、用户和电影的标签编码器以及电影之间的距离矩阵。之后,调用父类的__init__
方法,传入num_leave_compute
、leave_threshold
、max_turn
和random_init
参数完成环境对象的初始化。这样的设计允许灵活地初始化环境,既可以直接使用外部提供的数据,也可以通过load_env_data
函数自动加载数据。
注意: 在使用此构造函数时,如果选择不提供mat
、lbe_user
、lbe_item
和mat_distance
参数,则需要确保相关的数据文件已经准备妥当,并且项目配置中的路径设置正确,以便load_env_data
函数能够正确地加载数据。此外,考虑到load_env_data
函数的输出直接影响环境的初始化,确保该函数能够正确执行并返回预期的数据结构是非常重要的。
FunctionDef load_env_data
load_env_data: 此函数的功能是加载MovieLens环境数据。
参数: 此函数不接受任何参数。
代码描述: load_env_data
函数负责加载MovieLens推荐系统环境所需的核心数据。具体来说,它通过调用MovieLensData
类的load_mat
方法来加载评分矩阵,该矩阵记录了用户对电影的评分信息。接着,通过get_lbe
方法获取用户和电影的标签编码器,这些编码器将用户ID和电影ID映射为连续的整数索引,便于后续处理。此外,函数还调用get_saved_distance_mat
方法来加载或计算电影之间的距离矩阵,这一矩阵用于计算电影之间的相似度,对于推荐系统的性能至关重要。
在项目中,load_env_data
函数被MovieLensEnv
类的构造函数__init__
调用,用于初始化环境的状态。同时,get_true_env
函数也调用了load_env_data
,用于根据不同的环境配置创建相应的环境实例。
注意: 确保在调用此函数之前,相关的数据文件已经准备妥当,并且DATAPATH
和PRODATAPATH
路径正确设置,以便函数能够正确地加载数据文件。
输出示例: 假设评分矩阵、用户和电影的标签编码器以及电影之间的距离矩阵已经加载成功,函数的返回值可能如下所示:
(
[[4.0, 5.0, 0.0], [3.0, 0.0, 2.0], [0.0, 4.0, 5.0]], # 评分矩阵
LabelEncoder(), # 用户标签编码器
LabelEncoder(), # 电影标签编码器
[[0.0, 1.414, 2.828], [1.414, 0.0, 1.414], [2.828, 1.414, 0.0]] # 电影之间的距离矩阵
)
请注意,实际的返回值将根据项目中的数据文件而有所不同。
FunctionDef _determine_whether_to_leave(self, t, action)
_determine_whether_to_leave: 该函数的功能是决定用户是否离开。
参数:
t
: 当前时间步。action
: 当前采取的行动。
代码描述:
此函数用于在模拟环境中判断用户是否选择离开。它首先检查是否为模拟的第一时间步(t == 0
),如果是,则用户不会离开,返回False
。
接下来,函数通过注释掉的代码块展示了如何使用调试信息,例如计算self.mat_distance
(用户与电影之间的距离矩阵)的百分位数,以及如何绘制该矩阵的直方图。这部分代码对于理解函数的运行逻辑不是必需的,但对于调试和理解数据分布可能很有帮助。
核心逻辑在于计算window_actions
,这是一个包含从t - self.num_leave_compute
到t
时间步内用户行动的序列。然后,函数计算dist_list
,这是一个数组,包含当前行动与window_actions
中每个行动之间的距离。如果dist_list
中的任何一个距离小于预设的离开阈值self.leave_threshold
,则函数返回True
,表示用户选择离开;否则,返回False
。
注意:
- 该函数依赖于
self.mat_distance
来获取用户与电影之间的距离,确保在调用此函数前self.mat_distance
已正确初始化。 self.num_leave_compute
是一个重要的参数,它决定了在判断用户是否离开时考虑的行动序列的长度。确保这个参数根据环境和需求被适当设置。- 虽然函数中包含了调试代码,但在实际使用时应该将这些代码注释掉,以避免不必要的计算和输出。
输出示例:
- 如果用户决定离开,函数返回
True
。 - 如果用户决定留下,函数返回
False
。