@Override public Long2DoubleMap apply(Long2DoubleMap input) { Long2DoubleMap biases = model.getItemBiases(input.keySet()); return Vectors.combine(input, biases, -1.0, -userBias); } }
@Override public Long2DoubleMap unapply(Long2DoubleMap input) { Long2DoubleMap biases = model.getItemBiases(input.keySet()); return Vectors.combine(input, biases, 1.0, userBias); }
@Nonnull @Override public ResultMap scoreWithDetails(long user, @Nonnull Collection<Long> items) { Long2DoubleMap baselines = biasModel.getItemBiases(LongUtils.packedSet(items)); baselines = Vectors.addScalar(baselines, biasModel.getIntercept() + biasModel.getUserBias(user)); RealVector uvec = getUserPreferenceVector(user); if (uvec == null) { return Results.newResultMap(); } List<Result> results = new ArrayList<>(items.size()); LongIterator iter = LongIterators.asLongIterator(items.iterator()); while (iter.hasNext()) { long item = iter.nextLong(); RealVector ivec = model.getItemVector(item); if (ivec != null) { double score = computeScore(baselines.get(item), uvec, ivec); results.add(Results.create(item, score)); } } return Results.newResultMap(results); } }
@Test public void testManyItems() { Generator<Double> globals = doubles(); for (Map<Long,Double> map: someMaps(positiveLongs(), doubles())) { double bias = globals.next(); Long2DoubleMap itemBiases = Long2DoubleSortedArrayMap.create(map); BiasModel model = new UserItemBiasModel(bias, Long2DoubleMaps.EMPTY_MAP, itemBiases); assertThat(model.getIntercept(), equalTo(bias)); assertThat(model.getItemBiases(itemBiases.keySet()), equalTo(itemBiases)); for (Set<Long> users : someSets(positiveLongs())) { Long2DoubleMap biases = model.getItemBiases(LongUtils.packedSet(users)); for (long user: users) { if (itemBiases.containsKey(user)) { assertThat(biases.get(user), equalTo(itemBiases.get(user))); } else { assertThat(biases.get(user), equalTo(0.0)); } } } } }
@Override public Long2DoubleMap unapply(Long2DoubleMap input) { Long2DoubleMap biases = model.getItemBiases(input.keySet()); return Vectors.combine(input, biases, 1.0, userBias); }
@Override public Long2DoubleMap apply(Long2DoubleMap input) { Long2DoubleMap biases = model.getItemBiases(input.keySet()); return Vectors.combine(input, biases, -1.0, -userBias); } }
@Nonnull @Override public ResultMap scoreWithDetails(long user, @Nonnull Collection<Long> items) { Long2DoubleMap baselines = biasModel.getItemBiases(LongUtils.packedSet(items)); baselines = Vectors.addScalar(baselines, biasModel.getIntercept() + biasModel.getUserBias(user)); RealVector uvec = getUserPreferenceVector(user); if (uvec == null) { return Results.newResultMap(); } List<Result> results = new ArrayList<>(items.size()); LongIterator iter = LongIterators.asLongIterator(items.iterator()); while (iter.hasNext()) { long item = iter.nextLong(); RealVector ivec = model.getItemVector(item); if (ivec != null) { double score = kernel.apply(baselines.get(item), uvec, ivec); results.add(Results.create(item, score)); } } return Results.newResultMap(results); } }