第十六章 推荐系统

基于物品推荐

它通过计算不同商品之间的相似度来推荐与用户已知喜好相似的商品。这种方法不需要用户的历史行为序列,而是直接基于用户过去的行为(例如购买记录、评分历史等)来寻找相似的商品进行推荐。

  1. 数据收集
    • 收集用户的行为数据,如购买记录、评分等。
  2. 构建用户-商品矩阵
    • 创建一个用户-商品的评分或交互矩阵。该矩阵的行对应用户,列对应商品,矩阵中的每个元素表示用户对商品的评分或者是否发生过交互。
  3. 计算商品间的相似度
    • 利用某种相似度度量方法来计算商品之间的相似度。常见的相似度计算方法包括余弦相似度、皮尔逊相关系数、Jaccard 相似度等。
  4. 生成推荐列表
    • 对于每个用户,找到他们已经评分或交互过的商品,然后根据这些商品与其他商品之间的相似度来选择推荐的商品集合。
  5. 排序推荐列表
    • 根据商品的相似度得分对推荐的商品进行排序,通常推荐得分最高的商品给用户。

假设我们有一个用户-商品的评分数据集,我们将使用余弦相似度来计算商品间的相似性。

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from scipy.sparse import csr_matrix

# 示例数据
data = {
    'UserID': [1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5],
    'ProductID': [1, 2, 3, 1, 2, 1, 2, 1, 2, 3, 1],
    'Rating': [5, 3, 4, 4, 2, 3, 1, 4, 5, 3, 4]
}

# 转换为 DataFrame
df = pd.DataFrame(data)

# 创建用户-商品的评分矩阵
pivot_table = df.pivot(index='ProductID', columns='UserID', values='Rating').fillna(0)
pivot_matrix = pivot_table.values

# 转换为稀疏矩阵
sparse_matrix = csr_matrix(pivot_matrix)

# 计算商品间的余弦相似度
product_similarity = cosine_similarity(sparse_matrix)

# 获取用户已评分的商品
user_rated_products = df[df['UserID'] == 5]['ProductID'].tolist()

# 推荐未评分的商品
all_products = pivot_table.index.tolist()
unrated_products = list(set(all_products) - set(user_rated_products))

# 为 unrated_products 中的每一个商品计算相似度得分
recommendations = []
for product in unrated_products:
    similarity_scores = [(similarity, product) for product_id, similarity in enumerate(product_similarity[product - 1]) if not product_id == product -1 ]
    similarity_scores = sorted(similarity_scores, key=lambda x: x[0], reverse=True)
    recommendations.extend(similarity_scores[:10])  # 选取前 10 个最相似的商品

# 排序并输出推荐的商品
recommendations = sorted(recommendations, key=lambda x: x[0], reverse=True)
recommended_products = [product for similarity, product in recommendations if product not in user_rated_products][:10]
print("Recommended products:", set(recommended_products))

在这个示例中,我们首先构造了一个用户-商品的评分矩阵,然后利用 cosine_similarity 函数计算了商品之间的相似度。最后,我们根据用户已有的评分记录来推荐相似的商品。

基于用户推荐

基于用户的协同过滤推荐系统是一种推荐算法,它通过分析用户之间的相似性来为用户推荐新的物品。这种推荐方法的基本思想是找到与目标用户兴趣相似的其他用户,然后推荐这些相似用户喜欢的物品给目标用户。

pip install pandas scikit-learn
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 示例数据集
ratings_data = {
    'UserID': [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5],
    'ItemID': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
    'Rating': [5, 3, 2, 4, 3, 1, 3, 2, 4, 2, 4, 5, 1]
}

# 创建 DataFrame
ratings_df = pd.DataFrame(ratings_data)

# 构建用户-物品评分矩阵
user_item_ratings = ratings_df.pivot(index='UserID', columns='ItemID', values='Rating').fillna(0)

# 计算用户间相似度
user_similarity = cosine_similarity(user_item_ratings)


# 定义一个函数来获取推荐物品
def get_recommendations(user_id, num_recommendations=3):
    # 获取该用户已评分的物品
    rated_items = ratings_df[ratings_df['UserID'] == user_id]['ItemID']

    # 找到与目标用户最相似的用户
    similar_users = np.argsort(user_similarity[user_id - 1])[::-1][1:num_recommendations + 1]

    # 获取这些相似用户的评分记录
    similar_user_ratings = user_item_ratings.iloc[similar_users]

    # 计算未评分物品的预测评分
    unrated_items = user_item_ratings.drop(rated_items, errors='ignore').columns
    unrated_item_ratings = similar_user_ratings[unrated_items].mean(axis=0)

    # 获取最高评分的未评分物品
    top_unrated_items = unrated_items[np.argsort(unrated_item_ratings)[::-1]].tolist()

    # 返回推荐物品
    return top_unrated_items[:num_recommendations]


# 为用户 5 推荐物品
recommendations_for_user_1 = get_recommendations(5)
print("Recommendations for User 1:", recommendations_for_user_1)

在这个示例中,我们做了以下几点:

  1. 创建了一个包含用户-物品评分数据的数据集。
  2. 使用pivot方法创建了用户-物品评分矩阵。
  3. 使用cosine_similarity函数计算用户之间的相似度。
  4. 定义了一个函数get_recommendations来为指定的用户生成推荐物品列表。

