Java源码示例:org.apache.mahout.cf.taste.recommender.RecommendedItem

示例1
public List<RecommendedItem> recommend(long userId, PreferenceArray preferences) throws TasteException {

		if (userExistsInDataModel(userId)) {
			return recommender.recommend(userId, noItems);
		}
		else {
			PlusAnonymousConcurrentUserDataModel plusModel = (PlusAnonymousConcurrentUserDataModel) recommender.getDataModel();

			// Take an available anonymous user form the poll
			Long anonymousUserID = plusModel.takeAvailableUser();

			// Set temporary preferences
			PreferenceArray tempPrefs = preferences;
			tempPrefs.setUserID(0, anonymousUserID);
			// tempPrefs.setItemID(0, itemID);
			plusModel.setTempPrefs(tempPrefs, anonymousUserID);

			List<RecommendedItem> results = recommender.recommend(anonymousUserID, noItems);

			// Release the user back to the poll
			plusModel.releaseUser(anonymousUserID);

			return results;

		}
	}
 
示例2
private static void recommend(String ratingsFile, int ... userIds)
    throws TasteException, IOException {
  DataModel model = new FileDataModel(new File(ratingsFile));

  UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

  UserNeighborhood neighborhood =
      new NearestNUserNeighborhood(
          100, similarity, model);

  Recommender recommender =  new GenericUserBasedRecommender(
      model, neighborhood, similarity);

  Recommender cachingRecommender = new CachingRecommender(recommender);

  for(int userId: userIds) {
    System.out.println("UserID " + userId);
    List<RecommendedItem> recommendations =
        cachingRecommender.recommend(userId, 2);
    for(RecommendedItem item: recommendations) {
      System.out.println("  item " + item.getItemID() + " score " + item.getValue());
    }
  }
}
 
示例3
@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;
    }
    value = (float) theRescorer.rescore(id, value);
    if (!LangUtils.isFinite(value)) {
      return null;
    }
  }
  delegate.set(id, value);
  return delegate;
}
 
示例4
@Test
public void testAnonymous() throws Exception {

  ClientRecommender client = getClient();
  List<RecommendedItem> recs = client.recommendToAnonymous(new long[] {190L}, 3);

  assertNotNull(recs);
  assertEquals(3, recs.size());

  log.info("{}", recs);

  assertEquals(83L, recs.get(0).getItemID());
  assertEquals(213L, recs.get(1).getItemID());
  assertEquals(86L, recs.get(2).getItemID());

  try {
    client.recommendToAnonymous(new long[]{0L}, 3);
    fail();
  } catch (NoSuchItemException nsie) {
    // good
  }
}
 
示例5
@Test
public void testAnonymous2() throws Exception {

  ClientRecommender client = getClient();
  List<RecommendedItem> recs =
      client.recommendToAnonymous(new long[] {190L}, new float[] {1.0f}, 3);

  assertNotNull(recs);
  assertEquals(3, recs.size());

  log.info("{}", recs);

  assertEquals(83L, recs.get(0).getItemID());
  assertEquals(213L, recs.get(1).getItemID());
  assertEquals(86L, recs.get(2).getItemID());

  try {
    client.recommendToAnonymous(new long[]{0L}, 3);
    fail();
  } catch (NoSuchItemException nsie) {
    // good
  }
}
 
示例6
@Override
public EvaluationResult evaluate(MyrrixRecommender recommender,
                                 RescorerProvider provider, // ignored
                                 Multimap<Long,RecommendedItem> testData) throws TasteException {
  DoubleWeightedMean score = new DoubleWeightedMean();
  int count = 0;
  for (Map.Entry<Long,RecommendedItem> entry : testData.entries()) {
    long userID = entry.getKey();
    RecommendedItem itemPref = entry.getValue();
    try {
      float estimate = recommender.estimatePreference(userID, itemPref.getItemID());
      Preconditions.checkState(LangUtils.isFinite(estimate));
      score.increment(1.0 - estimate, itemPref.getValue());
    } catch (NoSuchItemException nsie) {
      // continue
    } catch (NoSuchUserException nsue) {
      // continue
    }
    if (++count % 100000 == 0) {
      log.info("Score: {}", score);
    }
  }
  log.info("Score: {}", score);
  return new EvaluationResultImpl(score.getResult());
}
 
