推荐系统的PMF - 概率矩阵分解和协同过滤(三)

简介: 推荐系统的PMF - 概率矩阵分解和协同过滤(三)

用Python实现

为了进行训练,我们使用了IMDB电影数据库的一个子集,然后将其分为两部分分别进行训练和验证。

初始化:为了初始化V,我们从零均值高斯绘制随机数,标准偏差为1 /λV。此外,等级值D被设置为较小的值10。

def initialize_parameters(lambda_U, lambda_V):
    U = np.zeros((n_dims, n_users), dtype=np.float64)
    V = np.random.normal(0.0, 1.0 / lambda_V, (n_dims, n_movies))
    parameters['U'] = U
    parameters['V'] = V
    parameters['lambda_U'] = lambda_U
    parameters['lambda_V'] = lambda_V

更新参数:为了更新U和V,我们使用公式8和9:

image.png

def update_parameters():
    U = parameters['U']
    V = parameters['V']
    lambda_U = parameters['lambda_U']
    lambda_V = parameters['lambda_V']
    for i in range(n_users):
        V_j = V[:, R[i, :] > 0]
        U[:, i] = np.dot(np.linalg.inv(np.dot(V_j, V_j.T) + lambda_U * np.identity(n_dims)), np.dot(R[i, R[i, :] > 0], V_j.T))
    for j in range(n_movies):
        U_i = U[:, R[:, j] > 0]
        V[:, j] = np.dot(np.linalg.inv(np.dot(U_i, U_i.T) + lambda_V * np.identity(n_dims)), np.dot(R[R[:, j] > 0, j], U_i.T))
    parameters['U'] = U
    parameters['V'] = V

计算对数后验:对数后验由公式7给出:

image.png

def log_a_posteriori():
    lambda_U = parameters['lambda_U']
    lambda_V = parameters['lambda_V']
    U = parameters['U']
    V = parameters['V']
    UV = np.dot(U.T, V)
    R_UV = (R[R > 0] - UV[R > 0])
    return -0.5 * (np.sum(np.dot(R_UV, R_UV.T)) + lambda_U * np.sum(np.dot(U, U.T)) + lambda_V * np.sum(np.dot(V, V.T)))

训练循环:要训练模型,我们调用先前的函数并监视对数后验以及在训练和测试集上评估的RMSE(均方根误差):

def train(n_epochs):
    initialize_parameters(0.3, 0.3)
    log_aps = []
    rmse_train = []
    rmse_test = []
    update_max_min_ratings()
    rmse_train.append(evaluate(train_set))
    rmse_test.append(evaluate(test_set))
    for k in range(n_epochs):
        update_parameters()
        log_ap = log_a_posteriori()
        log_aps.append(log_ap)
        if (k + 1) % 10 == 0:
            update_max_min_ratings()
            rmse_train.append(evaluate(train_set))
            rmse_test.append(evaluate(test_set))
            print('Log p a-posteriori at iteration', k + 1, ':', log_ap)
    update_max_min_ratings()
    return log_aps, rmse_train, rmse_test

我们将训练循环运行150次迭代,结果如下:

image.png

在左侧,我们可以看到在训练模型时对数后验如何演变。在右侧,我们可以看到在训练集和测试集上评估的RMSE值。考虑到R预测可能超出额定值的0-5范围,我们使用线性插值法确保R值受此间隔限制。原始论文[1]提出了其他方法,例如使用逻辑函数和线性插值。对于训练,还建议使用带动量的梯度下降来处理较大的数据集。

最后,以下是数据库中用户ID为45的电影推荐:

image.png

结论

PMF是用于协作过滤的强大算法。它利用具有相似首选项的用户提供的数据向特定用户提供推荐。它也被称为低秩矩阵分解方法,因为它使用低秩矩阵来估计等级R矩阵,然后进行有用的预测。

引用

[1] Salakhutdinov, Ruslan & Mnih, Andriy. Probabilistic Matrix Factorization. In NIPS’07: Proceedings of the 20th International Conference on Neural Information Processing Systems, pages 1257–1264, 2007.

[2] Brooks-Bartlett Jonny. Probability concepts explained: Bayesian inference for parameter estimation.

目录
相关文章
|
3天前
|
机器学习/深度学习 搜索推荐 算法
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
登录注册 热门图书 图书分类 图书推荐 借阅图书 购物图书 个人中心 可视化大屏 后台管理
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
|
9天前
|
机器学习/深度学习 搜索推荐 算法
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
|
1月前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
|
1月前
|
存储 搜索推荐 算法
python推荐系统实现(矩阵分解来协同过滤)
python推荐系统实现(矩阵分解来协同过滤)
|
1月前
|
机器学习/深度学习 搜索推荐 算法
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
|
7月前
|
搜索推荐 算法 前端开发
旅游管理与推荐系统Python+Django网页平台+协同过滤推荐算法
旅游管理与推荐系统Python+Django网页平台+协同过滤推荐算法
184 0
|
1月前
|
搜索推荐 算法 前端开发
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
137 4
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
|
1月前
|
机器学习/深度学习 搜索推荐 算法
推荐系统算法的研究与实践:协同过滤、基于内容的推荐和深度学习推荐模型
推荐系统算法的研究与实践:协同过滤、基于内容的推荐和深度学习推荐模型
355 1
|
6月前
|
搜索推荐 算法 前端开发
商品购物管理与推荐系统Python+Django网页界面+协同过滤推荐算法
商品购物管理与推荐系统Python+Django网页界面+协同过滤推荐算法
87 0
|
1月前
|
搜索推荐 算法
推荐系统中的协同过滤介绍
推荐系统中的协同过滤介绍