Transform(long uid) { user = uid; userBias = model.getIntercept() + model.getUserBias(user); }
@Nonnull @Override public Map<Long, Double> score(long user, @Nonnull Collection<Long> items) { LongSet itemSet = LongUtils.frozenSet(items); double base = model.getIntercept() + model.getUserBias(user); return LongUtils.flyweightMap(itemSet, iid -> base + model.getItemBias(iid)); }
@Nonnull @Override public ResultMap scoreWithDetails(long user, @Nonnull Collection<Long> items) { List<Result> results = new ArrayList<>(); double base = model.getIntercept() + model.getUserBias(user); LongIterator iter = LongIterators.asLongIterator(items.iterator()); while (iter.hasNext()) { long item = iter.nextLong(); results.add(Results.create(item, base + model.getItemBias(item))); } return Results.newResultMap(results); } }
@Override public Result score(long user, long item) { return Results.create(item, model.getIntercept() + model.getUserBias(user) + model.getItemBias(item)); }
@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 testWithUsers() { BiasModel model = new UserItemBiasModel(1.5, Long2DoubleMaps.singleton(42L, 1.0), Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getUserBias(42L), equalTo(1.0)); assertThat(model.getUserBias(37L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
@Test public void testWithUsers() { BiasModel model = new UserBiasModel(1.5, Long2DoubleMaps.singleton(42L, 1.0)); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getUserBias(42L), equalTo(1.0)); assertThat(model.getUserBias(37L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
@Test public void testNoUsers() { BiasModel model = new UserBiasModel(1.5, Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getItemBias(42L), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); }
@Test public void testBasicBias() { BiasModel model = new UserItemBiasModel(Math.PI, Long2DoubleMaps.EMPTY_MAP, Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(Math.PI)); assertThat(model.getUserBias(42L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
@Test public void testNoItems() { BiasModel model = new ItemBiasModel(1.5, Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getItemBias(42L), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); }
@Test public void testZeroBias() { BiasModel model = new GlobalBiasModel(0); assertThat(model.getIntercept(), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
@Test public void testZeroBias() { BiasModel model = new UserItemBiasModel(0, Long2DoubleMaps.EMPTY_MAP, Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
@Test public void testBasicBias() { BiasModel model = new GlobalBiasModel(Math.PI); assertThat(model.getIntercept(), equalTo(Math.PI)); assertThat(model.getUserBias(42L), equalTo(0.0)); assertThat(model.getItemBias(42L), equalTo(0.0)); }
/** * Initialize the training estimator. * @param snap The getEntry snapshot. * @param baseline The baseline predictor. * @param dom The getEntry domain (for clamping). */ TrainingEstimator(RatingMatrix snap, BiasModel baseline, PreferenceDomain dom) { ratings = snap.getRatings(); domain = dom; estimates = new double[ratings.size()]; final LongCollection userIds = snap.getUserIds(); LongIterator userIter = userIds.iterator(); double global = baseline.getIntercept(); for (RatingMatrixEntry r: snap.getRatings()) { double userBias = baseline.getUserBias(r.getUserId()); double itemBias = baseline.getItemBias(r.getItemId()); estimates[r.getIndex()] = global + userBias + itemBias; } }
@Test public void testWithItems() { BiasModel model = new ItemBiasModel(1.5, Long2DoubleMaps.singleton(42L, 1.0)); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getItemBias(42L), equalTo(1.0)); assertThat(model.getItemBias(37L), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); }
@Test public void testWithItems() { BiasModel model = new UserItemBiasModel(1.5, Long2DoubleMaps.EMPTY_MAP, Long2DoubleMaps.singleton(42L, 1.0)); assertThat(model.getIntercept(), equalTo(1.5)); assertThat(model.getItemBias(42L), equalTo(1.0)); assertThat(model.getItemBias(37L), equalTo(0.0)); assertThat(model.getUserBias(42L), equalTo(0.0)); }
@Test public void testComputeUserMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(102, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(101, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(UserAverageRatingBiasModelProvider.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getUserBias(100), closeTo(-0.5, 1.0e-3)); assertThat(model.getUserBias(101), closeTo(0.25, 1.0e-3)); assertThat(model.getUserBias(102), closeTo(0.0, 1.0e-3)); }
assertThat(model.getItemBias(201), closeTo(-1.0, 1.0e-3)); assertThat(model.getItemBias(203), closeTo(0.5, 1.0e-3)); assertThat(model.getUserBias(100), closeTo(-0.5, 1.0e-3)); assertThat(model.getUserBias(101), closeTo(0, 1.0e-3)); assertThat(model.getUserBias(102), closeTo(0.25, 1.0e-3)); assertThat(model.getUserBias(105), closeTo(0.9, 1.0e-3));
@Test public void testComputeMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(102, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(101, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).to(UserBiasModel.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getUserBias(100), closeTo(-0.5, 1.0e-3)); assertThat(model.getUserBias(101), closeTo(0.25, 1.0e-3)); assertThat(model.getUserBias(102), closeTo(0.0, 1.0e-3)); } }
@Test public void testComputeAllMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(102, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(101, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(UserItemAverageRatingBiasModelProvider.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getItemBias(200), closeTo(0.0, 1.0e-3)); assertThat(model.getItemBias(201), closeTo(-1.0, 1.0e-3)); assertThat(model.getItemBias(203), closeTo(0.5, 1.0e-3)); assertThat(model.getUserBias(100), closeTo(-0.5, 1.0e-3)); assertThat(model.getUserBias(101), closeTo(0, 1.0e-3)); assertThat(model.getUserBias(102), closeTo(0.25, 1.0e-3)); } }