示例7
@Override
public RecommendedItem next() {
  FastByIDMap.MapEntry<float[]> entry = toFeaturesIterator.next();
  long itemID = entry.getKey();
  if (userTagIDs.contains(itemID)) {
    return null;
  }
  float[] candidateFeatures = entry.getValue();
  double candidateFeaturesNorm = SimpleVectorMath.norm(candidateFeatures);
  double estimate = SimpleVectorMath.dot(candidateFeatures, features) / (candidateFeaturesNorm * featuresNorm);
  if (!LangUtils.isFinite(estimate)) {
    return null;
  }
  delegate.set(itemID, (float) estimate);
  return delegate;
}
 
示例8
@Override
public int compare(RecommendedItem a, RecommendedItem b) {
  float aValue = a.getValue();
  float bValue = b.getValue();
  if (aValue < bValue) {
    return -1;
  }
  if (aValue > bValue) {
    return 1;
  }
  // Break ties by item ID, *de*scending. It's rare but at least gives predictable ordering.
  long aItem = a.getItemID();
  long bItem = b.getItemID();
  if (aItem > bItem) {
    return -1;
  }
  if (aItem < bItem) {
    return 1;
  }
  return 0;
}
 
示例9
@Test
public void testMostPopular() throws Exception {

  ClientRecommender client = getClient();
  List<RecommendedItem> popular = client.mostPopularItems(3);

  assertNotNull(popular);
  assertEquals(3, popular.size());

  log.info("{}", popular);

  assertEquals(50L, popular.get(0).getItemID());
  assertEquals(258L, popular.get(1).getItemID());
  assertEquals(100L, popular.get(2).getItemID());
  assertEquals(583.0f, popular.get(0).getValue());
  assertEquals(509.0f, popular.get(1).getValue());
  assertEquals(508.0f, popular.get(2).getValue());
}
 
示例10
@Override
public List<TranslatedRecommendedItem> recommendToAnonymous(String[] itemIDs,
                                                            float[] values,
                                                            int howMany,
                                                            String[] rescorerParams,
                                                            String contextUserID)
    throws TasteException {
  long[] longItemIDs = translateItems(itemIDs);
  Collection<RecommendedItem> originals;
  if (contextUserID == null) {
    originals = delegate.recommendToAnonymous(longItemIDs, values, howMany, rescorerParams, null);
  } else {
    originals =
        delegate.recommendToAnonymous(longItemIDs, values, howMany, rescorerParams, translateUser(contextUserID));
  }
  return translate(originals);
}
 
示例11
private static List<RecommendedItem> consumeItems(URLConnection connection) throws IOException {
  List<RecommendedItem> result = Lists.newArrayList();
  BufferedReader reader = IOUtils.bufferStream(connection.getInputStream());
  try {
    CharSequence line;
    while ((line = reader.readLine()) != null) {
      Iterator<String> tokens = COMMA.split(line).iterator();
      long itemID = Long.parseLong(tokens.next());
      float value = LangUtils.parseFloat(tokens.next());
      result.add(new GenericRecommendedItem(itemID, value));
    }
  } finally {
    reader.close();
  }
  return result;
}
 
示例12
@Test
public void testSet() throws Exception {
  ClientRecommender client = getClient();

  client.setPreference(0L, 1L);
  List<RecommendedItem> recs = client.recommend(0L, 1);
  assertEquals(50L, recs.get(0).getItemID());

  client.setPreference(0L, 2L, 3.0f);
  recs = client.recommend(0L, 1);
  assertEquals(117L, recs.get(0).getItemID());

  client.setPreference(0L, 2L, -3.0f);
  recs = client.recommend(0L, 1);
  assertEquals(117L, recs.get(0).getItemID());

  client.setPreference(0L, 1L, -1.0f);
  // Don't really know/care what will be recommend at this point; the feature vec is nearly 0
  assertEquals(1, client.recommend(0L, 1).size());
}
 
