推荐系统去偏实战:5种常见偏差类型及Python代码解决方案

# 推荐系统去偏实战:5种常见偏差类型及Python代码解决方案 如果你在推荐系统项目里待过一段时间,大概率会碰到这样的场景:离线指标明明刷得很高,AUC、NDCG都挺漂亮,可一上线AB测试,点击率、转化率纹丝不动,甚至还会掉。问题出在哪?很多时候,答案就藏在“偏差”这两个字里。我们训练模型用的数据,并不是上帝视角下均匀、随机采样的理想数据,而是被系统自身、用户行为、界面设计等各种因素“污染”过的观测数据。直接在这些数据上闷头训练,模型学到的可能不是用户的真实偏好,而是数据收集过程中产生的各种“假象”。 这篇文章,我们不谈空泛的理论,直接切入工程实战。我会结合自己踩过的坑,重点剖析推荐系统中五种最高频、最棘手的偏差类型:**选择偏差、曝光偏差、位置偏差、流行度偏差和一致性偏差**。针对每一种偏差,我会解释它为什么会产生、如何影响模型,并给出可直接在PyTorch或TensorFlow中复用的核心代码解决方案。我们的目标很明确:让你拿到代码就能理解,理解后就能快速集成到自己的线上系统,去解决那些令人头疼的AB测试不涨点问题。 ## 1. 理解偏差的根源:从理想世界到观测数据 在开始技术细节之前,我们得先达成一个共识:推荐系统的数据天生就是“脏”的。想象一个理想的实验环境:系统随机地向用户展示所有商品,然后无差别地记录下用户的每一次点击、购买、评分。这样得到的数据分布,才能真实反映用户的偏好。但现实是,我们看到的交互数据,是经过重重过滤的结果。 首先,**系统本身就在做筛选**。昨天的推荐模型决定了今天用户能看到什么,用户只能在这些被曝光的内容里做出选择。其次,**用户有自己的行为惯性**。他们倾向于点击排在列表前面的内容,倾向于给极端喜欢或讨厌的商品打分,也容易受到大众评价的影响。最后,**数据本身存在马太效应**。热门商品因为曝光多,获得更多互动,变得更热门,进一步挤压长尾商品的生存空间。 这一系列因素交织在一起,形成了一个“偏差反馈回路”:有偏的数据训练出有偏的模型,有偏的模型产生有偏的推荐,进而收集到更有偏的数据。打破这个循环,就是我们做“去偏”的核心意义。它不是单纯为了提升某个离线指标,而是为了让模型逼近用户的真实兴趣,在动态的线上环境中获得稳定、可持续的效果提升。 接下来的章节,我们将逐一拆解这些具体的偏差。我会用“问题定义 -> 影响分析 -> 解决方案 -> 代码实现”的结构,确保每一步都落到实处。 ## 2. 选择偏差:当“沉默”不等于“不喜欢” **问题定义**:选择偏差在显式反馈(如评分)场景中最为典型。用户不会给看过的每一部电影打分,他们只给自己想评分的电影打分。这导致我们观测到的评分数据并不是一个随机样本,而是用户主动选择后的结果。在学术上,这被称为“数据非随机缺失”。一个热爱科幻片的用户给《星际穿越》打了5分,但他没打分的其他科幻片,不代表他只给1分,可能只是他还没看。 **核心影响**:如果我们简单地把有评分的数据当作正样本,把没评分的数据都当作负样本或忽略,那么训练出的模型会严重高估用户的评分意愿(偏向于他们愿意打分的物品),无法准确预测用户对那些“沉默”物品的真实评价。 **实战解决方案:逆倾向评分** 目前工业界最主流且经过验证的方法是**逆倾向评分**。其核心思想是为每一个观测到的数据点赋予一个权重,这个权重是该数据点被观测到的概率的倒数。这样,那些“难得被观测到”的数据(比如冷门商品获得评分),在训练中会获得更高的权重,从而纠正样本分布的不均衡。 这里的关键在于如何估计这个“被观测到的概率”,即倾向分。一个经典且实用的方法是基于物品的流行度(曝光次数)和用户的活跃度(评分次数)进行启发式估计。 ```python import torch import numpy as np from sklearn.linear_model import LogisticRegression def calculate_propensity_scores(train_data, item_popularity, user_activity, alpha=1.0): """ 计算逆倾向得分 (IPS) 的启发式方法。 Args: train_data: 三元组列表 (user_id, item_id, rating) item_popularity: 字典,item_id -> 曝光次数或历史交互次数 user_activity: 字典,user_id -> 历史评分次数 alpha: 平滑系数,防止除零或权重过大 Returns: propensity_scores: 字典,(user_id, item_id) -> 倾向得分 ips_weights: 字典,(user_id, item_id) -> IPS权重 (1/score) """ propensity_scores = {} ips_weights = {} # 归一化流行度和活跃度(对数平滑是常见做法) max_pop = max(item_popularity.values()) if item_popularity else 1 max_act = max(user_activity.values()) if user_activity else 1 for uid, iid, _ in train_data: pop = item_popularity.get(iid, 0) act = user_activity.get(uid, 0) # 启发式公式:观测概率与物品流行度、用户活跃度正相关 # 使用对数并加1平滑,然后归一化到(0,1)区间 pop_norm = np.log(pop + alpha) / np.log(max_pop + alpha) act_norm = np.log(act + alpha) / np.log(max_act + alpha) # 一个简单的组合:假设观测概率是两者乘积的线性函数,并用sigmoid约束范围 # 这里使用一个简化的线性模型,更复杂的可以用一个小神经网络来学习 raw_score = 0.3 * pop_norm + 0.7 * act_norm + 0.1 # 加一个偏置,保证不为零 propensity = 1 / (1 + np.exp(-raw_score)) # Sigmoid映射到(0,1) propensity_scores[(uid, iid)] = propensity ips_weights[(uid, iid)] = 1.0 / max(propensity, 1e-8) # 逆倾向权重,防止除零 return propensity_scores, ips_weights ``` 有了IPS权重,我们就可以在训练损失函数中应用它。以下是一个在PyTorch中实现加权矩阵分解的示例: ```python import torch.nn as nn import torch.nn.functional as F class WeightedMatrixFactorization(nn.Module): def __init__(self, n_users, n_items, embedding_dim): super().__init__() self.user_emb = nn.Embedding(n_users, embedding_dim) self.item_emb = nn.Embedding(n_items, embedding_dim) self.user_bias = nn.Embedding(n_users, 1) self.item_bias = nn.Embedding(n_items, 1) self.global_bias = nn.Parameter(torch.zeros(1)) # 初始化 nn.init.normal_(self.user_emb.weight, std=0.01) nn.init.normal_(self.item_emb.weight, std=0.01) def forward(self, user_ids, item_ids): u_emb = self.user_emb(user_ids) i_emb = self.item_emb(item_ids) pred = (u_emb * i_emb).sum(dim=1, keepdim=True) pred += self.user_bias(user_ids) + self.item_bias(item_ids) + self.global_bias return pred.squeeze() def ips_weighted_mse_loss(predictions, targets, ips_weights): """ 计算IPS加权的均方误差损失。 Args: predictions: 模型预测值,Tensor形状为 [batch_size] targets: 真实评分,Tensor形状为 [batch_size] ips_weights: IPS权重,Tensor形状为 [batch_size] Returns: loss: 加权后的MSE损失 """ squared_error = (predictions - targets) ** 2 weighted_error = squared_error * ips_weights # 对权重进行归一化,稳定训练 loss = weighted_error.sum() / ips_weights.sum() return loss ``` > **注意**:倾向分估计的准确性直接决定了IPS方法的效果。如果估计偏差很大,甚至会带来反效果。在实际项目中,我们通常会留出一小部分通过随机策略收集的**无偏数据**,专门用于验证倾向分模型或直接校准IPS权重。如果完全没有无偏数据,则需要通过线上AB实验来谨慎验证去偏效果。 ## 3. 曝光偏差与位置偏差:隐式反馈中的“双生”难题 在隐式反馈场景(如点击、观看时长)中,**曝光偏差**和**位置偏差**往往同时出现,相互纠缠。 **曝光偏差**是指用户只能与系统曝光给他们的物品产生交互。数据中那些“未交互”的记录,包含两种情况:用户真的不喜欢(真负例),或者用户根本没看到(曝光缺失)。把后者统统当作负例,会引入巨大的噪声。 **位置偏差**则更进一步:即使被曝光了,排在列表前列的物品也天然更容易获得点击,无论它是否最相关。用户可能只是因为顺手,或者出于对排名的信任而点击了第一个结果。 **联合解决方案:浅层塔网络** 业界一个经典且有效的工程实践,来自YouTube的推荐团队。他们提出在主模型旁并联一个**浅层塔网络**,专门用于建模位置、设备等带来的偏差。 这个方法的精妙之处在于: 1. **解耦**:主深度学习模型专注于学习用户和物品之间的本质相关性,而浅层网络负责吸收界面和上下文带来的偏差。 2. **可丢弃**:线上推理时,直接丢弃这个浅层塔,或者将其输入(如位置特征)设为一个固定值(如缺失值),从而得到“去偏”后的纯净相关性分数。 下面我们用PyTorch实现一个简化版本: ```python class DebiasRankingModel(nn.Module): """ 结合主模型和浅层偏差塔的排序模型。 主模型:学习用户-物品匹配度。 偏差塔:学习位置、设备等上下文偏差。 """ def __init__(self, main_model, bias_feature_dim, hidden_dim=64): super().__init__() self.main_model = main_model # 你的主推荐模型(双塔、DeepFM等) # 浅层偏差塔:通常2-3层,输入是位置、设备、时间等上下文特征 self.bias_tower = nn.Sequential( nn.Linear(bias_feature_dim, hidden_dim), nn.ReLU(), nn.Dropout(0.2), # 防止过度依赖偏差特征 nn.Linear(hidden_dim, 1) # 输出一个偏差分 ) def forward(self, user_features, item_features, bias_features, use_bias_tower=True): # 主模型计算匹配分 main_score = self.main_model(user_features, item_features) if use_bias_tower: # 偏差塔计算偏差分 bias_score = self.bias_tower(bias_features) # 将偏差分加到主分数上(在logit层面相加) final_score = main_score + bias_score return final_score, main_score, bias_score else: # 推理时,可以关闭偏差塔,只返回主模型分 return main_score def predict_debiased(self, user_features, item_features): """线上服务时调用,使用去偏后的预测""" # 将偏差特征置零或设为默认值,模拟“缺失” batch_size = user_features.shape[0] default_bias_features = torch.zeros(batch_size, self.bias_tower[0].in_features).to(user_features.device) # 这里我们选择不添加偏差分,直接返回主模型分 return self.forward(user_features, item_features, default_bias_features, use_bias_tower=False) ``` **训练技巧**: - 在训练时,可以随机将一小部分(如10%)样本的偏差特征(如位置)置为缺失,强制主模型不过度依赖位置信息。 - 偏差塔的网络结构一定要“浅”,防止它过于强大而学到了本应由主模型学习的用户真实偏好。 - 可以对偏差塔的输出施加L2正则,控制其影响范围。 下表对比了处理位置偏差的几种常见方法: | 方法 | 核心思想 | 优点 | 缺点 | 适用场景 | | :--- | :--- | :--- | :--- | :--- | | **位置作为特征** | 将位置编号作为特征输入模型,预测时置为固定值。 | 实现简单,易于集成。 | 假设过强,位置与其它特征交互复杂,固定值难以确定。 | 偏差相对简单,对效果不敏感的初期阶段。 | | **浅层塔网络** | 用独立小网络建模偏差,与主模型分数相加。 | 有效解耦偏差与相关性,线上可移除。 | 需要额外网络结构,训练需技巧。 | 工业界主流选择,尤其深度排序模型。 | | **点击模型** | 构建用户浏览的概率模型,从点击数据中反推相关性。 | 理论扎实,能建模复杂用户行为。 | 模型复杂,参数估计困难,计算开销大。 | 搜索、广告等对位置效应研究深入的场景。 | | **逆倾向加权** | 为不同位置的数据赋予不同权重(1/点击概率)。 | 无偏估计,理论保证。 | 倾向分(各位置点击率)估计不准会放大方差。 | 拥有大量随机流量数据可用于估计倾向分时。 | ## 4. 流行度偏差:打破“强者恒强”的马太效应 流行度偏差可能是最直观的偏差:热门商品占据了绝大部分的交互数据,导致模型疯狂地给热门商品打高分,形成“越热越推,越推越热”的循环。这损害了推荐的个性化、多样性和公平性。 **解决思路:因果干预与反事实推理** 近年来,基于因果推理的方法为流行度去偏提供了新的视角。其核心思想是将“物品流行度”视为一个混淆因子,它同时影响了物品是否被曝光(数据生成过程)和物品本身的属性(可能更优质)。我们需要做的,是切断“流行度”对“用户交互”的虚假因果路径,让模型只基于用户兴趣和物品本质属性进行预测。 一个代表性的框架是**MACR**。我们来实现其核心思想的一个简化版本: ```python class MACRDebiasModel(nn.Module): """ 模型无关的反事实推理去偏框架(简化版)。 包含三个模块:用户-物品匹配模块、物品模块、用户模块。 最终得分 = 匹配分 - 物品流行度分 - 用户活跃度分 """ def __init__(self, base_recommender, n_items, n_users, embedding_dim): super().__init__() self.base_recommender = base_recommender # 基础推荐模型 # 物品模块:仅根据物品ID预测其“固有”的受欢迎程度(与用户无关) self.item_pop_module = nn.Sequential( nn.Embedding(n_items, embedding_dim), nn.Linear(embedding_dim, 1) ) # 用户模块:仅根据用户ID预测其“固有”的点击倾向(与物品无关) self.user_act_module = nn.Sequential( nn.Embedding(n_users, embedding_dim), nn.Linear(embedding_dim, 1) ) def forward(self, user_ids, item_ids): # 基础匹配分数 base_score = self.base_recommender(user_ids, item_ids) # 物品流行度分数(反事实:如果所有用户都一样,这个物品会有多受欢迎?) item_pop_score = self.item_pop_module(item_ids) # 用户活跃度分数(反事实:如果所有物品都一样,这个用户会有多活跃?) user_act_score = self.user_act_module(user_ids) # 去偏后的分数:从基础分中减去仅由物品流行度和用户活跃度带来的影响 debiased_score = base_score - item_pop_score - user_act_score return debiased_score, base_score, item_pop_score, user_act_score def get_training_loss(self, user_ids, item_ids, labels): """MACR框架的多任务损失函数""" debiased_score, base_score, item_pop_score, user_act_score = self.forward(user_ids, item_ids) # 主任务损失:优化去偏后的分数 main_loss = F.binary_cross_entropy_with_logits(debiased_score, labels) # 辅助任务损失:确保物品模块和用户模块确实学到了东西 # 这里我们用一个简单的正则:鼓励物品模块输出与物品流行度正相关,用户模块输出与用户活跃度正相关 # 假设我们传入 item_popularity_tensor 和 user_activity_tensor item_pop_loss = F.mse_loss(item_pop_score.squeeze(), item_popularity_tensor[item_ids]) user_act_loss = F.mse_loss(user_act_score.squeeze(), user_activity_tensor[user_ids]) # 总损失 total_loss = main_loss + 0.1 * item_pop_loss + 0.1 * user_act_loss return total_loss ``` 这个框架的美妙之处在于它的“模型无关性”。你可以把 `base_recommender` 换成任何推荐模型(NCF、LightGCN等),去偏机制依然有效。线上服务时,直接使用 `debiased_score` 进行排序即可。 ## 5. 一致性偏差:从众心理下的评分失真 一致性偏差反映了用户的社交属性:他们的评分会不自觉地受到大众评价的影响。一个质量中等的电影,如果周围人都打高分,用户也可能打出比内心真实感受更高的分数。 **解决方案:分离社会影响与个人偏好** 处理一致性偏差,关键在于在特征或模型层面,将“社会共识”与“个人偏好”分离开。一个实用的工程方法是,在模型特征中同时引入**个人历史评分**和**物品的全局统计信息**(如平均分、评分分布、评分人数),让模型自己去学习两者各自的权重。 ```python import pandas as pd from sklearn.preprocessing import StandardScaler def build_conformity_aware_features(ratings_df): """ 构建包含一致性信息的特征。 Args: ratings_df: DataFrame,包含 columns: ['user_id', 'item_id', 'rating'] Returns: feature_df: 包含原始特征和一致性特征的DataFrame """ # 1. 计算物品侧的全局一致性特征 item_stats = ratings_df.groupby('item_id')['rating'].agg(['mean', 'std', 'count']).reset_index() item_stats.columns = ['item_id', 'item_avg_rating', 'item_rating_std', 'item_rating_cnt'] item_stats['item_rating_cnt_log'] = np.log1p(item_stats['item_rating_cnt']) # 2. 计算用户侧的个性化特征(用户平均评分) user_stats = ratings_df.groupby('user_id')['rating'].mean().reset_index() user_stats.columns = ['user_id', 'user_avg_rating'] # 3. 合并特征 feature_df = ratings_df.merge(item_stats, on='item_id', how='left') feature_df = feature_df.merge(user_stats, on='user_id', how='left') # 4. 构建关键交叉特征:用户评分与大众评分的差异 feature_df['rating_diff_from_avg'] = feature_df['rating'] - feature_df['item_avg_rating'] # 填充缺失值(对于新物品/新用户) feature_df.fillna({'item_avg_rating': 0, 'item_rating_std': 0, 'item_rating_cnt_log': 0, 'user_avg_rating': 0, 'rating_diff_from_avg': 0}, inplace=True) # 5. 标准化 scaler = StandardScaler() conformity_cols = ['item_avg_rating', 'item_rating_std', 'item_rating_cnt_log', 'user_avg_rating'] feature_df[conformity_cols] = scaler.fit_transform(feature_df[conformity_cols]) return feature_df # 假设我们使用一个梯度提升树模型(如XGBoost)来进行评分预测 import xgboost as xgb # 准备特征和标签 all_features = build_conformity_aware_features(ratings_df) X = all_features[['user_id', 'item_id', 'item_avg_rating', 'item_rating_cnt_log', 'user_avg_rating', 'rating_diff_from_avg']] y = all_features['rating'] # 训练模型 dtrain = xgb.DMatrix(X, label=y) params = {'objective': 'reg:squarederror', 'max_depth': 6, 'eta': 0.1} model = xgb.train(params, dtrain, num_boost_round=100) # 预测时,模型会综合个人偏好特征(user_id, item_id)和一致性特征(item_avg_rating等)做出判断。 # 通过特征重要性分析,我们可以观察“社会影响”和“个人偏好”各自占多大权重。 ``` 对于深度学习模型,我们可以在嵌入层之后,将用户嵌入、物品嵌入与这些统计特征拼接起来,一同输入到后续的全连接网络中进行学习。模型会隐式地学习到一个权衡参数。 ## 6. 构建去偏流水线:从离线实验到线上部署 掌握了针对单一偏差的武器后,我们需要一个系统化的方案来整合它们,因为真实场景中的偏差总是混合出现的。以下是一个建议的**去偏流水线**,你可以将其作为项目检查清单: 1. **诊断与评估**: * **分离无偏验证集**:这是最重要的一步。尽可能通过历史随机流量、小流量随机实验等方式,收集一个完全不受当前推荐策略影响的“无偏数据集”。用它作为模型效果的黄金标准。 * **偏差量化**:计算训练集中物品流行度的基尼系数、用户活跃度的分布、不同位置的CTR差异等,量化偏差的严重程度。 2. **数据预处理**: * **IPS权重计算**:针对选择偏差,基于启发式或简单模型计算倾向分和权重。 * **负采样策略**:针对曝光偏差,不要对所有未交互项做均匀负采样。可以考虑基于流行度的降权采样,或使用“曝光但未点击”作为高质量的负样本。 3. **模型设计与训练**: * **模型选择**:根据偏差类型选择或设计模型结构。例如,同时存在位置和流行度偏差时,可以设计一个包含“主模型塔”、“位置偏差塔”和“流行度修正模块”的复合模型。 * **多任务/正则化损失**:像MACR框架那样,通过辅助任务或正则化项,显式地约束模型不去学习虚假的偏差关联。 * **使用加权的损失函数**:在最终的损失函数中,融入IPS权重、流行度降权系数等。 4. **离线验证**: * **在无偏验证集上测试**:这是检验去偏效果的唯一可信标准。观察去偏后模型在无偏集上的指标(如NDCG)提升。 * **多样性/新颖性指标**:同时计算推荐列表的覆盖率、基尼系数、新颖性等,确保去偏没有损害生态健康。 5. **线上部署与监控**: * **A/B测试**:设计严谨的A/B实验,核心指标不仅是CTR/CVR,还要包括长尾商品曝光占比、用户满意度调查等。 * **持续监控**:建立偏差监控仪表盘,持续跟踪流行度集中度、新物品冷启动速度等指标,防止偏差回流。 **一个综合示例:融合多种技术的训练循环片段** ```python # 伪代码,展示训练循环中如何整合多种去偏技术 for epoch in range(num_epochs): for batch in train_loader: user_ids, item_ids, ratings, positions, contexts = batch # 1. 计算IPS权重(选择偏差) ips_weights = get_ips_weights(user_ids, item_ids) # 2. 计算流行度降权系数(流行度偏差) pop_discount = get_popularity_discount(item_ids) # 3. 前向传播:模型内部已包含位置偏差塔(位置偏差) pred_scores, main_scores, bias_scores = model(user_ids, item_ids, positions, contexts) # 4. 计算复合损失 # 基础MSE损失 base_loss = F.mse_loss(pred_scores, ratings) # IPS加权 weighted_loss = (base_loss * ips_weights).mean() # 流行度降权(对热门物品的预测误差惩罚更小) final_loss = weighted_loss * pop_discount.mean() # 5. 添加反事实正则项(如MACR思想) # 假设model返回了用于反事实分解的中间分数 cf_regularizer = compute_counterfactual_regularizer(main_scores, bias_scores) final_loss += cf_lambda * cf_regularizer # 反向传播与优化 optimizer.zero_grad() final_loss.backward() optimizer.step() ``` 去偏不是一劳永逸的银弹,而是一个需要持续迭代和监控的过程。不同的业务场景,偏差的主导类型和严重程度各不相同。从最重要的偏差入手,用无偏数据验证,通过线上实验谨慎推进,这才是算法工程师在解决推荐系统偏差问题时最踏实的路径。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

