用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:
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给出:
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次迭代,结果如下:
在左侧,我们可以看到在训练模型时对数后验如何演变。在右侧,我们可以看到在训练集和测试集上评估的RMSE值。考虑到R预测可能超出额定值的0-5范围,我们使用线性插值法确保R值受此间隔限制。原始论文[1]提出了其他方法,例如使用逻辑函数和线性插值。对于训练,还建议使用带动量的梯度下降来处理较大的数据集。
最后,以下是数据库中用户ID为45的电影推荐:
结论
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.