示例13
@Test
public void testRecommendToAnonymous() throws Exception {

  ClientRecommender client = getClient();
  // Adding non-existent item to make sure it is ignored
  List<RecommendedItem> recs = client.recommendToAnonymous(new long[] {1L, 3L, Integer.MAX_VALUE}, 3);

  assertNotNull(recs);
  assertEquals(3, recs.size());

  log.info("{}", recs);

  assertEquals(151L, recs.get(0).getItemID());
  assertEquals(50L, recs.get(1).getItemID());
  assertEquals(181L, recs.get(2).getItemID());
}
 
示例14
@Test
public void testTag() throws Exception {
  ClientRecommender client = getClient();
  
  client.setUserTag(5, "bar", -10.0f);
  List<RecommendedItem> recs = client.recommend(5, 1);
  log.info("{}", recs);
  assertEquals(2, recs.get(0).getItemID());
  assertEquals(0.5184667f, recs.get(0).getValue());
  
  client.setItemTag("bing", 4);
  recs = client.recommend(5, 1);
  log.info("{}", recs);
  assertEquals(2, recs.get(0).getItemID());
  assertEquals(0.5184667f, recs.get(0).getValue());
}
 
示例15
@Test
public void testRecommendVersusToMany2() throws Exception {
  ClientRecommender client = getClient();
  List<RecommendedItem> recs =
      client.recommendToMany(new long[] {4L, 2L}, 3, true, (String[]) null);
  List<RecommendedItem> recs2 =
      client.recommendToMany(new long[] {2L, 4L}, 3, true, (String[]) null);
  assertEquals(recs, recs2);
}
 
示例16
public static void main(String[] args) throws TasteException, IOException {
	//MF recommender model
   	DataModel model = new FileDataModel(new File("data/recodataset.csv"));   
   	//ALSWRFactorizer factorizer = new ALSWRFactorizer(model, 50, 0.065, 15);
   	ParallelSGDFactorizer factorizer = new ParallelSGDFactorizer(model,10,0.1,1);
   	SVDRecommender recommender = new SVDRecommender(model, factorizer);    	
   	
   	List<RecommendedItem> recommendations = recommender.recommend(2, 3);
   	for (RecommendedItem recommendation : recommendations) {
   	  System.out.println(recommendation);
   	}

}
 
示例17
public static void main(String[] args) throws TasteException, IOException {
	DataModel model = new FileDataModel(new File("data/dataset.csv"));
   	ItemSimilarity similarity = new LogLikelihoodSimilarity(model);
   	//UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model);
   	GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(model, similarity);
   	List<RecommendedItem> recommendations = recommender.mostSimilarItems(18, 3);
   	for (RecommendedItem recommendation : recommendations) {
   	  System.out.println(recommendation);
   	}

}
 
示例18
public static ItemBasedRecommender itemBased() throws Exception {

		// Load the data
		StringItemIdFileDataModel dataModel = loadFromFile("data/BX-Book-Ratings.csv", ";");
		// Collection<GenericItemSimilarity.ItemItemSimilarity> correlations =
		// null;
		// ItemItemSimilarity iis = new ItemItemSimilarity(0, 0, 0);
		// ItemSimilarity itemSimilarity = new
		// GenericItemSimilarity(correlations);
		ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);

		ItemBasedRecommender recommender = new GenericItemBasedRecommender(
				dataModel, itemSimilarity);

		IDRescorer rescorer = new MyRescorer();

		// List recommendations = recommender.recommend(2, 3, rescorer);
		String itemISBN = "042513976X";
		long itemID = dataModel.readItemIDFromString(itemISBN);
		int noItems = 10;

		System.out.println("Recommendations for item: " + books.get(itemISBN));

		System.out.println("\nMost similar items:");
		List<RecommendedItem> recommendations = recommender.mostSimilarItems(
				itemID, noItems);
		for (RecommendedItem item : recommendations) {
			itemISBN = dataModel.getItemIDAsString(item.getItemID());
			System.out.println("Item: " + books.get(itemISBN) + " | Item id: "
					+ itemISBN + " | Value: " + item.getValue());
		}
		
		return recommender;
	}
 
