协同过滤算法(collaborative filtering) 是比较经典常用的推荐算法,从1992年一直
协同过滤算法是一种经典常用的推荐算法,自1992年以来一直被广泛应用。它基于用户行为数据和相似性度量,通过分析用户的历史行为和喜好,利用其他用户的行为和喜好为目标用户提供个性化的推荐。
该算法的核心思想是通过收集和分析用户的历史行为数据,建立用户-物品的关系矩阵。这个矩阵表示了用户对物品的偏好程度,其中的每一个元素表示了用户对某个物品的评分或者喜好程度。然后,通过计算用户之间的相似度,找到与目标用户行为和兴趣相似的其他用户,从而基于其他用户的喜好为目标用户进行推荐。
协同过滤算法有两种主要的实现方式:基于用户的协同过滤和基于物品的协同过滤。基于用户的协同过滤方法是根据用户之间的相似度来进行推荐,即找到与目标用户兴趣最相近的其他用户,将这些用户喜欢的物品推荐给目标用户。而基于物品的协同过滤方法则是根据物品之间的相似度来进行推荐,即找到与目标用户已评价或喜欢的物品相似的其他物品,将这些物品推荐给目标用户。
协同过滤算法具有以下优点:简单、易于实现、适用于各种类型的物品和用户、能够为用户提供个性化的推荐、不需要事先对物品或用户进行标记分类。然而,该算法也存在一些限制,如数据稀疏问题、冷启动问题、用户和物品规模众多时计算复杂度高等。
总之,协同过滤算法是一种经典常用的推荐算法,通过分析用户行为和喜好,为用户提供个性化的推荐。在信息爆炸的今天,它在电商、社交媒体、音乐电影推荐等领域发挥着重要作用,并持续为用户提供优质的服务和体验。
基于用户协同过滤(User-Based Collaborative Filtering, UBCF)的推荐算法实现
基于用户协同过滤(UBCF)的推荐算法实现
1. 数据预处理
在 UBCF 中,数据预处理是一个重要的环节。它涉及将原始用户-物品交互矩阵转换为适合计算的形式。常见的做法是对评分数据进行标准化或归一化处理。
以下是 Python 实现中的数据预处理部分:
import pandas as pd
import numpy as np
def preprocess_data(ratings_df, user_col='user_id', item_col='item_id', rating_col='rating'):
"""
将评分数据转换为稀疏矩阵形式。
:param ratings_df: 用户-物品评分 DataFrame
:return: 转换后的用户-物品评分矩阵
"""
# 构建用户-物品评分矩阵
utility_matrix = ratings_df.pivot(index=user_col, columns=item_col, values=rating_col).fillna(0)
# 对每行(即每位用户)进行均值中心化
mean_ratings = utility_matrix.mean(axis=1)
normalized_matrix = utility_matrix.sub(mean_ratings, axis=0)
return normalized_matrix, mean_ratings
此函数会返回两个对象:一个是经过均值中心化的用户-物品评分矩阵 normalized_matrix
;另一个是每个用户的平均评分 mean_ratings
[^1]。
2. 计算用户相似度
为了找到与目标用户兴趣最接近的其他用户,可以采用余弦相似度或其他距离度量方法来衡量用户之间的相似程度。
下面是计算用户间相似性的代码片段:
from sklearn.metrics.pairwise import cosine_similarity
def calculate_user_similarity(normalized_matrix):
"""
使用余弦相似度计算用户间的相似性。
:param normalized_matrix: 归一化后的用户-物品评分矩阵
:return: 用户相似度矩阵
"""
similarity_matrix = cosine_similarity(normalized_matrix)
return pd.DataFrame(similarity_matrix, index=normalized_matrix.index, columns=normalized_matrix.index)
该函数接受规范化后的评分矩阵作为输入,并输出一个对称的用户相似度矩阵 similarity_matrix
。
3. 预测未知评分
预测某个用户未评价过的物品得分时,可以根据与其相似的邻居们的评分为依据加权求和得出估计分值。
具体逻辑如下所示:
def predict_ratings(user_id, items_to_predict, normalized_matrix, similarity_matrix, mean_ratings, k_neighbors=5):
"""
预测指定用户对某些项目的潜在评分。
:param user_id: 当前要预测的目标用户 ID
:param items_to_predict: 待预测项目列表
:param normalized_matrix: 已经标准化的评分表
:param similarity_matrix: 用户之间相似度表格
:param mean_ratings: 各位用户的平均打分数列
:param k_neighbors: 取最近邻的数量,默认取五个近邻
:returns: 返回字典 {item_id -> predicted_rating}
"""
predictions = {}
target_similarities = similarity_matrix[user_id].sort_values(ascending=False)[1:k_neighbors+1]
for item in items_to_predict:
weighted_sum = 0
total_weight = 0
for neighbor_id, sim_score in target_similarities.items():
if not np.isnan(normalized_matrix.loc[neighbor_id, item]):
weight = sim_score * normalized_matrix.loc[neighbor_id, item]
weighted_sum += weight
total_weight += abs(sim_score)
if total_weight != 0:
prediction = mean_ratings[user_id] + (weighted_sum / total_weight)
predictions[item] = max(min(prediction, 5), 1) # 确保预测范围合理
return predictions
上述代码实现了基于 K 近邻的方法来进行评分预测的功能。
4. 整合流程并生成推荐清单
最后一步就是综合前面几步的结果,筛选出那些预计得分会较高的商品呈现给顾客看作最终建议项。
这里给出完整的调用示例以及说明:
if __name__ == "__main__":
# 加载样本数据集
data = {
'user_id': ['u1','u1','u1','u2','u2','u3'],
'item_id': ['i1','i2','i3','i1','i3','i2'],
'rating' : [5 ,3 ,4 ,4 ,2 ,1 ]
}
df = pd.DataFrame(data)
norm_mat, avg_rts = preprocess_data(df)
sim_mat = calculate_user_similarity(norm_mat)
test_user = 'u2'
unseen_items = set(df['item_id']) - set(df[df['user_id']==test_user]['item_id'])
preds = predict_ratings(test_user, list(unseen_items), norm_mat, sim_mat, avg_rts)
recommendations = sorted(preds.items(), key=lambda x:x[1], reverse=True)[:3]
print(f"Top recommended items for user '{test_user}':", dict(recommendations))
这段脚本演示了一个简单的端到端工作流,从加载基础资料直至输出个性化提议列表为止。
总结
通过以上步骤可以看出,在实际应用过程中需要考虑诸多因素比如冷启动问题、稀疏性和性能瓶颈等问题。尽管如此,User-Based Collaborative Filtering 方法因其直观易懂而被广泛应用于各种场景之中[^3]。
和协同过滤算法 的经典算法
协同过滤算法是一种推荐算法,根据用户的历史行为以及与其他用户的相似度,来预测用户可能会喜欢哪些物品。常见的协同过滤算法有以下两种:
基于用户的协同过滤算法(User-Based Collaborative Filtering):该算法根据用户之间的相似度来预测用户对物品的评分。具体地,对于一个目标用户,首先找出与该用户兴趣相似的一些用户,然后将这些用户的历史评分信息进行加权平均,得到目标用户对物品的预测评分。
基于物品的协同过滤算法(Item-Based Collaborative Filtering):该算法根据物品之间的相似度来预测用户对物品的评分。具体地,对于一个目标用户,首先找出该用户已经评分过的物品,然后找出与这些物品相似的其他物品,计算这些物品与目标用户评分过的物品的相似度,最后根据相似度加权平均计算出目标用户对其他未评分物品的预测评分。
相关推荐
















