Day11-协同过滤算法

协同过滤算法

搭建智能推荐系统的算法有很多,其中商业实战中用的较多的为协同过滤(collaborative filtering)。



一、协同过滤算法的原理

根据用户群体对产品偏好的数据,发现用户之间的相似性或者物品之间的相似性,并基于这些相似性为用户作推荐。

  • 基于用户的协同过滤算法(User-based Collaborative Filtering)

​ 其本质是:寻找相似的用户,进而对用户推荐相似用户关注的产品。

​ 如下表所示,用户1和用户2都给商品A,B,C打了高分,那么可以将用户1和用户2划分在同一个用户群体,此时若用户2还给商品D打了高分,那么就可以将商品D推荐给用户1。
在这里插入图片描述

  • 基于物品的协同过滤算法(Item-based Collaborative Filtering)

​ 其本质是:根据用户的历史偏好信息,将类似的物品推荐给用户

​ 如下表所示,图书A和图书B都被用户1,2,3购买过(1表示购买,0表示未购买),那么可以认为图书A和图书B具有较强的相似度,即可判断喜欢图书A的用户同样也会喜欢图书B。当用户4购买图书B时,根据图书A和图书B的相似性,可将图书A推荐给用户4。
在这里插入图片描述

在商业实战中,大多应用场景偏向于使用基于物品的协同过滤算法。主要有如下两个原因:

​ 原因一:通常用户的数量是非常庞大的(如淘宝数亿的用户群体),而物品的数量相对有限,因此计算不同物品之间的相似度往往比计算不同用户的相似度容易很多。

​ 原因二:用户的喜好较为多变,而物品属性较明确不随时间变化,过去用户对物品的评分长期有效,所以物品间的相似度比较固定,因此可以预先离线计算好物品间的相似度,把结果存在表中,向客户进行推荐时再使用。

二、相似度计算的常用方法

无论是基于用户还是基于物品的协同过滤算法,其本质都是寻找数据之间的相似度。本节介绍计算相似度的三种常见方法:

  • 欧式距离

∑ i = 1 n ( X i ( a ) − X i ( b ) ) 2 \Large \sqrt{\sum_{i=1}^n{(X_i^{(a)}-X_i^{(b)})}^2} i=1n(Xi(a)Xi(b))2

  • 余弦相似度

​ 使用两向量夹角θ的余弦值cosθ来表示两个向量的相似度,称为余弦相似度。余弦相似度的范围是:[-1,1],夹角越小,余弦值越接近于1,两个向量越靠近,两者越相似。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。

在这里插入图片描述

余弦相似度公式为:
c o s θ = < a , b > ∣ ∣ a ∣ ∣ ∣ ∣ b ∣ ∣ \Large cos\theta = \frac{<a,b>}{|| a|||| b||} cosθ=∣∣a∣∣∣∣b∣∣<a,b>
​ 其中,<a,b>表示的是向量a和向量b的内积,||a||和||b||分别表示向量a和向量b的模(长度)。

例如,向量a=(X1,Y1),向量b=(X2,Y2),代入余弦相似度公式可以得到:
c o s θ = X 1 ∗ X 2 + Y 1 ∗ Y 2 X 1 2 + Y 1 2 ∗ X 2 2 + Y 2 2 cos\theta = \frac{X_1*X_2+Y_1*Y_2}{\sqrt{X_1^2+Y_1^2}*\sqrt{X_2^2+Y_2^2}} cosθ=X12+Y12 X

