def test_dynamic_updates(self): """ TensorCoFi dynamic update We will take a tensor cofi. Train the model, evaluate it. Then we remove all the user factors and recompute them using the online_user_factors to check if the performance is almost the same... """ pyTF = PyTensorCoFi(n_factors=20, n_iterations=5, c_lambda=0.05, c_alpha=40) evaluator = Evaluator() tf = TensorCoFi(n_factors=2, n_iterations=100, c_lambda=0.05, c_alpha=40) df = pd.read_csv(resource_filename(testfm.__name__, "data/movielenshead.dat"), sep="::", header=None, names=["user", "item", "rating", "date", "title"]) training, testing = testfm.split.holdoutByRandom(df, 0.7) users = {user: list(entries) for user, entries in training.groupby("user")["item"]} tf.fit(training) map1 = evaluator.evaluate_model(tf, testing) # map of the original model #now we try to replace the original factors with on the fly computed factors #lets iterate over the training data of items and the users for u, items in users.items(): #user id in the tf uid = tf.data_map[tf.get_user_column()][u] # user id iids = [tf.data_map[tf.get_item_column()][i] for i in items] # item ids that user has seen #original_factors = tf.factors["user"][uid] new_factors = pyTF.online_user_factors(tf.factors[1], iids, p_param=40, lambda_param=0.05) #replace original factors with the new factors tf.factors[0][uid, :] = new_factors #tf.update_user_factors(uid, new_factors) #lets evaluate the new model with real-time updated factors map2 = evaluator.evaluate_model(tf, testing) #The difference should be smaller than 20% assert abs(map1[0]-map2[0]) < 0.2*map1[0]
def test_user_model_update(self): pyTF = PyTensorCoFi() Y = np.array([[-1.0920831, -0.01566422], [-0.8727925, 0.22307773], [0.8753245, -0.80181429], [-0.1338534, -0.51448172], [-0.2144651, -0.96081265]]) user_items = [1, 3, 4] res = pyTF.online_user_factors(Y, user_items, p_param=10, lambda_param=0.01) assert np.array([-1.18324547, -0.95040477]).all() == res.all(), "Results not equal"
def test_dynamic_updates(self): """ TensorCoFi dynamic update We will take a tensor cofi. Train the model, evaluate it. Then we remove all the user factors and recompute them using the online_user_factors to check if the performance is almost the same... """ pyTF = PyTensorCoFi(n_factors=20, n_iterations=5, c_lambda=0.05, c_alpha=40) evaluator = Evaluator() tf = TensorCoFi(n_factors=2, n_iterations=100, c_lambda=0.05, c_alpha=40) df = pd.read_csv(resource_filename(testfm.__name__, "data/movielenshead.dat"), sep="::", header=None, names=["user", "item", "rating", "date", "title"]) training, testing = testfm.split.holdoutByRandom(df, 0.7) users = { user: list(entries) for user, entries in training.groupby("user")["item"] } tf.fit(training) map1 = evaluator.evaluate_model(tf, testing) # map of the original model #now we try to replace the original factors with on the fly computed factors #lets iterate over the training data of items and the users for u, items in users.items(): #user id in the tf uid = tf.data_map[tf.get_user_column()][u] # user id iids = [tf.data_map[tf.get_item_column()][i] for i in items] # item ids that user has seen #original_factors = tf.factors["user"][uid] new_factors = pyTF.online_user_factors(tf.factors[1], iids, p_param=40, lambda_param=0.05) #replace original factors with the new factors tf.factors[0][uid, :] = new_factors #tf.update_user_factors(uid, new_factors) #lets evaluate the new model with real-time updated factors map2 = evaluator.evaluate_model(tf, testing) #The difference should be smaller than 20% assert abs(map1[0] - map2[0]) < 0.2 * map1[0]