Collaborative Filtering

本文介绍了一种基于内存的用户项目推荐系统实现方法,利用余弦相似性计算用户间的相似度,并通过用户评分预测来推荐项目。该方法首先构建用户-项目矩阵,接着使用sklearn库计算用户与用户之间的余弦相似性,以及项目与项目之间的余弦相似性。

Memory based
get user-item matrix and calculate cosine similarity between $u_k, u_a$
$$sim^{cos}(u_k,u_a)=\frac{u_k\cdot u_a}{||u_k||\ ||u_a||}$$
calculate in python, each row of train_data_matrix represent a user

from sklearn.metrics.pairwise import pairwise_distances
user_similarity = pairwise_distances(train_data_matrix, metric='cosine')
item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')

to predict user $k$ rating item $m$
$$\hat{x}_{k,m}=\bar{x}_k+\frac{\sum_{i} sim^{cos}(u_k,u_i)(x_{i,m}-\bar{x}_i)}{\sum_{i} |sim^{cos}(u_k,u_i)|}$$

def predict(ratings, similarity, type='user'):
    if type == 'user':
        mean_user_rating = ratings.mean(axis=1)
        # axis=1 calculate the mean of every row
        ratings_diff = (ratings - mean_user_rating[:, np.newaxis])
        # np.newaxis create a new axis, changing to 2-d array
        pred = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) 
        / np.array([np.abs(similarity).sum(axis=1)]).T   
    elif type == 'item':
        pred = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])
    return pred


Reference
https://cambridgespark.com/co...

### 协同过滤的概念 协同过滤是一种广泛应用于推荐系统的算法,旨在通过分析用户行为数据来预测用户可能感兴趣的商品或服务。该技术基于这样的假设:如果两个用户在过去表现出相似的兴趣,则在未来他们可能会对相同的事物保持一致的态度。 #### 用户-用户协同过滤(UserCF) 一种常见的形式是用户-用户协同过滤(UserCF),其核心理念在于找到具有相似偏好的其他个体,并据此向目标用户提供个性化建议[^1]。具体来说: - **计算相似度**:首先衡量不同成员之间的亲密度; - **寻找邻居集**:依据上述指标挑选出最接近的若干位作为参照对象; - **生成推荐列表**:最后综合考虑这些伙伴的历史记录给出最终的选择方案。 ```python from sklearn.metrics.pairwise import cosine_similarity import numpy as np def compute_user_similarities(ratings_matrix): """ 计算用户间的余弦相似度矩阵 参数: ratings_matrix (numpy.ndarray): 用户评分矩阵 返回: similarity_matrix (numpy.ndarray): 用户间相似度矩阵 """ # 使用sklearn库中的cosine_similarity函数快速求解两两之间夹角余弦值 similarity_matrix = cosine_similarity(ratings_matrix) return similarity_matrix def recommend_items(user_id, ratings_matrix, k_neighbors=5, top_n=10): """ 对指定用户进行物品推荐 参数: user_id (int): 待推荐的目标用户ID ratings_matrix (numpy.ndarray): 用户评分矩阵 k_neighbors (int): 考虑近邻的数量,默认取前五个最近似的用户 top_n (int): 推荐条目数量上限,默认最多返回十个商品链接 返回: recommended_item_ids (list[int]): 给定用户的top n个推荐项ID列表 """ similarities = compute_user_similarities(ratings_matrix) sorted_indices = np.argsort(similarities[user_id])[::-1][1:k_neighbors+1] neighbor_ratings = ratings_matrix[sorted_indices] item_scores = np.mean(neighbor_ratings, axis=0) unseen_mask = ratings_matrix[user_id] == 0 candidate_scores = item_scores * unseen_mask recommended_item_ids = (-candidate_scores).argsort()[:top_n].tolist() return recommended_item_ids ``` ### 实现案例 为了更好地理解如何实际部署这样一个系统,在电子商务网站上构建了一个简单的Web应用程序实例。此应用采用了Python微框架Flask搭建RESTful API接口,允许前端页面发送HTTP请求获取定制化的购物指南[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值