@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 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 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 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)); }
@Override public UserItemBiasModel get() { double intercept = itemBiases.getIntercept(); Long2DoubleMap itemOff = itemBiases.getItemBiases(); Long2DoubleMap map = new Long2DoubleOpenHashMap(); try (ObjectStream<IdBox<Long2DoubleMap>> stream = dao.streamUsers()) { for (IdBox<Long2DoubleMap> user : stream) { Long2DoubleMap uvec = user.getValue(); double usum = 0; for (Long2DoubleMap.Entry e: uvec.long2DoubleEntrySet()) { double off = itemOff.get(e.getLongKey()); usum += e.getDoubleValue() - intercept - off; } map.put(user.getId(), usum / (uvec.size() + damping)); } } return new UserItemBiasModel(intercept, map, itemOff); } }
@Before public void createNormalizer() { Long2DoubleMap users = new Long2DoubleOpenHashMap(); users.put(42L, 0.5); users.put(37L, -0.2); Long2DoubleMap items = new Long2DoubleOpenHashMap(); items.put(1L, 0.2); items.put(2L, -0.1); BiasModel model = new UserItemBiasModel(3.0, users, items); normalizer = new BiasUserVectorNormalizer(model); }
@Before public void createNormalizer() { Long2DoubleMap items = new Long2DoubleOpenHashMap(); items.put(42L, 0.5); items.put(37L, -0.2); Long2DoubleMap users = new Long2DoubleOpenHashMap(); users.put(1L, 0.2); users.put(2L, -0.1); BiasModel model = new UserItemBiasModel(3.0, users, items); normalizer = new BiasItemVectorNormalizer(model); }
@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)); } } } } }
@Test public void testManyUsers() { Generator<Double> globals = doubles(); for (Map<Long,Double> map: someMaps(positiveLongs(), doubles())) { double bias = globals.next(); Long2DoubleMap userBiases = Long2DoubleSortedArrayMap.create(map); BiasModel model = new UserItemBiasModel(bias, userBiases, Long2DoubleMaps.EMPTY_MAP); assertThat(model.getIntercept(), equalTo(bias)); assertThat(model.getUserBiases(userBiases.keySet()), equalTo(userBiases)); for (Set<Long> users : someSets(positiveLongs())) { Long2DoubleMap biases = model.getUserBiases(LongUtils.packedSet(users)); for (long user: users) { if (userBiases.containsKey(user)) { assertThat(biases.get(user), equalTo(userBiases.get(user))); } else { assertThat(biases.get(user), equalTo(0.0)); } } } } }
@Override public UserItemBiasModel get() { double intercept = itemBiases.getIntercept(); Long2DoubleMap itemOff = itemBiases.getItemBiases(); Long2DoubleMap map = new Long2DoubleOpenHashMap(); try (ObjectStream<IdBox<Long2DoubleMap>> stream = dao.streamUsers()) { for (IdBox<Long2DoubleMap> user : stream) { Long2DoubleMap uvec = user.getValue(); double usum = 0; for (Long2DoubleMap.Entry e: uvec.long2DoubleEntrySet()) { double off = itemOff.get(e.getLongKey()); usum += e.getDoubleValue() - intercept - off; } map.put(user.getId(), usum / (uvec.size() + damping)); } } return new UserItemBiasModel(intercept, map, itemOff); } }