用Python写的电影推荐系统

用Python写的电影推荐系统

这是用Python写的一个电影推荐系统,希望对他人有帮助。

python电影推荐系统

python电影推荐系统

python电影推荐系统——实现用户登录、评分、推荐,采用协同过滤算法

python推荐系统合集含10套源码(探探项目、自动车牌推荐系统、网易云音乐推荐系统、电影、知识图谱的推荐系统、新闻推荐系统)

python推荐系统合集含10套源码(探探项目、自动车牌推荐系统、网易云音乐推荐系统、电影、知识图谱的推荐系统、新闻推荐系统)

python推荐系统合集含10套源码(探探项目、自动车牌推荐系统、网易云音乐推荐系统、电影推荐系统、商品top50推荐系统、基于知识图谱的推荐功能系统、新闻推荐系统采集自今日头条 ).zip

常见的Python代码报错及解决方案1

常见的Python代码报错及解决方案1

1、变量名错误(NameError): 2、语法错误(SyntaxError): 3、代码缩进错误(IndentationError): 4、输入法半角全角:

基于Movielens的推荐系统—评分预测  (Python3)

基于Movielens的推荐系统—评分预测 (Python3)

压缩文件中包含一下列表: 1,movielens 公开实验数据集(推荐系统研究经常用到~) 2,模拟预测评分的python代码(python3.x) 希望对大家学习有所帮助。有问题可以邮箱联系。

