推荐引擎 recommendation-engine

推荐引擎是一种人工智能技术,用于设计和实现个性化推荐系统,通过分析用户行为和数据,提供产品或内容建议。关键技术包括协同过滤、矩阵分解、混合方法,并解决冷启动、数据稀疏性等常见问题。适用于电商、媒体、社交平台等领域,提升用户体验和商业价值。关键词:推荐系统,协同过滤,矩阵分解,个性化推荐,冷启动,数据稀疏性,评估指标。

AI应用 0 次安装 0 次浏览 更新于 3/7/2026

名称: 推荐引擎 描述: 使用协同过滤、矩阵分解、混合方法构建推荐系统。用于产品推荐、个性化,或遇到冷启动、稀疏性、质量评估问题。 关键词: 推荐引擎, 协同过滤, 矩阵分解, SVD, ALS, NMF, 用户协同过滤, 项目协同过滤, 冷启动, precision@k, recall@k, NDCG, 混合推荐器, 内容过滤, 余弦相似度, 隐式反馈, 评估指标, 多样性, 覆盖率 许可证: MIT

推荐引擎

构建推荐系统,提供个性化内容和产品建议。

推荐方法

方法 工作原理 优点 缺点
协同过滤 用户-项目交互 发现隐藏模式 冷启动
内容过滤 项目特征 适用于新项目 发现有限
混合方法 结合两者 两者最佳 复杂

协同过滤

import numpy as np
from scipy.sparse import csr_matrix
from sklearn.metrics.pairwise import cosine_similarity

class CollaborativeFilter:
    def __init__(self):
        self.user_similarity = None
        self.item_similarity = None

    def fit(self, user_item_matrix):
        # 用户相似度
        self.user_similarity = cosine_similarity(user_item_matrix)
        # 项目相似度
        self.item_similarity = cosine_similarity(user_item_matrix.T)

    def recommend_for_user(self, user_id, n=10):
        scores = self.user_similarity[user_id].dot(self.user_item_matrix)
        # 排除已交互项目
        already_interacted = self.user_item_matrix[user_id].nonzero()[0]
        scores[already_interacted] = -np.inf
        return np.argsort(scores)[-n:][::-1]

矩阵分解 (SVD)

from sklearn.decomposition import TruncatedSVD

class MatrixFactorization:
    def __init__(self, n_factors=50):
        self.svd = TruncatedSVD(n_components=n_factors)

    def fit(self, user_item_matrix):
        self.user_factors = self.svd.fit_transform(user_item_matrix)
        self.item_factors = self.svd.components_.T

    def predict(self, user_id, item_id):
        return np.dot(self.user_factors[user_id], self.item_factors[item_id])

混合推荐器

class HybridRecommender:
    def __init__(self, collab_weight=0.7, content_weight=0.3):
        self.collab = CollaborativeFilter()
        self.content = ContentBasedFilter()
        self.weights = (collab_weight, content_weight)

    def recommend(self, user_id, n=10):
        collab_scores = self.collab.score(user_id)
        content_scores = self.content.score(user_id)
        combined = self.weights[0] * collab_scores + self.weights[1] * content_scores
        return np.argsort(combined)[-n:][::-1]

评估指标

  • Precision@K, Recall@K
  • NDCG (排名质量)
  • 覆盖率 (目录多样性)
  • A/B测试转化率

冷启动解决方案

  • 新用户: 热门项目、入门偏好、基于人口统计
  • 新项目: 内容启动、主动学习
  • 探索策略: ε-greedy, Thompson抽样多臂老虎机

快速入门: 5步构建推荐器

from scipy.sparse import csr_matrix
import numpy as np

# 1. 准备用户-项目交互矩阵
# 行 = 用户, 列 = 项目, 值 = 评分/交互
ratings_data = [(0, 5, 5), (0, 10, 4), (1, 5, 3), ...]  # (用户, 项目, 评分)
n_users, n_items = 1000, 5000

row_idx = [r[0] for r in ratings_data]
col_idx = [r[1] for r in ratings_data]
ratings = [r[2] for r in ratings_data]
user_item_matrix = csr_matrix((ratings, (row_idx, col_idx)), shape=(n_users, n_items))

# 2. 选择并训练模型
from recommendation_engine import ItemBasedCollaborativeFilter  # 参见参考文献

model = ItemBasedCollaborativeFilter(similarity_metric='cosine', k_neighbors=20)
model.fit(user_item_matrix)

# 3. 生成推荐
recommendations = model.recommend(user_id=42, n=10)
print(recommendations)  # [(项目id, 分数), ...]

# 4. 在测试集上评估
from evaluation_metrics import precision_at_k, recall_at_k

test_items = {42: {10, 25, 30}}  # 用户42的真实相关项目
rec_items = [item for item, score in recommendations]

precision = precision_at_k(rec_items, test_items[42], k=10)
recall = recall_at_k(rec_items, test_items[42], k=10)
print(f"Precision@10: {precision:.3f}, Recall@10: {recall:.3f}")

# 5. 处理冷启动
from cold_start import PopularityRecommender

popularity_model = PopularityRecommender()
popularity_model.fit(interactions_with_timestamps)
new_user_recs = popularity_model.recommend(n=10)

已知问题预防

1. 流行度偏差

问题: 只推荐热门项目,忽略长尾。减少多样性和惊喜感。

解决方案: 平衡流行度与个性化,应用重新排序以增加多样性:

def diversify_recommendations(
    recommendations: List[Tuple[int, float]],
    item_features: np.ndarray,
    diversity_weight: float = 0.3
) -> List[Tuple[int, float]]:
    """重新排序以增加多样性,同时保持相关性。"""
    from sklearn.metrics.pairwise import cosine_distances

    selected = []
    candidates = recommendations.copy()

    while len(selected) < len(recommendations) and candidates:
        if not selected:
            # 第一个项目: 最高分数
            selected.append(candidates.pop(0))
            continue

        # 计算多样性分数
        selected_features = item_features[[item for item, _ in selected]]
        diversity_scores = []

        for item, relevance in candidates:
            item_feature = item_features[item].reshape(1, -1)
            # 平均距离到已选项目
            avg_distance = cosine_distances(item_feature, selected_features).mean()
            # 组合分数: 相关性 + 多样性
            combined = (1 - diversity_weight) * relevance + diversity_weight * avg_distance
            diversity_scores.append((item, relevance, combined))

        # 选择最佳组合分数的项目
        best = max(diversity_scores, key=lambda x: x[2])
        selected.append((best[0], best[1]))
        candidates = [(i, s) for i, s, _ in diversity_scores if i != best[0]]

    return selected

2. 数据稀疏性 (矩阵 >99% 空)

问题: 协同过滤在大多数用户评分 <1% 项目时失败。

解决方案: 使用矩阵分解 (SVD, ALS) 替代基于内存的协同过滤:

# ❌ 差: 在稀疏数据上使用用户协同过滤 (无法找到相似用户)
user_cf = UserBasedCollaborativeFilter()
user_cf.fit(sparse_matrix)  # 大多数用户有 <10 评分

# ✅ 好: 矩阵分解处理稀疏性
from sklearn.decomposition import TruncatedSVD

svd = TruncatedSVD(n_components=50)
user_factors = svd.fit_transform(sparse_matrix)
item_factors = svd.components_.T

# 预测评分: user_factors[u] @ item_factors[i]

3. 冷启动无回退

问题: 推荐器对新用户/项目崩溃或返回空结果。

解决方案: 始终实施回退链:

def recommend_with_fallback(user_id, n=10):
    """通过回退链优雅降级。"""
    try:
        # 尝试个性化推荐
        if has_sufficient_history(user_id, min_interactions=5):
            return collaborative_filter.recommend(user_id, n)
    except Exception as e:
        logger.warning(f"协同过滤对用户 {user_id} 失败: {e}")

    # 回退 1: 基于人口统计
    if user_demographics_available(user_id):
        return demographic_recommender.recommend(user_id, n)

    # 回退 2: 流行度
    return popularity_recommender.recommend(n)

4. 不排除已交互项目

问题: 推荐用户已购买/查看的项目浪费推荐槽位。

解决方案: 始终过滤交互项目:

# ✅ 正确: 排除交互项目
user_items = user_item_matrix[user_id].nonzero()[1]
scores[user_items] = -np.inf  # 确保它们不出现在 top-K
recommendations = np.argsort(scores)[-n:][::-1]

# ❌ 错误: 忘记过滤
recommendations = np.argsort(scores)[-n:][::-1]  # 可能包括已购买项目!

5. 忽略隐式反馈置信度

问题: 平等对待所有点击/查看。1 次查看 ≠ 100 次查看。

解决方案: 按交互强度加权 (查看次数、观看时间等):

# 对于隐式反馈,使用置信度加权
confidence_matrix = 1 + alpha * np.log(1 + interaction_counts)

# 在 ALS 中: C_ui * (P_ui - X_ui)²
# 更多交互的项目有更高置信度

6. 不评估排名质量 (仅使用准确性)

问题: 高预测准确性 (RMSE) 不意味着好的 top-K 推荐。

解决方案: 使用排名指标 (NDCG, MAP@K):

# ❌ 差: 仅 RMSE
from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_true, y_pred))

# ✅ 好: 用于 top-K 评估的排名指标
from evaluation_metrics import ndcg_at_k, mean_average_precision_at_k

# NDCG 奖励将高相关项目放在前面
ndcg = ndcg_at_k(recommendations, relevance_scores, k=10)

# MAP@K 考虑每个相关项目位置的精度
map_score = mean_average_precision_at_k(all_recommendations, ground_truth, k=10)

7. 过滤泡沫 (缺乏探索)

问题: 总是推荐相似项目限制发现,减少用户参与度。

解决方案: 实施探索-利用策略:

class ExploreExploitRecommender:
    def __init__(self, base_model, epsilon=0.1):
        self.base_model = base_model
        self.epsilon = epsilon  # 10% 探索

    def recommend(self, user_id, n=10):
        # 利用: 使用训练模型进行大多数推荐
        n_exploit = int(n * (1 - self.epsilon))
        exploitative_recs = self.base_model.recommend(user_id, n=n_exploit)

        # 探索: 添加随机多样项目
        n_explore = n - n_exploit
        explored_items = sample_diverse_items(n_explore)

        return exploitative_recs + explored_items

何时加载参考文献

当需要详细实现时加载参考文件:

  • 协同过滤: 加载 references/collaborative-filtering-deep-dive.md 获取完整的用户协同过滤和项目协同过滤实现,包括相似度指标 (余弦、皮尔逊、杰卡德)、可扩展性优化 (稀疏矩阵、近似最近邻) 和边缘情况处理 (冷启动、稀疏性)

  • 矩阵分解: 加载 references/matrix-factorization-methods.md 获取 SVD、ALS 和 NMF 实现,包括超参数调优、隐式反馈处理和高级技术 (BPR、WARP)

  • 评估指标: 加载 references/evaluation-metrics-implementation.md 获取 Precision@K、Recall@K、NDCG、覆盖率、多样性指标、交叉验证策略和统计显著性测试 (配对 t-检验、bootstrap 置信区间)

  • 冷启动解决方案: 加载 references/cold-start-strategies.md 获取新用户/项目策略 (基于流行度、入门、人口统计、内容启动、主动学习)、探索-利用方法 (ε-greedy、Thompson 抽样) 和混合回退链