示例19
public void reduce(VarLongWritable key, Iterable<VectorWritable> values,Context context) throws IOException, InterruptedException{  
  
    int userID=(int)key.get();  
    Vector rev=null;  
    for(VectorWritable vec:values){  
        rev=rev==null? vec.get():rev.plus(vec.get());  
    }  
    Queue<RecommendedItem>topItems=new PriorityQueue<RecommendedItem>( recommendationsPerUser+1,  Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance())   );  
    Iterator<Vector.Element>recommendationVectorIterator=  rev.nonZeroes().iterator();  
    while(recommendationVectorIterator.hasNext()){  
        Vector.Element e=recommendationVectorIterator.next();  
        int index=e.index();  
        System.out.println("Vecotr.element.indxe:"+index);  //  test here  find the index is item id or not  ** test result : index is item  
        if(!hasItem(userID,String.valueOf(index))){  
            float value=(float) e.get();  
            if(topItems.size()<recommendationsPerUser){  
                //  here only set index  
                topItems.add(new GenericRecommendedItem(index,value));  
            }else if(value>topItems.peek().getValue()){  
                topItems.add(new GenericRecommendedItem(index,value));  
                topItems.poll();  
            }  
        }  
    }  
    List<RecommendedItem>recom=new ArrayList<RecommendedItem>(topItems.size());  
    recom.addAll(topItems);  
    Collections.sort(recom,ByValueRecommendedItemComparator.getInstance());  
    context.write(key, new RecommendedItemsWritable(recom));          
}
 
示例20
@Override
public List<RecommendedItem> recommendToAnonymous(long[] itemIDs,
                                                  float[] values,
                                                  int howMany,
                                                  IDRescorer rescorer)
    throws NotReadyException, NoSuchItemException {

  Preconditions.checkArgument(howMany > 0, "howMany must be positive");

  float[] anonymousUserFeatures = buildAnonymousUserFeatures(itemIDs, values);

  FastIDSet userKnownItemIDs = new FastIDSet(itemIDs.length);
  for (long itemID : itemIDs) {
    userKnownItemIDs.add(itemID);
  }

  float[][] anonymousFeaturesAsArray = { anonymousUserFeatures };

  Generation generation = getCurrentGeneration();    
  Lock yLock = generation.getYLock().readLock();    
  yLock.lock();
  try {
    return multithreadedTopN(anonymousFeaturesAsArray,
                             userKnownItemIDs,
                             generation.getUserTagIDs(),
                             rescorer,
                             howMany,
                             generation.getCandidateFilter());
  } finally {
    yLock.unlock();
  }
}
 
示例21
/**
 * One-argument version of {@link #mostSimilarItems(long[], int, Rescorer)}.
 */
@Override
public List<RecommendedItem> mostSimilarItems(long itemID, int howMany, Rescorer<LongPair> rescorer)
    throws NoSuchItemException, NotReadyException {

  Preconditions.checkArgument(howMany > 0, "howMany must be positive");

  Generation generation = getCurrentGeneration();
  FastByIDMap<float[]> Y = generation.getY();

  Lock yLock = generation.getYLock().readLock();
  yLock.lock();
  try {

    float[] itemFeatures = Y.get(itemID);
    if (itemFeatures == null) {
      throw new NoSuchItemException(itemID);
    }

    return TopN.selectTopN(new MostSimilarItemIterator(Y.entrySet().iterator(),
                                                       generation.getUserTagIDs(),
                                                       new long[] { itemID },
                                                       new float[][] { itemFeatures },
                                                       rescorer),
                           howMany);
  } finally {
    yLock.unlock();
  }

}
 