Python项目开发实战  源代码

Python项目开发实战 源代码

Python项目开发实战 (源代码)

python项目实战之在线电影推荐系统(源码+演示视频)

python项目实战之在线电影推荐系统(源码+演示视频)

python项目实战之在线电影推荐系统(源码+演示视频) 源码亲测可用,可做计算机毕业设计、课程设计等参考。

crab:基于python推荐系统框架

crab:基于python推荐系统框架

基于python开发的推荐系统框架 代码清晰明了,而且不断改进,值得一读 http://github.com/muricoca/crab 可以来这里看看

Python基于机器学习方法实现的电影推荐系统实例详解

Python基于机器学习方法实现的电影推荐系统实例详解

主要介绍了Python基于机器学习方法实现的电影推荐系统,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

python简单推荐系统(含完整代码).pdf

python简单推荐系统(含完整代码).pdf

python简单推荐系统(含完整代码).pdf

基于协同过滤的图书推荐系统python

基于协同过滤的图书推荐系统python

基于物品的协同过滤算法实现图书推荐系统,前后端一体,页面丰富,功能俱全。

基于python的推荐系统库

基于python的推荐系统库

经典的基于python的推荐系统类库,拿来改改可以用了。

Python实现图像去噪方式(中值去噪和均值去噪)

