// Copyright (C) Zeno Gantner, Chris Newell
//
// This file is part of MyMediaLite.
//
// MyMediaLite is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// MyMediaLite is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with MyMediaLite. If not, see <http://www.gnu.org/licenses/>.
package org.mymedialite.examples;
import java.io.File;
import java.io.IOException;
import java.util.*;
import org.mymedialite.data.EntityMapping;
import org.mymedialite.data.IPosOnlyFeedback;
import org.mymedialite.eval.Items;
import org.mymedialite.io.ItemData;
import org.mymedialite.itemrec.BPRMF;
/**
* Example program for ItemRecommenders.
* @version 2.03
*/
public class ItemRecommenderExample {
public static final String MODEL_FILE = "online_viewings.dat";
public static void main(String[] args) {
long start = Calendar.getInstance().getTimeInMillis();
// Load the data
EntityMapping user_mapping = new EntityMapping();
EntityMapping item_mapping = new EntityMapping();
IPosOnlyFeedback training_data = null;
try {
training_data = ItemData.read(args[0], user_mapping, item_mapping, false);
} catch (Exception e) {
e.printStackTrace();
}
IPosOnlyFeedback test_data = null;
try {
test_data = ItemData.read(args[1], user_mapping, item_mapping, false);
} catch (Exception e) {
e.printStackTrace();
}
// Set up the recommender
BPRMF recommender = new BPRMF();
//MostPopular recommender = new MostPopular();
System.out.println(recommender);
recommender.setFeedback(training_data);
File file = new File(MODEL_FILE);
try {
if(file.exists()) {
recommender.loadModel(MODEL_FILE);
} else {
recommender.train();
recommender.saveModel(MODEL_FILE);
}
} catch (IOException e) {
System.err.println(e.getMessage());
}
/*
* Test incremental update.
*/
// int internalUserId1 = user_mapping.toInternalID(28221);
// recommender.addUser(internalUserId1);
//
// int internalItemId1 = item_mapping.toInternalID(2854);
// recommender.addItem(internalItemId1);
// recommender.addFeedback(internalUserId1, internalItemId1);
//
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2855));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2985));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2071));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(950));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2982));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2857));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2979));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2316));
// recommender.addFeedback(internalUserId1, item_mapping.toInternalID(2978));
// Measure the accuracy on the test data set
Collection<Integer> candidate_items = training_data.allItems(); // items that will be taken into account in the evaluation
Collection<Integer> test_users = training_data.allUsers(); // users that will be taken into account in the evaluation
try {
HashMap<String, Double> results = Items.evaluate(recommender, test_data, training_data, test_users, candidate_items);
System.out.println("AUC " + results.get("AUC"));
System.out.println("MAP " + results.get("MAP"));
System.out.println("NDCG " + results.get("NDCG"));
System.out.println("prec@5 " + results.get("prec@5"));
System.out.println("prec@10 " + results.get("prec@10"));
System.out.println("prec@15 " + results.get("prec@15"));
System.out.println("num_users " + results.get("num_users"));
System.out.println("num_items " + results.get("num_items"));
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
// Make a prediction for a certain user and item.
String userId = "2";
String itemId = "2716";
double prediction = recommender.predict(user_mapping.toInternalID(userId), item_mapping.toInternalID(itemId));
System.out.println("userId: " + userId + " itemId: " + itemId + " prediction: " + prediction);
long end = Calendar.getInstance().getTimeInMillis();
System.out.println("Time taken: " + ((end - start) / 1000F) + " seconds");
start = end;
}
}