基于协同过滤的NMF算法Top5标签推荐实现求助
NMF协同过滤标签Top5推荐实现步骤
你已经完成了NMF的矩阵分解和重构,接下来可以按以下步骤实现Top5标签推荐:
核心逻辑
NMF重构后的矩阵NMF_matrix中,每一行对应一个用户,每一列对应一个标签,矩阵值代表模型预测的用户对该标签的偏好程度。我们需要基于这个得分,筛选出用户未使用过的标签,再取得分最高的前5个。
修改后的代码实现
import numpy as np from sklearn.decomposition import NMF # 假设matrix是用户-标签矩阵(行=用户,列=标签,值=用户是否使用过该标签或使用频次) model = NMF(n_components=2, init='random', random_state=0) W = model.fit_transform(matrix) H = model.components_ NMF_matrix = np.dot(W, H) # 目标用户索引(比如测试集中的第i个用户) target_user_idx = i # 1. 获取目标用户的标签偏好得分向量 user_scores = NMF_matrix[target_user_idx] # 2. 获取该用户已使用过的标签索引(假设matrix中1表示已使用,0表示未使用,可根据实际数据调整) used_tag_indices = np.where(matrix[target_user_idx] > 0)[0] # 3. 将已使用标签的得分设为极低值,确保不会被推荐 user_scores[used_tag_indices] = -np.inf # 4. 按得分从高到低排序,取前5个标签的索引 top5_tag_indices = np.argsort(user_scores)[::-1][:5] # 5. 映射到实际标签名称 hashtag_recommend_collaborative = [new_hashtags[idx] for idx in top5_tag_indices] print("Top5推荐标签:", hashtag_recommend_collaborative)
关键说明
- 排除已使用标签:推荐的核心是给用户推送未接触过的标签,必须过滤掉用户已经使用过的标签,避免重复推荐。
- 得分排序:
np.argsort返回的是从小到大的索引,用[::-1]反转成从大到小排序后,再取前5个即可。 - 数据适配:如果你的
matrix中值不是0/1(比如是使用频次),只需调整used_tag_indices的判断条件(比如matrix[target_user_idx] > 0依然适用,只要未使用的标签值为0)。
内容的提问来源于stack exchange,提问作者zahra
相关产品推荐
相关产品推荐

