4

我正在尝试创建协作过滤算法,以向某些用户推荐产品。带TensorFlow的推荐系统(SVD)

我很快就开始工作,并开始使用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!") 

回答

1

您需要修改代码的预测部分以输出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指数在预测输出的最大的。

+0

好的完美。当我使用具有字母数字ID而不是int32的DB数据时,我在embedding_lookup上出现错误,错误为:“TypeError:传递给参数'indices'的值的DataType字符串不在允许值列表中:int32,int64”。我该如何解决它? –

+0

你能告诉我哪一行是错误吗?什么是'数据库数据'?在embedding_lookup中,您输入的内容是什么,导致了这个错误? –

+0

导致错误的行之一:“embd_user = tf.nn.embedding_lookup(w_user,user_batch,name =”embedding_user“)”。 这是因为从我的数据库加载的ID是字母数字而不是int32:https://www.dropbox.com/s/9s4vxsciue3mu38/Schermata%202017-07-08%20alle%2010.32.48.png?dl=0 。 然后用户批处理的类型为tf.string:“user_batch = tf.placeholder(tf.string,shape = [None],name =”id_user“)” –

1

您可以运行

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

哪些用户是指所有项目ID的所有用户ID和项目,并predict_result是每一个用户的所有项目的得分,你可以在predict_result存储到数据库;

+0

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