You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为研究对比推荐算法,如何用sklearn BernoulliRBM为特定用户生成推荐?

用BernoulliRBM给MovieLens用户生成推荐的实操指南

嘿,刚好折腾过用sklearn的BernoulliRBM做推荐,给你拆解下完整流程,一步步来就没那么懵啦~

一、先把数据改成RBM爱吃的样子

BernoulliRBM只认0/1的二值数据,但MovieLens给的是1-5的评分,所以第一步得把用户-电影的评分矩阵转成二值格式。常用两种思路:

  • 要么把「用户给过评分」标记为1(代表用户接触过这个电影),没评分的是0;
  • 要么把「评分≥3分」标记为1(代表用户喜欢),低于3分或没评分的是0。

先补全你的数据加载+预处理代码:

import pandas as pd
import numpy as np
from sklearn.neural_network import BernoulliRBM
from sklearn.preprocessing import binarize

# 加载ml-1m的评分数据(ratings.dat)
ratings = pd.read_csv(
    'C:\\Users\\admin\\PycharmProjects\\MasterProject\\ml-1m\\ratings.dat',
    sep='::',
    names=['user_id', 'movie_id', 'rating', 'timestamp'],
    engine='python'
)

# 构建用户-电影的评分矩阵(行是用户,列是电影,空值填0)
user_movie_matrix = ratings.pivot(index='user_id', columns='movie_id', values='rating').fillna(0)

# 转成二值矩阵:这里选评分≥3分标记为1(代表用户喜欢),其他为0
binary_matrix = binarize(user_movie_matrix, threshold=2.5)  # 阈值设2.5,刚好把3-5分转成1

二、训练RBM模型

RBM的作用是学出用户-电影数据里的潜在偏好特征,比如“喜欢动作片”“偏爱老电影”这类隐因子。直接用sklearn的BernoulliRBM拟合就行:

# 初始化模型,参数可以根据效果调
rbm = BernoulliRBM(
    n_components=100,  # 隐特征的数量,类似SVD的隐因子个数,一般50-200之间试
    learning_rate=0.01,  # 学习率,太小学得慢,太大容易震荡
    n_iter=20,  # 迭代次数,跑个10-30次差不多
    random_state=42,  # 固定随机种子,结果可复现
    verbose=1  # 打印训练进度,方便看有没有在跑
)

# 训练模型:每个用户是一个样本,所有电影是特征,直接喂二值矩阵就行
rbm.fit(binary_matrix)

三、给特定用户生成推荐

核心逻辑是:用训练好的RBM“重构”目标用户的偏好向量,重构值越高,说明模型觉得用户越可能喜欢这个电影,然后挑出用户没看过的电影排序就行。

写个简单的推荐函数:

def get_top_recommendations(user_id, binary_matrix, rbm, top_n=10):
    # 取出目标用户的二值向量,转成二维数组(RBM的方法要求输入是二维)
    user_vec = binary_matrix.loc[user_id].values.reshape(1, -1)
    
    # 用RBM重构用户的偏好向量,得到每个电影的预测喜欢概率(0-1之间)
    # 这里用gibbs采样重构,也可以用隐特征乘components_的方式,结果差不多
    reconstructed_vec = rbm.gibbs(user_vec)
    
    # 转成Series,方便按电影ID筛选
    reconstructed_scores = pd.Series(reconstructed_vec.flatten(), index=binary_matrix.columns)
    
    # 找出用户没评分过的电影(原始矩阵里值为0的)
    unrated_movies = binary_matrix.loc[user_id][binary_matrix.loc[user_id] == 0].index
    
    # 只保留未评分电影的预测分数,排序取TopN
    top_recs = reconstructed_scores.loc[unrated_movies].sort_values(ascending=False).head(top_n)
    
    return top_recs

# 示例:给用户ID=1的用户生成Top10推荐
user_id = 1
my_recs = get_top_recommendations(user_id, binary_matrix, rbm)
print(f"用户{user_id}的Top10推荐电影:")
print(my_recs)

四、几个要注意的小细节

  • 二值化策略选哪个? 如果你的研究是看“用户可能接触的电影”,就用“是否有评分”;如果是“用户可能喜欢的电影”,就用评分阈值。两种都试试,看哪种符合你的研究目标。
  • 参数怎么调? n_components(隐特征数)、learning_rate、n_iter这些对结果影响大,可以用交叉验证找最优值,比如把n_components从50调到200,看推荐准确率变化。
  • 另一种重构方式 除了gibbs,也可以先转成隐特征再重构,代码是这样的:
    user_hidden = rbm.transform(user_vec)
    reconstructed_vec = user_hidden @ rbm.components_
    
    结果和gibbs采样的差不多,你可以选顺手的用。

内容的提问来源于stack exchange,提问作者py2018

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:08:20