读取数据
def load_rating_file(self,infile,rating_user, rating_item, rating_score,spliter):with open(infile,'r') as rd:while True:line = rd.readline()if not line: break words = line.replace('\r\n','').replace('\n','').split(spliter)rating_user.append(int(words[0]))rating_item.append(int(words[1]))rating_score.append(float(words[2]))
建模举例tensorflow
def build_model(user_indices, item_indices, rank, ratings, user_cnt, item_cnt, lr, lamb, mu, init_value):W_user = tf.Variable(tf.truncated_normal([user_cnt, rank], stddev=init_value/math.sqrt(float(rank)), mean=0), #init_value0.01 rank16name = 'user_embedding', dtype=tf.float32)W_item = tf.Variable(tf.truncated_normal([item_cnt, rank], stddev=init_value/math.sqrt(float(rank)), mean=0), name = 'item_embedding', dtype=tf.float32)W_user_bias = tf.concat([W_user, tf.ones((user_cnt,1), dtype=tf.float32)], 1, name='user_embedding_bias')W_item_bias = tf.concat([tf.ones((item_cnt,1), dtype=tf.float32), W_item], 1, name='item_embedding_bias')user_feature = tf.nn.embedding_lookup(W_user_bias, user_indices, name = 'user_feature')item_feature = tf.nn.embedding_lookup(W_item_bias, item_indices, name = 'item_feature') preds = tf.add(tf.reduce_sum( tf.multiply(user_feature , item_feature) , 1), mu)square_error = tf.sqrt(tf.reduce_mean( tf.squared_difference(preds, ratings)))loss = square_error + lamb*(tf.reduce_mean(tf.nn.l2_loss(W_user)) + tf.reduce_mean(tf.nn.l2_loss(W_item))) #loss函数用户损失tf.summary.scalar('square_error', square_error)tf.summary.scalar('loss', loss)merged_summary = tf.summary.merge_all()#tf.global_variables_initializer()train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss) # tf.train.AdadeltaOptimizer(learning_rate=lr).minimize(loss) #return train_step, square_error, loss, merged_summarydef single_run(dataset,rank,user_cnt,item_cnt,lr,lamb,mu,n_eopch,batch_size,is_eval_on, init_value):user_indices = tf.placeholder(tf.int32,[None])item_indices = tf.placeholder(tf.int32,[None])ratings = tf.placeholder(tf.float32, [None]) train_step, square_error, loss, merged_summary = build_model(user_indices, item_indices, rank, ratings, user_cnt, item_cnt, lr, lamb, mu, init_value)sess = tf.Session()init = tf.global_variables_initializer()sess.run(init) #print(sess.run(user_embeddings))train_writer = tf.summary.FileWriter(r'logs', sess.graph)n_instances = len(dataset.training_ratings_user)best_train_rmse, best_test_rmse, best_eval_rmse = -1, -1, -1best_eopch_idx = -1 for ite in range(n_eopch):#print(ite)start = clock()for i in range(n_instances//batch_size):start_idx = i * batch_size end_idx = start_idx + batch_sizecur_user_indices = dataset.training_ratings_user[start_idx:end_idx]cur_item_indices = dataset.training_ratings_item[start_idx:end_idx]cur_label = dataset.training_ratings_score[start_idx:end_idx]sess.run(train_step, { user_indices : cur_user_indices, item_indices : cur_item_indices, ratings : cur_label}) error_traing = sess.run(square_error, { user_indices : dataset.training_ratings_user, item_indices : dataset.training_ratings_item, ratings : dataset.training_ratings_score})error_test = sess.run(square_error, { user_indices : dataset.test_ratings_user, item_indices : dataset.test_ratings_item, ratings : dataset.test_ratings_score})if is_eval_on:error_eval = sess.run(square_error, { user_indices : dataset.eval_ratings_user, item_indices : dataset.eval_ratings_item, ratings : dataset.eval_ratings_score})else: error_eval = -1if best_test_rmse<0 or best_test_rmse>error_test:best_train_rmse, best_test_rmse, best_eval_rmse = error_traing,error_test, error_eval best_eopch_idx = ite else:if ite - best_eopch_idx>10:break loss_traing = sess.run(loss, { user_indices : dataset.training_ratings_user, item_indices : dataset.training_ratings_item, ratings : dataset.training_ratings_score})#loss_test = sess.run(loss, { user_feature : test_user_feature, item_feature : test_item_feature, ratings : test_label})summary = sess.run(merged_summary, { user_indices : dataset.training_ratings_user, item_indices : dataset.training_ratings_item,ratings : dataset.training_ratings_score})train_writer.add_summary(summary, ite)end = clock()print("Iteration %d RMSE(train): %f RMSE(test): %f RMSE(eval): %f LOSS(train): %f minutes: %f" %(ite, error_traing, error_test, error_eval, loss_traing, (end-start)/60))train_writer.close()return best_train_rmse, best_test_rmse, best_eval_rmse,best_eopch_idx
计算top10 推荐
# 为每个用户计算top10的推荐
print("Filtering out items in training set")
keys = ['user', 'item']
i1 = predictions.set_index(keys).index
i2 = df.set_index(keys).indexrecs = predictions[~i1.isin(i2)]
recs = recs.sort_values(['user', 'rating'], ascending=[True, False])#不同用户按照评分排序
recs = recs.groupby('user').head(10)
recs.to_csv('recs.tsv', sep='\t', index=False, header=False)