Python 改进推荐查找最接近的歌曲

Python 改进推荐查找最接近的歌曲,python,tensorflow,keras,deep-learning,neural-network,Python,Tensorflow,Keras,Deep Learning,Neural Network,我已经训练了我的模型,现在我想为给定的播放列表推荐歌曲!然而,我遇到的一个问题(见下文)是,我需要嵌入新的播放列表(存储在我的模型中),以便使用kmeans在嵌入空间中找到最接近的相关播放列表。我不知道如何绕过这个问题——照目前的情况,似乎每次我得到一个输入播放列表时,我都必须重新训练我的整个模型,以便嵌入该播放列表。因此,我只是在训练集中随机选择的播放列表上测试我的模型(其中大部分是摇滚乐和老歌!) 为了推荐歌曲,我首先对所有训练播放列表的学习嵌入进行聚类,然后为给定的测试播放列表选择“邻居”

我已经训练了我的模型,现在我想为给定的播放列表推荐歌曲!然而,我遇到的一个问题(见下文)是,我需要嵌入新的播放列表(存储在我的模型中),以便使用kmeans在嵌入空间中找到最接近的相关播放列表。我不知道如何绕过这个问题——照目前的情况,似乎每次我得到一个输入播放列表时,我都必须重新训练我的整个模型,以便嵌入该播放列表。因此,我只是在训练集中随机选择的播放列表上测试我的模型(其中大部分是摇滚乐和老歌!)

为了推荐歌曲,我首先对所有训练播放列表的学习嵌入进行聚类,然后为给定的测试播放列表选择“邻居”播放列表,就像同一个聚类中的所有其他播放列表一样。然后,我从这些播放列表中提取所有曲目,并将测试播放列表嵌入和这些“相邻”曲目输入到我的模型中进行预测。这将根据“相邻”曲目(在我的模型下)在给定测试播放列表中出现的可能性对它们进行排序

这个代码非常慢。我该如何改进这一点

from keras.models import load_model
from sklearn.cluster import KMeans

desired_user_id = 500
model_path = 'spotify_NCF_8_[64, 32, 16, 8].h5'
print('using model: %s' % model_path)
model = load_model(model_path)
print('Loaded model!')

mlp_user_embedding_weights = (next(iter(filter(lambda x: x.name == 'mlp_user_embedding', model.layers))).get_weights())

# get the latent embedding for your desired user
user_latent_matrix = mlp_user_embedding_weights[0]
one_user_vector = user_latent_matrix[desired_user_id,:]
one_user_vector = np.reshape(one_user_vector, (1,32))

print('\nPerforming kmeans to find the nearest users/playlists...')
# get 100 similar users
kmeans = KMeans(n_clusters=100, random_state=0, verbose=0).fit(user_latent_matrix)
desired_user_label = kmeans.predict(one_user_vector)
user_label = kmeans.labels_
neighbors = []
for user_id, user_label in enumerate(user_label):
    if user_label == desired_user_label:
        neighbors.append(user_id)
print('Found {0} neighbor users/playlists.'.format(len(neighbors))) 

tracks = []
for user_id in neighbors:
    tracks += list(df[df['pid'] == int(user_id)]['trackindex'])
print('Found {0} neighbor tracks from these users.'.format(len(tracks))) 

users = np.full(len(tracks), desired_user_id, dtype='int32')
items = np.array(tracks, dtype='int32')

print('\nRanking most likely tracks using the NeuMF model...')
# and predict tracks for my user
results = model.predict([users,items],batch_size=100, verbose=0) 
results = results.tolist()
print('Ranked the tracks!')

你应该用kNN找到邻居。您可以通过使用对位置敏感的哈希进一步提高性能。

难道您不能通过使用距离搜索(即kNN)进行重新拟合吗