List of usage examples for org.apache.mahout.cf.taste.recommender IDRescorer rescore
double rescore(long id, double originalScore);
From source file:com.mashup.resys.recommender.TopItems.java
License:Apache License
public static List<RecommendedItem> getTopItems(int howMany, LongPrimitiveIterator possibleItemIDs, IDRescorer rescorer, Estimator<Long> estimator) throws TasteException { if ((possibleItemIDs == null) || (estimator == null)) { throw new IllegalArgumentException("argument is null"); }//from ww w.j a va 2 s .co m Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(howMany + 1, Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance())); boolean full = false; double lowestTopValue = Double.NEGATIVE_INFINITY; while (possibleItemIDs.hasNext()) { long itemID = possibleItemIDs.next(); if ((rescorer == null) || !rescorer.isFiltered(itemID)) { double preference; try { preference = estimator.estimate(itemID); } catch (NoSuchItemException nsie) { continue; } double rescoredPref = rescorer == null ? preference : rescorer.rescore(itemID, preference); if (!Double.isNaN(rescoredPref) && (!full || (rescoredPref > lowestTopValue))) { topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref)); if (full) { topItems.poll(); } else if (topItems.size() > howMany) { full = true; topItems.poll(); } lowestTopValue = topItems.peek().getValue(); } } } int size = topItems.size(); if (size == 0) { return Collections.emptyList(); } List<RecommendedItem> result = new ArrayList<RecommendedItem>(size); result.addAll(topItems); Collections.sort(result, ByValueRecommendedItemComparator.getInstance()); return result; }
From source file:com.mashup.resys.recommender.TopItems.java
License:Apache License
public static long[] getTopUsers(int howMany, LongPrimitiveIterator allUserIDs, IDRescorer rescorer, Estimator<Long> estimator) throws TasteException { Queue<SimilarUser> topUsers = new PriorityQueue<SimilarUser>(howMany + 1, Collections.reverseOrder()); boolean full = false; double lowestTopValue = Double.NEGATIVE_INFINITY; while (allUserIDs.hasNext()) { long userID = allUserIDs.next(); if ((rescorer != null) && rescorer.isFiltered(userID)) { continue; }/*from ww w . j a v a 2s .c o m*/ double similarity; try { similarity = estimator.estimate(userID); } catch (NoSuchUserException nsue) { continue; } double rescoredSimilarity = rescorer == null ? similarity : rescorer.rescore(userID, similarity); if (!Double.isNaN(rescoredSimilarity) && (!full || (rescoredSimilarity > lowestTopValue))) { topUsers.add(new SimilarUser(userID, similarity)); if (full) { topUsers.poll(); } else if (topUsers.size() > howMany) { full = true; topUsers.poll(); } lowestTopValue = topUsers.peek().getSimilarity(); } } int size = topUsers.size(); if (size == 0) { return NO_IDS; } List<SimilarUser> sorted = new ArrayList<SimilarUser>(size); sorted.addAll(topUsers); Collections.sort(sorted); long[] result = new long[size]; int i = 0; for (SimilarUser similarUser : sorted) { result[i++] = similarUser.getUserID(); } return result; }
From source file:com.webir.popcornsaver.cluster.TreeClusteringRecommender.java
License:Apache License
@Override public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException { Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1"); buildClusters();/*from ww w. j a va 2s .c o m*/ log.debug("Recommending items for user ID '{}'", userID); List<RecommendedItem> recommended = topRecsByUserID.get(userID); if (recommended == null) { return Collections.emptyList(); } DataModel dataModel = getDataModel(); List<RecommendedItem> rescored = new ArrayList<RecommendedItem>(recommended.size()); // Only add items the user doesn't already have a preference for. // And that the rescorer doesn't "reject". for (RecommendedItem recommendedItem : recommended) { long itemID = recommendedItem.getItemID(); if ((rescorer != null) && rescorer.isFiltered(itemID)) { continue; } if ((dataModel.getPreferenceValue(userID, itemID) == null) && ((rescorer == null) || !Double.isNaN(rescorer.rescore(itemID, recommendedItem.getValue())))) { rescored.add(recommendedItem); } } Collections.sort(rescored, new ByRescoreComparator(rescorer)); return rescored; }
From source file:net.myrrix.online.eval.AbstractEvaluator.java
License:Apache License
private static DataFileContents readDataFile(File dataDir, double evaluationPercentage, RescorerProvider provider) throws IOException { // evaluationPercentage filters per user and item, not per datum, since time scales with users and // items. We select sqrt(evaluationPercentage) of users and items to overall select about evaluationPercentage // of all data. int perMillion = (int) (1000000 * FastMath.sqrt(evaluationPercentage)); Multimap<Long, RecommendedItem> data = ArrayListMultimap.create(); Multimap<String, RecommendedItem> itemTags = ArrayListMultimap.create(); Multimap<String, RecommendedItem> userTags = ArrayListMultimap.create(); for (File dataFile : dataDir.listFiles(new PatternFilenameFilter(".+\\.csv(\\.(zip|gz))?"))) { log.info("Reading {}", dataFile); int count = 0; for (CharSequence line : new FileLineIterable(dataFile)) { Iterator<String> parts = COMMA_TAB_SPLIT.split(line).iterator(); String userIDString = parts.next(); if (userIDString.hashCode() % 1000000 <= perMillion) { String itemIDString = parts.next(); if (itemIDString.hashCode() % 1000000 <= perMillion) { Long userID = null; boolean userIsTag = userIDString.startsWith("\""); if (!userIsTag) { userID = Long.valueOf(userIDString); }//from w w w . j a v a 2 s.com boolean itemIsTag = itemIDString.startsWith("\""); Long itemID = null; if (!itemIsTag) { itemID = Long.valueOf(itemIDString); } Preconditions.checkArgument(!(userIsTag && itemIsTag), "Can't have a user tag and item tag in one line"); if (parts.hasNext()) { String token = parts.next().trim(); if (!token.isEmpty()) { float value = LangUtils.parseFloat(token); if (userIsTag) { itemTags.put(userIDString, new GenericRecommendedItem(itemID, value)); } else if (itemIsTag) { userTags.put(itemIDString, new GenericRecommendedItem(userID, value)); } else { if (provider != null) { IDRescorer rescorer = provider.getRecommendRescorer(new long[] { userID }, (MyrrixRecommender) null); if (rescorer != null) { value = (float) rescorer.rescore(itemID, value); } } data.put(userID, new GenericRecommendedItem(itemID, value)); } } // Ignore remove lines } else { if (userIsTag) { itemTags.put(userIDString, new GenericRecommendedItem(itemID, 1.0f)); } else if (itemIsTag) { userTags.put(itemIDString, new GenericRecommendedItem(userID, 1.0f)); } else { float value = 1.0f; if (provider != null) { IDRescorer rescorer = provider.getRecommendRescorer(new long[] { userID }, (MyrrixRecommender) null); if (rescorer != null) { value = (float) rescorer.rescore(itemID, value); } } data.put(userID, new GenericRecommendedItem(itemID, value)); } } } } if (++count % 1000000 == 0) { log.info("Finished {} lines", count); } } } return new DataFileContents(data, itemTags, userTags); }
From source file:net.myrrix.online.MostPopularItemsIterator.java
License:Apache License
@Override public RecommendedItem next() { FastByIDFloatMap.MapEntry entry = countsIterator.next(); long id = entry.getKey(); float value = entry.getValue(); IDRescorer theRescorer = rescorer; if (theRescorer != null) { if (theRescorer.isFiltered(id)) { return null; }/*w w w . j a v a 2 s . co m*/ value = (float) theRescorer.rescore(id, value); if (!LangUtils.isFinite(value)) { return null; } } delegate.set(id, value); return delegate; }
From source file:net.myrrix.online.MultiRescorer.java
License:Apache License
@Override public double rescore(long itemID, double value) { for (IDRescorer rescorer : rescorers) { value = rescorer.rescore(itemID, value); if (Double.isNaN(value)) { return Double.NaN; }//from w w w . j a v a 2 s . c o m } return value; }
From source file:net.myrrix.online.RecommendIterator.java
License:Apache License
@Override public RecommendedItem next() { FastByIDMap.MapEntry<float[]> entry = Yiterator.next(); long itemID = entry.getKey(); if (userTagIDs.contains(itemID)) { return null; }//from w w w . j a v a 2s . com FastIDSet theKnownItemIDs = knownItemIDs; if (theKnownItemIDs != null) { synchronized (theKnownItemIDs) { if (theKnownItemIDs.contains(itemID)) { return null; } } } IDRescorer rescorer = this.rescorer; if (rescorer != null && rescorer.isFiltered(itemID)) { return null; } float[] itemFeatures = entry.getValue(); double sum = 0.0; int count = 0; for (float[] oneUserFeatures : features) { sum += SimpleVectorMath.dot(itemFeatures, oneUserFeatures); count++; } if (rescorer != null) { sum = rescorer.rescore(itemID, sum); if (!LangUtils.isFinite(sum)) { return null; } } float result = (float) (sum / count); Preconditions.checkState(LangUtils.isFinite(result), "Bad recommendation value"); delegate.set(itemID, result); return delegate; }
From source file:org.plista.kornakapi.core.recommender.ArrayTopItems.java
License:Apache License
public static List<RecommendedItem> getTopItems(int howMany, long[] possibleItemIDs, int fromIndex, int toIndex, IDRescorer rescorer, TopItems.Estimator<Long> estimator) throws TasteException { Preconditions.checkArgument(possibleItemIDs != null, "possibleItemIDs is null"); Preconditions.checkArgument(estimator != null, "estimator is null"); Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(howMany + 1, Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance())); boolean full = false; double lowestTopValue = Double.NEGATIVE_INFINITY; for (int index = fromIndex; index < toIndex; index++) { long itemID = possibleItemIDs[index]; if (rescorer == null || !rescorer.isFiltered(itemID)) { double preference; try { preference = estimator.estimate(itemID); } catch (NoSuchItemException nsie) { continue; } catch (NoSuchUserException nsue) { continue; }/*from w w w. ja va 2s . c o m*/ double rescoredPref = rescorer == null ? preference : rescorer.rescore(itemID, preference); if (!Double.isNaN(rescoredPref) && (!full || rescoredPref > lowestTopValue)) { topItems.add(new GenericRecommendedItem(itemID, (float) rescoredPref)); if (full) { topItems.poll(); } else if (topItems.size() > howMany) { full = true; topItems.poll(); } lowestTopValue = topItems.peek().getValue(); } } } int size = topItems.size(); if (size == 0) { return Collections.emptyList(); } List<RecommendedItem> result = Lists.newArrayListWithCapacity(size); result.addAll(topItems); Collections.sort(result, ByValueRecommendedItemComparator.getInstance()); return result; }