Python实现图像去噪方式(中值去噪和均值去噪)

今天小编就为大家分享一篇Python实现图像去噪方式(中值去噪和均值去噪),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

电影推荐系统的设计源码(基于Movielens数据集 Python3.x版本).zip

电影推荐系统的设计源码(基于Movielens数据集 Python3.x版本).zip

这是基于MovieLens数据集的电影推荐系统,可以实现电影推荐功能,可以部署到服务器,hadoop上面

Python数据分析实战源代码

Python数据分析实战源代码

资源合计6大章节。 资源包含了数据准备、数据处理、数据的可视化,包括爬虫(网页数据抓取)、MySQL的连接、以及数据分析项目,具备完整的一个数据分析的流程,其中每一个章节都是独立的一个模块。

Recommendation-System:推荐系统Python

Recommendation-System:推荐系统Python

基本电影推荐系统 推荐系统Python

BM3D去噪python代码

BM3D去噪python代码

BM3D在传统图像去噪方面效果是最好的,此代码需要安装opencv库

推荐系统实践.pdf,推荐系统实践pdf,Python

推荐系统实践.pdf,推荐系统实践pdf,Python

推荐系统实战课程,个性化推荐系统,智能推荐系统,机器学习算法

python 计算数据偏差和峰度的方法

python 计算数据偏差和峰度的方法