示例22
@Test
public void testTopPlusOne() {
  List<RecommendedItem> candidates = makeNCandidates(4);
  List<RecommendedItem> top3 = TopN.selectTopN(candidates.iterator(), 3);
  assertNotNull(top3);
  assertEquals(3, top3.size());
  assertEquals(4L, top3.get(0).getItemID());
  assertEquals(4.0f, top3.get(0).getValue());
  assertEquals(2L, top3.get(2).getItemID());
  assertEquals(2.0f, top3.get(2).getValue());
}
 
示例23
/**
 * Computes items most similar to an item or items. The returned items have the highest average similarity
 * to the given items.
 *
 * @param itemIDs items for which most similar items are required
 * @param howMany maximum number of similar items to return; fewer may be returned
 * @param rescorer rescoring function used to modify item-item similarities before ranking results
 * @return {@link RecommendedItem}s representing the top recommendations for the user, ordered by quality,
 *  descending. The score associated to it is an opaque value. Larger means more similar, but no further
 *  interpretation may necessarily be applied.
 * @throws NoSuchItemException if any of the items is not known in the model
 * @throws NotReadyException if the recommender has no model available yet
 */
@Override
public List<RecommendedItem> mostSimilarItems(long[] itemIDs, int howMany, Rescorer<LongPair> rescorer)
    throws NoSuchItemException, NotReadyException {

  Preconditions.checkArgument(howMany > 0, "howMany must be positive");

  Generation generation = getCurrentGeneration();
  FastByIDMap<float[]> Y = generation.getY();

  Lock yLock = generation.getYLock().readLock();
  yLock.lock();
  try {

    List<float[]> itemFeatures = Lists.newArrayListWithCapacity(itemIDs.length);
    for (long itemID : itemIDs) {
      float[] features = Y.get(itemID);
      if (features != null) {
        itemFeatures.add(features);
      }
    }
    if (itemFeatures.isEmpty()) {
      throw new NoSuchItemException(Arrays.toString(itemIDs));
    }
    float[][] itemFeaturesArray = itemFeatures.toArray(new float[itemFeatures.size()][]);

    return TopN.selectTopN(new MostSimilarItemIterator(Y.entrySet().iterator(), 
                                                       generation.getUserTagIDs(),
                                                       itemIDs, 
                                                       itemFeaturesArray, 
                                                       rescorer),
                           howMany);
  } finally {
    yLock.unlock();
  }
}
 
示例24
/**
 * {@code excludeItemIfNotSimilarToAll} is not applicable in this implementation.
 *
 * @return {@link #mostSimilarItems(long[], int)} if excludeItemIfNotSimilarToAll is false
 * @throws UnsupportedOperationException otherwise
 * @deprecated use {@link #mostSimilarItems(long[], int)} instead
 */
@Deprecated
@Override
public List<RecommendedItem> mostSimilarItems(long[] itemIDs,
                                              int howMany,
                                              boolean excludeItemIfNotSimilarToAll)
    throws NoSuchItemException, NotReadyException {
  if (excludeItemIfNotSimilarToAll) {
    throw new UnsupportedOperationException();
  }
  return mostSimilarItems(itemIDs, howMany);
}
 
示例25
/**
 * {@code excludeItemIfNotSimilarToAll} is not applicable in this implementation.
 *
 * @return {@link #mostSimilarItems(long[], int, Rescorer)} if excludeItemIfNotSimilarToAll is false
 * @throws UnsupportedOperationException otherwise
 * @deprecated use {@link #mostSimilarItems(long[], int, Rescorer)} instead
 */
@Deprecated
@Override
public List<RecommendedItem> mostSimilarItems(long[] itemIDs,
                                              int howMany,
                                              Rescorer<LongPair> rescorer,
                                              boolean excludeItemIfNotSimilarToAll)
    throws NoSuchItemException, NotReadyException {
  if (excludeItemIfNotSimilarToAll) {
    throw new UnsupportedOperationException();
  }
  return mostSimilarItems(itemIDs, howMany);
}
 
