/** * Create a new rating object. * * @param uid The user ID. * @param iid The item ID. * @param rating The rating value. Cannot be NaN. * @param ts The timestamp. * @return The new rating object. * @throws IllegalArgumentException if {@code rating} is NaN. * @deprecated Use {@link EntityFactory#rating(long, long, double, long)} */ @Deprecated public static Rating create(long uid, long iid, double rating, long ts) { return factory.rating(uid, iid, rating, ts); }
@Before public void createRatingSource() { EntityFactory efac = new EntityFactory(); List<Rating> rs = new ArrayList<>(); rs.add(efac.rating(1, 5, 2)); rs.add(efac.rating(1, 7, 4)); rs.add(efac.rating(8, 4, 5)); rs.add(efac.rating(8, 5, 4)); source = new StaticDataSource(); source.addSource(rs); dao = source.get(); config = new LenskitConfiguration(); config.bind(ItemScorer.class).to(BiasItemScorer.class); }
@Test public void testComputeGlobalMean() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(101, 201, 2.5), efac.rating(102, 203, 4.5)); Provider<GlobalBiasModel> biasProvider = new GlobalAverageRatingBiasModelProvider(daoBuilder.build()); BiasModel model = biasProvider.get(); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-1)); } }
@Test public void testGetsOnlyRating() { EntityCollectionDAO dao = EntityCollectionDAO.create(factory.rating(42, 39, 2.5), factory.rating(42, 20, 3.5), factory.rating(17, 39, 1.5)); RatingVectorPDAO source = new StandardRatingVectorPDAO(dao); Long2DoubleMap vec = source.userRatingVector(42); assertThat(vec.entrySet(), hasSize(2)); assertThat(vec, hasEntry(39L, 2.5)); assertThat(vec, hasEntry(20L, 3.5)); } }
@Test public void testAddEntities() { GenericEntityIndexBuilder bld = new GenericEntityIndexBuilder("user"); Entity r1 = factory.rating(10, 100, 3.5); Entity r2 = factory.rating(10, 50, 4.5); Entity r3 = factory.rating(15, 100, 2.5); bld.add(r1); bld.add(r3); bld.add(r2); EntityIndex index = bld.build(); assertThat(index, notNullValue()); assertThat(index.getEntities(10L), containsInAnyOrder(r1, r2)); assertThat(index.getEntities(11L), hasSize(0)); assertThat(index.getEntities(15L), contains(r3)); } }
@Test public void testAddEntities() { LongEntityIndexBuilder bld = new LongEntityIndexBuilder("user"); Entity r1 = factory.rating(10, 100, 3.5); Entity r2 = factory.rating(10, 50, 4.5); Entity r3 = factory.rating(15, 100, 2.5); bld.add(r1); bld.add(r3); bld.add(r2); EntityIndex index = bld.build(); assertThat(index, notNullValue()); assertThat(index.getEntities(10L), containsInAnyOrder(r1, r2)); assertThat(index.getEntities(11L), hasSize(0)); assertThat(index.getEntities(15L), contains(r3)); } }
@Test public void testNonLongValueEntity() { LongEntityIndexBuilder bld = new LongEntityIndexBuilder("user"); Entity rating = factory.rating(10, 100, 3.5); bld.add(rating); EntityIndex index = bld.build(); assertThat(index, notNullValue()); assertThat(index.getEntities("10"), hasSize(0)); }
@Test public void testAddEntity() { LongEntityIndexBuilder bld = new LongEntityIndexBuilder("user"); Entity rating = factory.rating(10, 100, 3.5); bld.add(rating); EntityIndex index = bld.build(); assertThat(index, notNullValue()); assertThat(index.getEntities(10L), contains(rating)); assertThat(index.getEntities(11L), hasSize(0)); }
@Test public void testAddEntity() { GenericEntityIndexBuilder bld = new GenericEntityIndexBuilder("user"); Entity rating = factory.rating(10, 100, 3.5); bld.add(rating); EntityIndex index = bld.build(); assertThat(index, notNullValue()); assertThat(index.getEntities(10L), hasSize(1)); assertThat(index.getEntities(10L), contains(rating)); assertThat(index.getEntities(11L), hasSize(0)); }
@Test public void testGroupEntities() { EntityFactory efac = new EntityFactory(); Rating r1 = efac.rating(100, 200, 3.5); Rating r2 = efac.rating(100, 201, 4.0); Rating r3 = efac.rating(101, 200, 2.0); EntityCollection ec = EntityCollection.newBuilder(CommonTypes.RATING, AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID, CommonAttributes.RATING)) .add(r1) .add(r2) .add(r3) .addIndex(CommonAttributes.USER_ID) .build(); Map<Long,List<Entity>> groups = ec.grouped(CommonAttributes.USER_ID); assertThat(groups.keySet(), containsInAnyOrder(100L, 101L)); assertThat(groups, hasEntry(equalTo(101L), contains(r3))); assertThat(groups, hasEntry(equalTo(100L), containsInAnyOrder(r1, r2))); groups = ec.grouped(CommonAttributes.ITEM_ID); assertThat(groups.keySet(), containsInAnyOrder(200L, 201L)); assertThat(groups, hasEntry(equalTo(201L), contains(r2))); assertThat(groups, hasEntry(equalTo(200L), containsInAnyOrder(r1, r3))); }
@Test public void testComputeItemMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(101, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(103, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(ItemAverageRatingBiasModelProvider.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)); }
@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)); }
@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 testGetRating() { EntityCollectionDAO dao = EntityCollectionDAO.create(factory.rating(42, 39, 2.5)); RatingVectorPDAO source = new StandardRatingVectorPDAO(dao); assertThat(source.userRatingVector(42), hasEntry(39L, 2.5)); }
@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(101, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(103, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(ItemAverageRatingBiasModelProvider.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)); } }
@Test public void testComputeAllMeans() { EntityFactory efac = new EntityFactory(); List<Rating> ratings = Lists.newArrayList(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); ratings.add(efac.rating(105, 200, 4.5)); ratings.add(efac.rating(105, 203, 4.8));
@Before public void setUp() throws Exception { List<Rating> rs = new ArrayList<>(); double[][] ratings = { {0, 12, 13, 14, 15}, {21, 22, 23, 24, 25}, {31, 32, 33, 34, 35}, {41, 42, 43, 44, 45}, {51, 52, 53, 54, 55}, {61, 62, 63, 64, 65}}; EntityFactory ef = new EntityFactory(); data = new Long2ObjectOpenHashMap<>(); for (int user = 1; user <= ratings.length; user++) { double[] userRatings = ratings[user-1]; for (int item = 1; item <= userRatings.length; item++) { double rating = userRatings[item-1]; rs.add(ef.rating(user, item, rating)); Long2DoubleMap itemRatings = data.get(item); if (itemRatings == null) itemRatings = new Long2DoubleOpenHashMap(); itemRatings.put(user, rating); data.put(item, itemRatings); } } StaticDataSource source = StaticDataSource.fromList(rs); DataAccessObject dao = source.get(); snapshot = new PackedRatingMatrixProvider(new StandardRatingVectorPDAO(dao), new Random()).get(); }
@Test public void testSummaryItem() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoB = new EntityCollectionDAOBuilder(); // add ratings at 3.9 and 3.1, to make 3.5 average for (int i = 0; i < 100; i++) { daoB.addEntities(efac.rating(i, 37L, 3.9 + (i - 49.5) * 0.01)); daoB.addEntities(efac.rating(i, 82L, 3.1 + (i - 49.5) * 0.01)); } RatingSummary sum = RatingSummary.create(daoB.build()); assertThat(sum.getGlobalMean(), equalTo(3.5)); assertThat(sum.getItemMean(42), notANumber()); assertThat(sum.getItemOffset(42), equalTo(0.0)); assertThat(sum.getItemRatingCount(42), equalTo(0)); assertThat(sum.getItemMean(37), equalTo(3.9)); assertThat(sum.getItemOffset(37), closeTo(0.4, 1.0e-6)); assertThat(sum.getItemRatingCount(37), equalTo(100)); assertThat(sum.getItemMean(82), equalTo(3.1)); assertThat(sum.getItemOffset(82), closeTo(-0.4, 1.0e-6)); assertThat(sum.getItemRatingCount(82), equalTo(100)); } }
@Test public void testRatingEntityBadAttr() { EntityFactory fac = new EntityFactory(); Rating r = fac.rating(42, 37, 3.5, 10); try { r.get(TypedName.create("rating", long.class)); fail("get with bad attribute should throw"); } catch (Throwable th) { assertThat(th, instanceOf(IllegalArgumentException.class)); } try { r.getLong(TypedName.create("rating", long.class)); fail("get with bad attribute type should throw"); } catch (Throwable th) { assertThat(th, instanceOf(IllegalArgumentException.class)); } try { r.get("foobat"); fail("get with missing attribute should throw"); } catch (Throwable th) { assertThat(th, instanceOf(NoSuchAttributeException.class)); } } }
@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)); } }