/// @param n neighborhood size; capped at the number of users in the data model /// @param minSimilarity minimal similarity required for neighbors /// @throws IllegalArgumentException /// if {@code n < 1}, or userSimilarity or dataModel are {@code null} public NearestNUserNeighborhood(int n, double minSimilarity, IUserSimilarity userSimilarity, IDataModel dataModel) : this(n, minSimilarity, userSimilarity, dataModel, 1.0) { }
internal DataModelSimilaritiesIterator(IUserSimilarity otherSimilarity, long[] itemIDs) { this.otherSimilarity = otherSimilarity; this.itemIDs = itemIDs; i = 0; itemID1 = itemIDs[0]; j = 1; }
/// @param threshold /// similarity threshold /// @param userSimilarity /// similarity metric /// @param dataModel /// data model /// @param samplingRate /// percentage of users to consider when building neighborhood -- decrease to trade quality for /// performance /// @throws IllegalArgumentException /// if threshold or samplingRate is {@link Double#NaN}, or if samplingRate is not positive and less /// than or equal to 1.0, or if userSimilarity or dataModel are {@code null} public ThresholdUserNeighborhood(double threshold, IUserSimilarity userSimilarity, IDataModel dataModel, double samplingRate) : base(userSimilarity, dataModel, samplingRate) { //Preconditions.checkArgument(!Double.isNaN(threshold), "threshold must not be NaN"); this.threshold = threshold; }
public GenericUserSimilarity(IUserSimilarity otherSimilarity, IDataModel dataModel, int maxToKeep) { long[] userIDs = longIteratorToList(dataModel.GetUserIDs()); IEnumerator <UserUserSimilarity> it = new DataModelSimilaritiesIterator(otherSimilarity, userIDs); var keptSimilarities = TopItems.GetTopUserUserSimilarities(maxToKeep, it); initSimilarityMaps(keptSimilarities.GetEnumerator()); }
/// Creates this on top of the given {@link UserSimilarity}. /// The cache size is capped by the given size. public CachingUserSimilarity(IUserSimilarity similarity, int maxCacheSize) { //Preconditions.checkArgument(similarity != null, "similarity is null"); this.similarity = similarity; this.similarityCache = new Cache <Tuple <long, long>, Double>(new SimilarityRetriever(similarity), maxCacheSize); this.refreshHelper = new RefreshHelper(() => { similarityCache.Clear(); }); refreshHelper.AddDependency(similarity); }
public AbstractUserNeighborhood(IUserSimilarity userSimilarity, IDataModel dataModel, double samplingRate) { //Preconditions.checkArgument(userSimilarity != null, "userSimilarity is null"); //Preconditions.checkArgument(dataModel != null, "dataModel is null"); //Preconditions.checkArgument(samplingRate > 0.0 && samplingRate <= 1.0, "samplingRate must be in (0,1]"); this.userSimilarity = userSimilarity; this.dataModel = dataModel; this.samplingRate = samplingRate; this.refreshHelper = new RefreshHelper(null); this.refreshHelper.AddDependency(this.dataModel); this.refreshHelper.AddDependency(this.userSimilarity); }
public override long[] GetUserNeighborhood(long userID) { IDataModel dataModel = getDataModel(); IUserSimilarity userSimilarityImpl = getUserSimilarity(); TopItems.IEstimator <long> estimator = new Estimator(userSimilarityImpl, userID, minSimilarity); var userIDs = SamplinglongPrimitiveIterator.MaybeWrapIterator(dataModel.GetUserIDs(), getSamplingRate()); return(TopItems.GetTopUsers(n, userIDs, null, estimator)); }
/// @param n neighborhood size; capped at the number of users in the data model /// @param minSimilarity minimal similarity required for neighbors /// @param samplingRate percentage of users to consider when building neighborhood -- decrease to trade quality for /// performance /// @throws IllegalArgumentException /// if {@code n < 1} or samplingRate is NaN or not in (0,1], or userSimilarity or dataModel are /// {@code null} public NearestNUserNeighborhood(int n, double minSimilarity, IUserSimilarity userSimilarity, IDataModel dataModel, double samplingRate) : base(userSimilarity, dataModel, samplingRate) { //Preconditions.checkArgument(n >= 1, "n must be at least 1"); int numUsers = dataModel.GetNumUsers(); this.n = n > numUsers ? numUsers : n; this.minSimilarity = minSimilarity; }
public GenericUserBasedRecommender(IDataModel dataModel, IUserNeighborhood neighborhood, IUserSimilarity similarity) : base(dataModel) { //Preconditions.checkArgument(neighborhood != null, "neighborhood is null"); this.neighborhood = neighborhood; this.similarity = similarity; this.refreshHelper = new RefreshHelper(() => { capper = buildCapper(); }); refreshHelper.AddDependency(dataModel); refreshHelper.AddDependency(similarity); refreshHelper.AddDependency(neighborhood); capper = buildCapper(); }
/// This computation is in a technical sense, wrong, since in the domain of "bool preference users" where /// all preference values are 1, this method should only ever return 1.0 or NaN. This isn't terribly useful /// however since it means results can't be ranked by preference value (all are 1). So instead this returns a /// sum of similarities to any other user in the neighborhood who has also rated the item. protected override float doEstimatePreference(long theUserID, long[] theNeighborhood, long itemID) { if (theNeighborhood.Length == 0) { return(float.NaN); } IDataModel dataModel = GetDataModel(); IUserSimilarity similarity = getSimilarity(); float totalSimilarity = 0.0f; bool foundAPref = false; foreach (long userID in theNeighborhood) { // See GenericItemBasedRecommender.doEstimatePreference() too if (userID != theUserID && dataModel.GetPreferenceValue(userID, itemID) != null) { foundAPref = true; totalSimilarity += (float)similarity.UserSimilarity(theUserID, userID); } } return(foundAPref ? totalSimilarity : float.NaN); }
public override long[] GetUserNeighborhood(long userID) { IDataModel dataModel = getDataModel(); FastIDSet neighborhood = new FastIDSet(); var usersIterable = SamplinglongPrimitiveIterator.MaybeWrapIterator(dataModel .GetUserIDs(), getSamplingRate()); IUserSimilarity userSimilarityImpl = getUserSimilarity(); while (usersIterable.MoveNext()) { long otherUserID = usersIterable.Current; if (userID != otherUserID) { double theSimilarity = userSimilarityImpl.UserSimilarity(userID, otherUserID); if (!Double.IsNaN(theSimilarity) && theSimilarity >= threshold) { neighborhood.Add(otherUserID); } } } return(neighborhood.ToArray()); }
/// @param threshold /// similarity threshold /// @param userSimilarity /// similarity metric /// @param dataModel /// data model /// @throws IllegalArgumentException /// if threshold is {@link Double#NaN}, or if samplingRate is not positive and less than or equal /// to 1.0, or if userSimilarity or dataModel are {@code null} public ThresholdUserNeighborhood(double threshold, IUserSimilarity userSimilarity, IDataModel dataModel) : this(threshold, userSimilarity, dataModel, 1.0) { }
/// @param n neighborhood size; capped at the number of users in the data model /// @throws IllegalArgumentException /// if {@code n < 1}, or userSimilarity or dataModel are {@code null} public NearestNUserNeighborhood(int n, IUserSimilarity userSimilarity, IDataModel dataModel) : this(n, Double.NegativeInfinity, userSimilarity, dataModel, 1.0) { }
internal Estimator(IUserSimilarity userSimilarityImpl, long theUserID, double minSim) { this.userSimilarityImpl = userSimilarityImpl; this.theUserID = theUserID; this.minSim = minSim; }
internal SimilarityRetriever(IUserSimilarity similarity) { this.similarity = similarity; }
public GenericBooleanPrefUserBasedRecommender(IDataModel dataModel, IUserNeighborhood neighborhood, IUserSimilarity similarity) : base(dataModel, neighborhood, similarity) { }
/// Creates this on top of the given {@link UserSimilarity}. /// The cache is sized according to properties of the given {@link DataModel}. public CachingUserSimilarity(IUserSimilarity similarity, IDataModel dataModel) : this(similarity, dataModel.GetNumUsers()) { }
public GenericUserSimilarity(IUserSimilarity otherSimilarity, IDataModel dataModel) { long[] userIDs = longIteratorToList(dataModel.GetUserIDs()); initSimilarityMaps(new DataModelSimilaritiesIterator(otherSimilarity, userIDs)); }
internal MostSimilarEstimator(long toUserID, IUserSimilarity similarity, IRescorer <Tuple <long, long> > rescorer) { this.toUserID = toUserID; this.similarity = similarity; this.rescorer = rescorer; }