示例26
@Override
public EvaluationResult evaluate(MyrrixRecommender recommender,
                                 RescorerProvider provider, // ignored
                                 Multimap<Long,RecommendedItem> testData) throws TasteException {
  FastByIDMap<FastIDSet> converted = new FastByIDMap<FastIDSet>(testData.size());
  for (long userID : testData.keySet()) {
    Collection<RecommendedItem> userTestData = testData.get(userID);
    FastIDSet itemIDs = new FastIDSet(userTestData.size());
    converted.put(userID, itemIDs);
    for (RecommendedItem datum : userTestData) {
      itemIDs.add(datum.getItemID());
    }
  }
  return evaluate(recommender, converted);
}
 
示例27
@Test
public void testTopExactly() {
  List<RecommendedItem> candidates = makeNCandidates(3);
  List<RecommendedItem> top3 = TopN.selectTopN(candidates.iterator(), 3);
  assertNotNull(top3);
  assertEquals(3, top3.size());
  assertEquals(3L, top3.get(0).getItemID());
  assertEquals(3.0f, top3.get(0).getValue());
  assertEquals(1L, top3.get(2).getItemID());
  assertEquals(1.0f, top3.get(2).getValue());
}
 
示例28
public EvaluationResult evaluate(File originalDataDir) throws TasteException, IOException, InterruptedException {

    Preconditions.checkArgument(originalDataDir.exists() && originalDataDir.isDirectory(),
                                "%s is not a directory", originalDataDir);
    File tempDir = Files.createTempDir();

    ServerRecommender recommender = null;
    try {

      Multimap<Long,RecommendedItem> data;
      try {
        data = readAndCopyDataFiles(originalDataDir, tempDir);
      } catch (IOException ioe) {
        throw new TasteException(ioe);
      }

      recommender = new ServerRecommender(tempDir);
      recommender.await();

      Generation generation = recommender.getGenerationManager().getCurrentGeneration();
      FastByIDMap<float[]> X = generation.getX();
      FastByIDMap<float[]> Y = generation.getY();

      Mean averageError = new Mean();
      // Only compute average over existing entries...
      for (Map.Entry<Long,RecommendedItem> entry : data.entries()) {
        long userID = entry.getKey();
        long itemID = entry.getValue().getItemID();
        // Each of which was a "1" in the factor P matrix
        double value = SimpleVectorMath.dot(X.get(userID), Y.get(itemID));
        // So store abs(1-value), except, don't penalize for reconstructing > 1. Error is 0 in this case.
        averageError.increment(FastMath.max(0.0, 1.0 - value));
      }

      return new EvaluationResultImpl(averageError.getResult());
    } finally {
      recommender.close();
      IOUtils.deleteRecursively(tempDir);
    }
  }
 
示例29
private static Multimap<Long,RecommendedItem> readAndCopyDataFiles(File dataDir, File tempDir) throws IOException {
  Multimap<Long,RecommendedItem> data = 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();
      long userID = Long.parseLong(parts.next());
      long itemID = Long.parseLong(parts.next());
      if (parts.hasNext()) {
        String token = parts.next().trim();
        if (!token.isEmpty()) {
          data.put(userID, new GenericRecommendedItem(itemID, LangUtils.parseFloat(token)));
        }
        // Ignore remove lines
      } else {
        data.put(userID, new GenericRecommendedItem(itemID, 1.0f));
      }
      if (++count % 1000000 == 0) {
        log.info("Finished {} lines", count);
      }
    }

    Files.copy(dataFile, new File(tempDir, dataFile.getName()));
  }
  return data;
}
 
示例30
DataFileContents(Multimap<Long,RecommendedItem> data, 
                 Multimap<String,RecommendedItem> itemTags, 
                 Multimap<String,RecommendedItem> userTags) {
  Preconditions.checkNotNull(data);
  Preconditions.checkNotNull(itemTags);
  Preconditions.checkNotNull(userTags);
  this.data = data;
  this.itemTags = itemTags;
  this.userTags = userTags;
}