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] ................]}) –