From 190083cfd033e16e48a6a4fef5d4a9fd7b074621 Mon Sep 17 00:00:00 2001 From: marslbr Date: Thu, 30 Oct 2025 18:53:03 +0800 Subject: [PATCH] =?UTF-8?q?251029=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 推荐系统/main.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/推荐系统/main.py b/推荐系统/main.py index e36f9b8..ab5da7f 100644 --- a/推荐系统/main.py +++ b/推荐系统/main.py @@ -29,7 +29,7 @@ class InitializationArguments(BaseModel): # 时间窗口(单位为天),平衡实时性和运算效率 time_window: int = Field(default=30, ge=5, le=360) - # 衰减因子兰布达系数,控制兴趣分数衰减速率 + # 衰减因子兰布达系数,控制兴趣分数衰减速率(默认不衰减) decay_lambda: float = Field(default=0, ge=0.00, le=10) # 用户特征向量维度数 attributes_dimensions: int = Field(default=10, ge=2.00, le=200) @@ -210,9 +210,9 @@ class RecommenderSystem: # 根据行为类型获取兴趣基础分数和衰减权重 score_base, weight = self.behavior_arguments[type_] - # 若行为类型为评分则将基础分数转化为0.2~0.8 + # 若行为类型为评分则将评分转为基础分数(基于最小值-最大值归一化为0.2~1.0) if type_ == "rating": - score_base = 0.1 + 0.8 * (1 / (1 + numpy.exp(3 - rating))) + score_base = 0.2 * (rating - 1) + 0.2 return score_base * numpy.exp(0 - time_interval * (self.decay_lambda * weight)) @@ -259,8 +259,6 @@ class RecommenderSystem: # 基于物品的协同过滤生成推荐物品标识列表 candidates_items = self._generate_items_candidates(user=user, k=k) - print(candidates_items) - # 基于用户的协同过滤生成推荐物品标识列表 candidates_users = self._generate_users_candidates(user=user, k=k) @@ -327,18 +325,17 @@ class RecommenderSystem: else 0 ) - # 流行度抑制因子 - popularity_suppressed = len( - list(set(users_heuristic) & set(users_recall)) - ) / numpy.sqrt(len(users_heuristic) * len(users_recall)) + print(pair, similarity) # 加权物品的相似度 items_recall[item_recall]["scores"] += ( - behaviors["scores"][item_heuristic] - * similarity - * popularity_suppressed + behaviors["scores"][item_heuristic] * similarity ) + print(items_recall) + + exit() + return self._normalize_scores(items_recall=items_recall, k=k) # 基于用户协同过滤算法生成候选物品标识列表 @@ -385,8 +382,6 @@ class RecommenderSystem: # 候选物品标识列表 candidates = defaultdict(float) - print(items_recall) - if items_recall: scores = [value["scores"] for value in items_recall.values()] @@ -428,7 +423,7 @@ if __name__ == "__main__": "user": "aaaaaa", "item": "111111", "type_": "rating", - "timestamp": int(time.time() - 3600), + "timestamp": int(time.time() - 3200), "rating": 4, }, {