【问题标题】:Recommender System (SVD) with TensorFlow带有 TensorFlow 的推荐系统 (SVD)
【发布时间】:2017-12-07 11:03:36
【问题描述】:

我正在尝试创建一种协同过滤算法来向某些用户推荐产品。

我很快就开始使用 TensorFlow(我认为它足够有效和灵活)。 我发现这段代码可以做我感兴趣的事情,创建模型并训练用户 ID、产品和评级:https://github.com/songgc/TF-recomm

我启动了代码并训练了模型。

训练完模型后,我需要进行预测,即为每个用户获取建议,以便将它们保存在我使用 NODE.js 应用程序访问的数据库中。

培训完成后,如何为每个用户检索此建议列表?

if __name__ == '__main__':
    df_train, df_test=get_data()
    svd(df_train, df_test)
    print("Done!")

【问题讨论】:

    标签: python tensorflow recommendation-engine collaborative-filtering


    【解决方案1】:

    你可以运行

    predict_result = sess.run(inter_op, feed_dict={user_batch:users, item_batch:items})
    

    which users 表示所有用户 id 和所有 item id 的 item,predict_result 是每个用户对所有 item 的分数,可以将 predict_result 存储到 DB 中;

    【讨论】:

    • 那么如果我必须为每个用户找到推荐的 10 个产品,我是否必须手动将所有产品与每个用户组合,然后找到前 10 个?没有更有效的方法吗? predict_result = sess.run(infer, feed_dict={user_batch: [users[0], users[0], users[0] .........], item_batch: [items[0], items[1] ], 项目[2] ...]})
    【解决方案2】:

    您需要修改代码的预测部分以输出top 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 是针对特定项目的。因此,您无需将particular userparticular 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)
    

    然后可以选择预测输出中最大值的top k索引。

    【讨论】:

    • 好的,完美。当我使用具有字母数字 id 而不是 int32 的 DB 数据时,embedding_lookup 出现错误,错误是:“TypeError:传递给参数‘indices’的值的 DataType 字符串不在允许值列表中:int32,int64”。我该如何解决?
    • 你能告诉我错误是哪一行吗?什么是“数据库数据”?在 embedding_lookup 中,您更改导致此错误的输入是什么?
    • 导致错误的行之一:“embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")”。这是因为从我的数据库加载的 id 是字母数字而不是 int32:dropbox.com/s/9s4vxsciue3mu38/…。然后用户批次的类型为 tf.string: "user_batch = tf.placeholder(tf.string, shape=[None], name="id_user")"
    • 您说您能够训练网络。通过将输入 id 作为字符串给出它是如何工作的?您共享的代码链接有 user_batch = tf.placeholder(tf.int32, shape=[None], name="id_user") ,如果您的数据是字符串,则为每个 user ID 分配一个唯一 ID (int),然后将其提供给网络。
    • 我用一个测试数据集训练了他,现在我正试图将它链接到我的数据库。那么我可以不使用我的数据库的字母数字 ID 吗?我是否必须用整数映射它们,例如使用搭扣映射,然后开箱即用地重新绘制它们?感谢您的帮助,对于我在该领域的经验不足,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2018-10-31
    • 2014-06-10
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多