使用TensorFlow实现的推荐系统(SVD)

4
我正在尝试创建一种协同过滤算法,以向某些用户建议产品。
我最近开始使用TensorFlow,并开始研究这个代码(链接在此:https://github.com/songgc/TF-recomm),它能够创建模型并训练用户ID、产品和评分,正好符合我的需求。
我已经启动了代码并训练了模型。训练完成后,我需要进行预测,即为每个用户获取建议,并将其保存在一个数据库中,以便通过NODE.js应用程序进行访问。
当训练结束后,我该如何检索每个用户的建议列表呢?
if __name__ == '__main__':
    df_train, df_test=get_data()
    svd(df_train, df_test)
    print("Done!")
2个回答

1
你可以运行。
predict_result = sess.run(inter_op, feed_dict={user_batch:users, item_batch:items})

用户指所有用户ID和所有物品ID的项目,predict_result是每个用户对所有项目的评分,您可以将predict_result存储到数据库中;


那么,如果我需要为每个用户找到10个推荐产品,我是否需要手动将所有产品与每个用户组合,然后找到前10个?难道没有更有效的方法吗?predict_result = sess.run(infer, feed_dict={user_batch: [users[0], users[0], users[0] .........], item_batch: [items[0], items[1], items[2] ................]}) - Gabriele Picco

1
你需要修改代码的预测部分,以输出前K个推荐产品。当前进行预测的代码如下:
 embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")
 embd_item = tf.nn.embedding_lookup(w_item, item_batch, name="embedding_item")
 infer = tf.reduce_sum(tf.multiply(embd_user, embd_item), 1)

这里的embed_user是特定用户的用户嵌入,而embd_item是特定项目的项目嵌入。因此,您需要将其更改为与所有项目进行比较,而不是将特定用户特定项目进行比较。矩阵w_item是所有项目的嵌入。可以通过以下方式完成:
 embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")
 # Multiply user embedding of shape: [1 x dim] 
 # with every item embeddings of shape: [item_num, dim], 
 # to produce rank of all items of shape: [item_num]
 predict = tf.matmul(embd_user, w_item, transpose_b=True)

然后,您可以选择预测输出中最大值的前k个索引。

好的,我在使用包含字母数字ID而不是int32的DB数据时,在embedding_lookup上遇到了错误,错误信息为:“TypeError:传递给参数'indices'的值的数据类型为字符串,不在允许的值列表中:int32、int64”。我该如何解决? - Gabriele Picco
你能告诉我错误在哪一行吗?'DB数据'是什么意思?在embedding_lookup中,你更改的输入是导致这个错误的原因吗? - Vijay Mariappan
你说过你能够训练这个网络。如果输入的ID是字符串,它是如何工作的?你分享的代码链接中有user_batch = tf.placeholder(tf.int32, shape=[None], name="id_user"),如果你的数据是字符串,那么对于每个用户ID,分配一个唯一的ID(int),然后将其提供给网络。 - Vijay Mariappan
我用测试数据集对他进行了训练,现在我正在尝试将它与我的数据库连接起来。那么我不能使用我的数据库中的字母数字ID吗?我是否需要将它们映射为整数,例如使用哈希映射,然后重新提取它们?谢谢您的帮助,对于我在这个领域的不熟悉,我深表歉意。 - Gabriele Picco
没问题,我明白了。训练和测试不能有两组不同的用户数据。数据集应该是相同的。训练创建用户/项目的嵌入矩阵,而测试只是从中读取。ID将用作嵌入矩阵数组的索引,因此它应该是“int”。您的整数ID应该是矩阵数组的索引。因此,为N个用户分配[1、2....N]。 - Vijay Mariappan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接