numpy.set_printtoptions(edgeitems=5):值过多,显示前5个和后5个 偏度:衡量随机分布的不均衡性,偏度=0,数值相对均匀的分布在两侧 峰度:概率密度在均值处峰值高低的特征 python计算数据均值、标准差、偏度、峰度: import numpy as np from scipy import stats x = np.random.randn(10000) mu = np.mean(x, axis=0) sigma = np.std(x, axis=0) skew = stats.skew(x) kurtosis = stats.kurtosis(x)

python实现照片图像去雾源代码

python实现照片图像去雾源代码

先我们使用的python版本是3.6.5所用到的模块如下: Pytorch模块用来模型训练和网络层建立;其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。不仅能够实现强大的GPU加速,同时还支持动态神经网络。 numpy模块用来进行数值运算处理矩阵运算; OpenCV用来读取图片和图像处理;

最新推荐最新推荐

recommend-type

package-storage:通过程序包注册服务提供的程序包的程序包存储

包装储物 这是通过程序包注册表服务提供的程序包的存储库。 有关基本注册表API的用法和示例,请参见。 package-storage库包含3个分支,其中包含针对不同环境的软件包: 快照 分期 生产 这些分支与存储库和程序包其他方面的关系如下。 快照 分期 生产 网址 如何添加包裹 致力于弹性/整合* 允许版本覆盖? 是的** 如果需要的话 不 允许版本删除? 是的 仅特殊例外 仅版本递增 堆栈版本与存储版本 所有-SNAPSHOT Kibana版本 所有发货或BC版本*** 注册表版本 固定开发或最新的稳定版本 稳定释放 稳定释放 分支 快照 分期 生产 配套 快照+分段+产品 分期+制作 生产 释放 手动的 手动的 手动的 Docker镜像 快照 分期 生产 * 是大多数软件包(尽管不是全部)的开发源。 包存储存储库的升级过程将在下面讨论。 **在使用某个软件包然后将
recommend-type