这个函数的工作流程如下:

  1. 获取用户已经评价过的物品。
  2. 找到与目标用户最相似的其他用户。
  3. 获取这些相似用户的评分记录,并计算未评分物品的预测评分。
  4. 根据预测评分排序并返回评分最高的几个物品作为推荐结果。

基于内容推荐

基于基于内容的推荐(Content-Based Recommendation)是一种推荐系统技术,它主要依赖于物品的内容特征(如文本描述、属性标签等)和用户的偏好历史来为用户推荐新的物品。这种类型的推荐系统特别适合那些用户有明确偏好的场景,并且可以较好地解决冷启动问题(即新用户或新物品加入系统时如何推荐的问题)。

  1. 用户画像构建
    • 分析用户的历史行为(如观看、收藏、购买等),提取出用户的偏好特征。
    • 可能会使用机器学习模型来帮助理解用户的兴趣点。
  2. 物品特征提取
    • 从物品的描述中提取关键特征(如关键词、类别标签等)。
    • 物品的特征可以通过人工定义,也可以使用自然语言处理技术自动获取。
  3. 相似度计算
    • 使用某种度量方式来计算用户偏好与物品特征之间的相似度。常见的度量方式包括余弦相似度、欧几里得距离等。
  4. 个性化推荐
    • 根据用户偏好和物品特征之间的相似度,为用户推荐他们可能感兴趣的物品。

为了更好地说明基于内容的推荐系统的运作过程,我们可以考虑一个具体的例子:一个电影推荐系统。

假设我们已经有了用户对某些电影的评分记录,以及每部电影的一些元数据(如导演、演员、类型、简介等)。我们可以按照以下步骤来构建一个简单的基于内容的推荐系统:

  1. 数据准备
    • 收集用户评分数据和电影元数据。
  2. 特征提取
    • 为每部电影创建一个特征向量,包含导演、演员、类型等信息。
    • 将文本信息转换成数值向量,例如使用词袋模型(Bag-of-Words)、TF-IDF 或者预训练的词嵌入模型(如Word2Vec、GloVe)。
  3. 用户偏好建模
    • 为每位用户创建一个偏好向量,该向量是用户评价过的所有电影特征向量的加权平均。
    • 加权的方式可以简单地取均值,也可以使用用户评分作为权重。
  4. 计算相似度
    • 使用余弦相似度计算用户偏好向量与未观看电影的特征向量之间的相似度。
  5. 推荐生成
    • 根据相似度为每个用户推荐未观看过的电影。

接下来,我将给出一个基于内容的推荐系统的简单Python实现示例。这里我们假设有一个包含电影元数据和用户评分的数据集。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 示例数据
movies_data = {
    'MovieID': [1, 2, 3, 4, 5],
    'Title': ['The Dark Knight', 'Inception', 'Interstellar', 'Pulp Fiction', 'The Godfather'],
    'Director': ['Christopher Nolan', 'Christopher Nolan', 'Christopher Nolan', 'Quentin Tarantino', 'Francis Ford Coppola'],
    'Actors': ['Christian Bale, Heath Ledger', 'Leonardo DiCaprio, Joseph Gordon-Levitt', 'Matthew McConaughey, Anne Hathaway', 'John Travolta, Samuel L. Jackson', 'Marlon Brando, Al Pacino'],
    'Genres': ['Action, Crime, Drama', 'Action, Adventure, Sci-Fi', 'Adventure, Drama, Sci-Fi', 'Crime, Drama', 'Crime, Drama']
}

ratings_data = {
    'UserID': [1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5],
    'MovieID': [1, 2, 1, 3, 2, 4, 1, 3, 5, 2, 5],
    'Rating': [5, 4, 4, 3, 3, 4, 4, 5, 3, 4, 3]
}

# 创建 DataFrame
movies_df = pd.DataFrame(movies_data)
ratings_df = pd.DataFrame(ratings_data)

# 构建用户-电影评分矩阵
user_movie_ratings = ratings_df.pivot(index='UserID', columns='MovieID', values='Rating').fillna(0)

# 构建电影特征矩阵
movie_features = movies_df[['Title', 'Director', 'Actors', 'Genres']].apply(lambda x: ' '.join(x), axis=1)
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(movie_features)

# 计算用户偏好向量
user_preferences = user_movie_ratings.apply(lambda x: (tfidf_matrix.T * x).sum(axis=1), axis=1)

# 计算相似度
user_preferences_matrix = user_preferences.values
similarity_matrix = cosine_similarity(user_preferences_matrix)

# 为每个用户推荐电影
def recommend_movies(user_id, n_recommendations=3):
    user_index = user_movie_ratings.index.get_loc(user_id)
    similarities = list(enumerate(similarity_matrix[user_index]))
    similarities = sorted(similarities, key=lambda x: x[1], reverse=True)
    movie_indices = [i[0] for i in similarities if i[0] != user_index][:n_recommendations]
    
    recommended_movies = movies_df.loc[movie_indices, 'Title'].tolist()
    return recommended_movies

# 为用户 1 推荐电影
recommended_movies = recommend_movies(1)
print("Recommended Movies for User 1:", recommended_movies)

在这个示例中,我们首先创建了一个电影数据集,包含了电影的标题、导演、演员和类型。然后,我们创建了一个用户评分数据集,其中包括用户对某些电影的评分。接着,我们使用 TF-IDF 向量化技术将电影的元数据转换为特征向量,并计算用户偏好向量。最后,我们使用余弦相似度来计算用户偏好向量与电影特征向量之间的相似度,并为用户推荐未观看过的电影。

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值