/** * {@inheritDoc} */ @Override public void printGroundtruth(final Long user, final PrintStream out, final OUTPUT_FORMAT format) { final Map<Long, Double> relItems = new HashMap<Long, Double>(); for (Long i : test.getUserItems(user)) { Double d = test.getUserItemPreference(user, i); if (d >= threshold) { relItems.put(i, d); } } printGroundtruth("" + user, relItems, out, format); }
/** * Method that saves a data model to a file. * * @param dm the data model * @param outfile file where the model will be saved * @param overwrite flag that indicates if the file should be overwritten * @param delimiter field delimiter * @param <U> type of users * @param <I> type of items * @throws FileNotFoundException when outfile cannot be used. * @throws UnsupportedEncodingException when the requested encoding (UTF-8) * is not available. */ public static <U, I> void saveDataModel(final DataModelIF<U, I> dm, final String outfile, final boolean overwrite, final String delimiter) throws FileNotFoundException, UnsupportedEncodingException { if (new File(outfile).exists() && !overwrite) { System.out.println("Ignoring " + outfile); } else { PrintStream out = new PrintStream(outfile, "UTF-8"); for (U user : dm.getUsers()) { for (I item : dm.getUserItems(user)) { Double pref = dm.getUserItemPreference(user, item); out.println(user + delimiter + item + delimiter + pref); } } out.close(); } }
double prefCV = data.getUserItemPreference(user, crossValidatedItem); String timestamp = null; Double pref = data.getUserItemPreference(user, item); if (hasTimestamps) { List<Long> times = new ArrayList<>();
Collections.shuffle(items, rnd); for (I item : items) { Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) { Collections.shuffle(items, rnd); for (I item : items) { Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) {
/** * {@inheritDoc} */ @Override public Set<Long> getCandidateItemsToRank(final Long user) { final Set<Long> allItems = getModelTrainingDifference(getTraining(), user); allItems.addAll(getModelTrainingDifference(getTest(), user)); // return only N not relevant items List<Long> shuffledItems = new ArrayList<Long>(allItems); Collections.shuffle(shuffledItems, rnd); shuffledItems = shuffledItems.subList(0, Math.min(shuffledItems.size(), n)); final Set<Long> items = new HashSet<Long>(shuffledItems); // add relevant ones for (Long i : getTest().getUserItems(user)) { if (getTest().getUserItemPreference(user, i) >= getThreshold()) { items.add(i); } } return items; }
/** * {@inheritDoc} */ @Override public void printGroundtruth(final Long user, final PrintStream out, final OUTPUT_FORMAT format) { for (Long i : getTest().getUserItems(user)) { Double d = getTest().getUserItemPreference(user, i); if (d >= getThreshold()) { final Map<Long, Double> tmp = new HashMap<Long, Double>(); tmp.put(i, d); printGroundtruth(user + "_" + i, tmp, out, format); } } }
/** * Method that transforms the user data from pairs of (item, score) into * ranked lists of relevance values, by using ground truth information. * * @return a map with the transformed data, one list per user */ public Map<U, List<Pair<I, Double>>> processDataAsRankedTestRelevance() { Map<U, List<Pair<I, Double>>> data = new HashMap<U, List<Pair<I, Double>>>(); for (U testUser : getTest().getUsers()) { Map<I, Double> userPredictedRatings = new HashMap<>(); for (I i : getPredictions().getUserItems(testUser)) { userPredictedRatings.put(i, getPredictions().getUserItemPreference(testUser, i)); } if (!userPredictedRatings.isEmpty()) { List<Pair<I, Double>> rankedTestRel = new ArrayList<Pair<I, Double>>(); for (I item : rankItems(userPredictedRatings)) { double rel = getTest().getUserItemPreference(testUser, item); if (Double.isNaN(rel)) { rel = 0.0; } rankedTestRel.add(new Pair<I, Double>(item, rel)); } data.put(testUser, rankedTestRel); } } return data; }
for (Long user : recModel.getUsers()) { for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
/** * {@inheritDoc} */ @Override public void printRanking(final Long user, final List<Pair<Long, Double>> scoredItems, final PrintStream out, final OUTPUT_FORMAT format) { final Set<Long> relItems = new HashSet<Long>(); for (Long i : getTest().getUserItems(user)) { if (getTest().getUserItemPreference(user, i) >= getThreshold()) { relItems.add(i); } } final Map<Long, Double> relScores = new HashMap<Long, Double>(); final Map<Long, Double> notRelScores = new HashMap<Long, Double>(); for (Pair<Long, Double> p : scoredItems) { if (relItems.contains(p.getFirst())) { relScores.put(p.getFirst(), p.getSecond()); } else { notRelScores.put(p.getFirst(), p.getSecond()); } } for (Entry<Long, Double> e : relScores.entrySet()) { Long r = e.getKey(); Map<Long, Double> m = new HashMap<Long, Double>(notRelScores); m.put(r, e.getValue()); printRanking(user + "_" + r, m, out, format); } }
assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
double realRating = getTest().getUserItemPreference(testUser, testItem); double predictedRating = Double.NaN; // NaN as default value if (getPredictions().getUserItems(testUser) != null) { predictedRating = getPredictions().getUserItemPreference(testUser, testItem); if (Double.isNaN(predictedRating)) { emptyItems++;
for (int i = 0; i < items.size(); i++) { I item = items.get(i); Double pref = data.getUserItemPreference(user, item); DataModelIF<U, I> datamodel = splits[0]; // training if (i > splitPoint) { for (U user : data.getUsers()) { for (I item : data.getUserItems(user)) { Double pref = data.getUserItemPreference(user, item); if (doSplitPerItems) { DataModelIF<U, I> datamodel = splits[0]; // training
for (Long user : recModel.getUsers()) { for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) { Double pref = data.getUserItemPreference(user, item); int curFold = n % nFolds; for (int i = 0; i < nFolds; i++) {
assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
assert strategy != null; for (Long item : strategy.getCandidateItemsToRank(user)) { if (!Double.isNaN(recModel.getUserItemPreference(user, item))) { modelToEval.addPreference(user, item, recModel.getUserItemPreference(user, item));
userTest.put(i, getTest().getUserItemPreference(user, i));
/** * Method that computes the number of relevant items in the test set for a * user. * * @param user a user * @return the number of relevant items the user has in the test set */ protected double getNumberOfRelevantItems(final U user) { int n = 0; if (getTest().getUserItems(user) != null) { for (I i : getTest().getUserItems(user)) { if (getTest().getUserItemPreference(user, i) >= relevanceThreshold) { n++; } } } return n * 1.0; }