CentOS 8.0 安装docker 报错:Problem package docker-ce-3 19.03.4-3.el7.x86_64 require

文章目录CentOS 8.0 安装docker 报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1.2.2-31、错误内容2、分析原因3、解决4、检查是否安装成功 CentOS 8.0 安装docker 报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1.2.2-3 1、错误内容 package docker-ce-3:19.03.2-3.el7.x86_64 require
recommend-type

airflow-python-docker:使用Docker和Airflow为Python项目创建管道

Python和DockerOperator的气流示例 本示例说明如何使用Docker为Python项目中的不同步骤创建管道。 流水线中的几个步骤由不同的程序包表示。 在此示例中,我们创建了一个非常简单的管道: 下载一些数据, 预处理该数据, 处理数据 为了从我们的Python项目创建虚拟环境和wheel文件,我们使用 。 我们创建了一个使用docker-entrypoint shell脚本来区分运行不同Python软件包的Dockerfile。 在开始任何事情之前,您首先必须使用: poetry build来构建您的项目。 我们已将项目命名为airflow_example-0.1.0-py3-none-any.whl airflow-example ,因此使用build命令创建的wheel文件将在dist目录中可用,并将命名为airflow_example-0.1.0-py3-no
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,
recommend-type

桌面工具软件项目效益评估及市场预测分析

