/** * Constructor. * * @param caching are profile distances cached? * @param recommenderData preference data * @param dist item distance model */ public PDItemNovelty(boolean caching, PreferenceData<U, I> recommenderData, ItemDistanceModel<I> dist) { super(caching, recommenderData.getUsersWithPreferences()); this.recommenderData = recommenderData; this.dist = dist; }
@Override public Stream<IdPref<I>> getUserPreferences(U u) { return Stream.concat(d1.getUserPreferences(u), d2.getUserPreferences(u)); }
@Override public Stream<I> getAllItems() { return Stream.concat(d1.getAllItems(), d2.getAllItems()).distinct(); }
/** * Constructor * * @param caching are the user relevance models being cached? * @param testData test preference data * @param threshold relevance threshold */ public ERRRelevanceModel(boolean caching, PreferenceData<U, I> testData, double threshold) { super(caching, testData.getUsersWithPreferences()); this.testData = testData; this.threshold = threshold; this.maxPreference = testData.getUsersWithPreferences() .mapToDouble(u -> testData.getUserPreferences(u) .mapToDouble(IdPref::v2) .max().orElse(Double.NEGATIVE_INFINITY)) .max().orElse(Double.NEGATIVE_INFINITY); }
userIndex = SimpleFastUserIndex.load(UsersReader.read(userPath, Parsers.lp)); }else{ userIndex = SimpleFastUserIndex.load(dataTotal.getAllUsers()); itemIndex = SimpleFastItemIndex.load(ItemsReader.read(itemPath, Parsers.lp)); }else{ itemIndex = SimpleFastItemIndex.load(dataTotal.getAllItems());
@Override public int numPreferences() { return d1.numPreferences() + d2.numPreferences(); }
@Override public Stream<U> getAllUsers() { return Stream.concat(d1.getAllUsers(), d2.getAllUsers()).distinct(); }
@Override public boolean containsItem(I i) { return d1.containsItem(i) || d2.containsItem(i); }
@Override public boolean containsUser(U u) { return d1.containsUser(u) || d2.containsUser(u); }
private Object2DoubleMap<F> getGlobalFeatureProbs() { Object2DoubleMap<F> probs = new Object2DoubleOpenHashMap<>(); probs.defaultReturnValue(0.0); int n = recommenderData.numPreferences(); featureData.getAllFeatures().sequential().forEach(f -> { int numPrefs = featureData.getFeatureItems(f) .map(Tuple2::v1) .mapToInt(recommenderData::numUsers) .sum(); probs.put(f, numPrefs / (double) n); }); return probs; }
/** * Constructors. * * @param caching are the user relevance models being cached? * @param testData test subset of preferences * @param threshold relevance threshold */ public NDCGRelevanceModel(boolean caching, PreferenceData<U, I> testData, double threshold) { super(caching, testData.getUsersWithPreferences()); this.testData = testData; this.threshold = threshold; }
/** * Item filter that discards items in the training preference data. * * @param <U> type of the users * @param <I> type of the items * @param trainData preference data * @return item filters for each using returning true if the user-item pair was not observed in the preference data */ public static <U, I> Function<U, Predicate<I>> notInTrain(PreferenceData<U, I> trainData) { return user -> { Set<I> set = trainData.getUserPreferences(user) .map(Tuple2od::v1) .collect(Collectors.toSet()); return i -> !set.contains(i); }; }
/** * Constructor * * @param caching are the user relevance models being cached? * @param testData test subset of the preferences * @param threshold relevance threshold */ public BinaryRelevanceModel(boolean caching, PreferenceData<U, I> testData, double threshold) { super(caching, testData.getUsersWithPreferences()); this.testData = testData; this.threshold = threshold; }
/** * Constructor. * * @param caching are the user relevance models being cached? * @param testData test subset of preferences * @param threshold relevance threshold * @param background gain of unseen items in the test subset */ public BackgroundBinaryRelevanceModel(boolean caching, PreferenceData<U, I> testData, double threshold, double background) { super(caching, testData.getUsersWithPreferences()); this.testData = testData; this.threshold = threshold; this.background = background; }
@Override public Stream<U> getUsersWithPreferences() { return Stream.concat(d1.getUsersWithPreferences(), d2.getUsersWithPreferences()).distinct(); }