朱梦菲 gold44876 基于协同过滤算法实现电影推荐系统实验总用时:00:06:07 资源中心 数据集 nav 第2关:动手搭建电影推荐系统 500 学习内容 参考答案 记录 评论 任务描述 相关知识 电影评分数据 构造用户-电影评分矩阵 编程要求 测试说明 任务描述 本关任务:使用python搭建电影推荐系统。 相关知识 为了完成本关任务,你需要掌握:构造用户-电影评分矩阵。 电影评分数据 本次使用电影评分数据为379个用户对783部电影的评分记录,部分数据如下: userId movieRow rating title 1 718 1.5 San Andreas (2015) 200 28 3.5 Ferris Bueller's Day Off (1986) 128 77 5 Wizard of Oz, The (1939) 11 172 2 Lord of War (2005) 其中: userId:用户编号; movieRow:电影编号; rating:评分值; title:电影名。 如: 第一行数据表示用户1对电影718评分为1.5分; 第二行数据表示用户200对电影28评分为3.5分。 数据获取代码如下: import pandas as pd #用户评分表 data_df = pd.read_csv('./step2/data.csv') 构造用户-电影评分矩阵 大家已经知道,要使用基于矩阵分解的协同过滤算法,首先得有用户与电影评分的矩阵,而我们实际中的数据并不是以这样的形式保存,所以在使用算法前要先构造出用户-电影评分矩阵,python实现代码如下: import numpy as np #获取用户数与电影数 userNo = max(data_df['userId'])+1 movieNo = max(data_df['movieRow'])+1 #创建电影评分表 rating = np.zeros((userNo,movieNo)) for index,row
最新发布
04-28
### 使用协同过滤算法构建电影推荐系统 #### 1. 构造用户-电影评分矩阵 构造用户-电影评分矩阵是实现协同过滤的第一步。该矩阵是一个二维数组,其中每行对应一位用户,每列对应一部电影,矩阵中的元素表示用户对相应电影的评分。如果某个用户未对某部电影进行评分,则可以用零或其他特殊值填充。 以下是 Python 实现代码: ```python import numpy as np import pandas as pd def construct_user_movie_matrix(ratings_df, user_col='user_id', movie_col='movie_id', rating_col='rating'): """ 构造用户-电影评分矩阵。 参数: ratings_df (pd.DataFrame): 包含用户评分数据的数据框。 user_col (str): 用户 ID 列名。 movie_col (str): 电影 ID 列名。 rating_col (str): 评分列名。 返回: np.ndarray: 用户-电影评分矩阵。 """ # 获取唯一的用户和电影编号 unique_users = sorted(ratings_df[user_col].unique()) unique_movies = sorted(ratings_df[movie_col].unique()) # 创建空矩阵 num_users = len(unique_users) num_movies = len(unique_movies) matrix = np.zeros((num_users, num_movies)) # 映射用户和电影到索引 user_to_index = {user: idx for idx, user in enumerate(unique_users)} movie_to_index = {movie: idx for idx, movie in enumerate(unique_movies)} # 填充矩阵 for _, row in ratings_df.iterrows(): user_idx = user_to_index[row[user_col]] movie_idx = movie_to_index[row[movie_col]] matrix[user_idx, movie_idx] = row[rating_col] return matrix ``` 这段代码接收一个包含用户评分数据的 DataFrame,并返回一个用户-电影评分矩阵[^1]。 --- #### 2. 计算用户相似度 在基于用户的协同过滤中,需要计算用户之间的相似度。常用的方法包括皮尔逊相关系数、余弦相似度等。以下是以余弦相似度为例的实现方式: ```python from sklearn.metrics.pairwise import cosine_similarity def compute_user_similarity(matrix): """ 计算用户间的余弦相似度。 参数: matrix (np.ndarray): 用户-电影评分矩阵。 返回: np.ndarray: 用户间相似度矩阵。 """ similarity_matrix = cosine_similarity(matrix) return similarity_matrix ``` 通过调用 `cosine_similarity` 函数,我们可以快速获得用户之间的相似度矩阵[^2]。 --- #### 3. 进行个性化推荐 根据用户相似度矩阵,可以为每位用户提供个性化的电影推荐。具体做法是对目标用户感兴趣的电影加权求和,权重由其他用户的相似度决定。 以下是推荐逻辑的实现代码: ```python def recommend_movies(user_id, ratings_matrix, similarity_matrix, top_n=5): """ 为目标用户推荐电影。 参数: user_id (int): 目标用户的 ID。 ratings_matrix (np.ndarray): 用户-电影评分矩阵。 similarity_matrix (np.ndarray): 用户间相似度矩阵。 top_n (int): 推荐的电影数量。 返回: list: 推荐的电影列表及其预测评分。 """ # 提取目标用户和其他用户的相似度 target_similarities = similarity_matrix[user_id] # 对所有电影进行预测评分 predictions = [] for movie_id in range(ratings_matrix.shape[1]): if ratings_matrix[user_id, movie_id] == 0: # 只针对未评分的电影 weighted_sum = sum(similarity * ratings_matrix[idx, movie_id] for idx, similarity in enumerate(target_similarities) if ratings_matrix[idx, movie_id] != 0) total_weight = sum(abs(similarity) for similarity in target_similarities if ratings_matrix[idx, movie_id] != 0) if total_weight > 0: prediction = weighted_sum / total_weight predictions.append((movie_id, prediction)) # 按预测评分排序并返回前 N 部电影 recommendations = sorted(predictions, key=lambda x: x[1], reverse=True)[:top_n] return [(idx, score) for idx, score in recommendations] ``` 此函数会为目标用户生成一份推荐清单,其中包括未观看过的电影及其预测评分[^3]。 --- #### 4. 整体流程示例 下面展示了一个完整的例子,说明如何使用上述模块完成整个推荐过程: ```python # 示例数据集 data = { 'user_id': [1, 1, 1, 2, 2, 2, 3, 3, 3], 'movie_id': [1, 2, 3, 1, 2, 4, 1, 3, 4], 'rating': [5, 3, 4, 4, 2, 3, 3, 5, 2] } ratings_df = pd.DataFrame(data) # 构造用户-电影评分矩阵 matrix = construct_user_movie_matrix(ratings_df) # 计算用户相似度 similarity_matrix = compute_user_similarity(matrix) # 为目标用户推荐电影 recommendations = recommend_movies(0, matrix, similarity_matrix, top_n=2) print("Recommendations:", recommendations) ``` --- ### 总结 以上代码展示了如何使用协同过滤算法构建一个基本的电影推荐系统。主要步骤包括构造用户-电影评分矩阵、计算用户相似度以及生成个性化推荐[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值