资源摘要信息:"桌面工具软件项目效益评估报告" 1. 市场预测 在进行桌面工具软件项目的效益评估时,首先需要对市场进行深入的预测和分析,以便掌握项目在市场上的潜在表现和风险。报告中提到了两部分市场预测的内容: (一) 行业发展概况 行业发展概况涉及对当前桌面工具软件市场的整体评价,包括市场规模、市场增长率、主要技术发展趋势、用户偏好变化、行业标准与规范、主要竞争者等关键信息的分析。通过这些信息,我们可以评估该软件项目是否符合行业发展趋势,以及是否能满足市场需求。 (二) 影响行业发展主要因素 了解影响行业发展的主要因素可以帮助项目团队识别市场机会与风险。这些因素可能包括宏观经济环境、技术进步、法律法规变动、行业监管政策、用户需求变化、替代产品的发展、以及竞争环境的变化等。对这些因素的细致分析对于制定有效的项目策略至关重要。 2. 桌面工具软件项目概论 在进行效益评估时,项目概论部分提供了对整个软件项目的基本信息,这是评估项目可行性和预期效益的基础。 (一) 桌面工具软件项目名称及投资人 明确项目名称是评估效益的第一步,它有助于区分市场上的其他类似产品和服务。同时,了解投资人的信息能够帮助我们评估项目的资金支持力度、投资人的经验与行业影响力,这些因素都能间接影响项目的成功率。 (二) 编制原则 编制原则描述了报告所遵循的基本原则,可能包括客观性、公正性、数据的准确性和分析的深度。这些原则保证了报告的有效性和可信度,同时也为项目团队提供了评估标准。基于这些原则,项目团队可以确保评估报告的每个部分都建立在可靠的数据和深入分析的基础上。 报告的其他部分可能还包括桌面工具软件的具体功能分析、技术架构描述、市场定位、用户群体分析、商业模式、项目预算与财务预测、风险分析、以及项目进度规划等内容。这些内容的分析对于评估项目的整体效益和潜在回报至关重要。 通过对以上内容的深入分析,项目负责人和投资者可以更好地理解项目的市场前景、技术可行性、财务潜力和潜在风险。最终,这些分析结果将为决策提供重要依据,帮助项目团队和投资者进行科学合理的决策,以期达到良好的项目效益。