コード例 #1
0
        public double getSimilarity(FastIDSet cluster1, FastIDSet cluster2)
        {
            if (cluster1.isEmpty() || cluster2.isEmpty())
            {
                return(Double.NaN);
            }
            double leastSimilarity = Double.PositiveInfinity;
            var    someUsers       = SamplingLongPrimitiveIterator.maybeWrapIterator(cluster1.GetEnumerator(), samplingRate);

            while (someUsers.MoveNext())
            {
                long userID1 = someUsers.Current;
                var  it2     = cluster2.GetEnumerator();
                while (it2.MoveNext())
                {
                    double theSimilarity = similarity.userSimilarity(userID1, it2.Current);
                    if (theSimilarity < leastSimilarity)
                    {
                        leastSimilarity = theSimilarity;
                    }
                }
            }
            // We skipped everything? well, at least try comparing the first Users to get some value
            if (leastSimilarity == Double.PositiveInfinity)
            {
                return(similarity.userSimilarity(cluster1.GetEnumerator().Current, cluster2.GetEnumerator().Current));
            }
            return(leastSimilarity);
        }
        public void testStrategy()
        {
            FastIDSet allItemIDs = new FastIDSet();
            allItemIDs.AddAll(new long[] { 1L, 2L, 3L });

            FastIDSet preferredItemIDs = new FastIDSet(1);
            preferredItemIDs.Add(2L);

            var dataModelMock = new DynamicMock( typeof( IDataModel ));
            dataModelMock.ExpectAndReturn("GetNumItems", 3);
            dataModelMock.ExpectAndReturn("GetItemIDs", allItemIDs.GetEnumerator());

            IPreferenceArray prefArrayOfUser123 = new GenericUserPreferenceArray( new List<IPreference>() {
            new GenericPreference(123L, 2L, 1.0f) } );

            ICandidateItemsStrategy strategy = new AllUnknownItemsCandidateItemsStrategy();

            //EasyMock.replay(dataModel);

            FastIDSet candidateItems = strategy.GetCandidateItems(123L, prefArrayOfUser123, (IDataModel)dataModelMock.MockInstance);
            Assert.AreEqual(2, candidateItems.Count() );
            Assert.True(candidateItems.Contains(1L));
            Assert.True(candidateItems.Contains(3L));

            dataModelMock.Verify();
            //EasyMock.verify(dataModel);
        }
        public void testStrategy()
        {
            FastIDSet allItemIDs = new FastIDSet();

            allItemIDs.AddAll(new long[] { 1L, 2L, 3L });

            FastIDSet preferredItemIDs = new FastIDSet(1);

            preferredItemIDs.Add(2L);

            var dataModelMock = new DynamicMock(typeof(IDataModel));

            dataModelMock.ExpectAndReturn("GetNumItems", 3);
            dataModelMock.ExpectAndReturn("GetItemIDs", allItemIDs.GetEnumerator());

            IPreferenceArray prefArrayOfUser123 = new GenericUserPreferenceArray(new List <IPreference>()
            {
                new GenericPreference(123L, 2L, 1.0f)
            });

            ICandidateItemsStrategy strategy = new AllUnknownItemsCandidateItemsStrategy();

            //EasyMock.replay(dataModel);


            FastIDSet candidateItems = strategy.GetCandidateItems(123L, prefArrayOfUser123, (IDataModel)dataModelMock.MockInstance);

            Assert.AreEqual(2, candidateItems.Count());
            Assert.True(candidateItems.Contains(1L));
            Assert.True(candidateItems.Contains(3L));

            dataModelMock.Verify();
            //EasyMock.verify(dataModel);
        }
コード例 #4
0
        private List <IRecommendedItem> doMostSimilarItems(long[] itemIDs,
                                                           int howMany,
                                                           TopItems.IEstimator <long> estimator)
        {
            FastIDSet possibleItemIDs = mostSimilarItemsCandidateItemsStrategy.GetCandidateItems(itemIDs, GetDataModel());

            return(TopItems.GetTopItems(howMany, possibleItemIDs.GetEnumerator(), null, estimator));
        }
コード例 #5
0
        public override List <RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer)
        {
            log.debug("Recommending items for user ID '{}'", new object[] { userID });
            PreferenceArray preferencesFromUser = this.getDataModel().getPreferencesFromUser(userID);
            FastIDSet       set = this.getAllOtherItems(userID, preferencesFromUser);

            TopItems.Estimator <long> estimator = new Estimator(this);
            List <RecommendedItem>    list      = TopItems.getTopItems(howMany, set.GetEnumerator(), rescorer, estimator);

            log.debug("Recommendations are: {}", new object[] { list });
            return(list);
        }
コード例 #6
0
ファイル: SlopeOneRecommender.cs プロジェクト: wingfay/ntaste
        public override List <RecommendedItem> recommend(long userID, int howMany, taste.recommender.IDRescorer rescorer)
        {
            //Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
            log.debug("Recommending items for user ID '{}'", userID);

            FastIDSet possibleItemIDs = diffStorage.getRecommendableItemIDs(userID);

            TopItems.Estimator <long> estimator = new Estimator(this, userID);

            List <RecommendedItem> topItems = TopItems.getTopItems(howMany, possibleItemIDs.GetEnumerator(), rescorer, estimator);

            log.debug("Recommendations are: {}", topItems);
            return(topItems);
        }
コード例 #7
0
        public override IList <IRecommendedItem> Recommend(long userID, int howMany, IDRescorer rescorer)
        {
            //Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");
            log.Debug("Recommending items for user ID '{}'", userID);

            IPreferenceArray preferencesFromUser = GetDataModel().GetPreferencesFromUser(userID);
            FastIDSet        possibleItemIDs     = GetAllOtherItems(userID, preferencesFromUser);

            List <IRecommendedItem> topItems = TopItems.GetTopItems(howMany, possibleItemIDs.GetEnumerator(), rescorer,
                                                                    new Estimator(this, userID));

            log.Debug("Recommendations are: {}", topItems);

            return(topItems);
        }
コード例 #8
0
        public List <RecommendedItem> recommendedBecause(long userID, long itemID, int howMany)
        {
            DataModel model = this.getDataModel();

            TopItems.Estimator <long> estimator = new RecommendedBecauseEstimator(this, userID, itemID);
            PreferenceArray           array     = model.getPreferencesFromUser(userID);
            int       size = array.length();
            FastIDSet set  = new FastIDSet(size);

            for (int i = 0; i < size; i++)
            {
                set.add(array.getItemID(i));
            }
            set.remove(itemID);
            return(TopItems.getTopItems(howMany, set.GetEnumerator(), null, estimator));
        }
コード例 #9
0
        public override List <RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer)
        {
            log.debug("Recommending items for user ID '{}'", new object[] { userID });
            long[] theNeighborhood = this.neighborhood.getUserNeighborhood(userID);
            if (theNeighborhood.Length == 0)
            {
                return(new List <RecommendedItem>());
            }
            FastIDSet set = this.getAllOtherItems(theNeighborhood, userID);

            TopItems.Estimator <long> estimator = new Estimator(this, userID, theNeighborhood);
            List <RecommendedItem>    list      = TopItems.getTopItems(howMany, set.GetEnumerator(), rescorer, estimator);

            log.debug("Recommendations are: {}", new object[] { list });
            return(list);
        }
コード例 #10
0
 private void addSomeOf(FastIDSet possibleItemIDs, FastIDSet itemIDs)
 {
     if (itemIDs.Count() > maxItemsPerUser)
     {
         var it =
             new SamplinglongPrimitiveIterator(itemIDs.GetEnumerator(), (double)maxItemsPerUser / itemIDs.Count());
         while (it.MoveNext())
         {
             possibleItemIDs.Add(it.Current);
         }
     }
     else
     {
         possibleItemIDs.AddAll(itemIDs);
     }
 }
コード例 #11
0
            public double estimate(long itemID)
            {
                DataModel      dataModel = this.re.getDataModel();
                RunningAverage average   = new FullRunningAverage();
                var            it        = cluster.GetEnumerator();

                while (it.MoveNext())
                {
                    float?pref = dataModel.getPreferenceValue(it.Current, itemID);
                    if (pref != null)
                    {
                        average.addDatum(pref.Value);
                    }
                }
                return(average.getAverage());
            }
コード例 #12
0
        /// <p>
        /// Creates a new {@link GenericDataModel} from the given users (and their preferences). This
        /// {@link DataModel} retains all this information in memory and is effectively immutable.
        /// </p>
        ///
        /// @param userData users to include
        /// @param timestamps optionally, provided timestamps of preferences as milliseconds since the epoch.
        ///  User IDs are mapped to maps of item IDs to long timestamps.
        public GenericBooleanPrefDataModel(FastByIDMap <FastIDSet> userData, FastByIDMap <FastByIDMap <DateTime?> > timestamps)
        {
            //Preconditions.checkArgument(userData != null, "userData is null");

            this.preferenceFromUsers = userData;
            this.preferenceForItems  = new FastByIDMap <FastIDSet>();
            FastIDSet itemIDSet = new FastIDSet();

            foreach (var entry in preferenceFromUsers.EntrySet())
            {
                long      userID   = entry.Key;
                FastIDSet itemIDs1 = entry.Value;
                itemIDSet.AddAll(itemIDs1);
                var it = itemIDs1.GetEnumerator();
                while (it.MoveNext())
                {
                    long      itemID   = it.Current;
                    FastIDSet userIDs1 = preferenceForItems.Get(itemID);
                    if (userIDs1 == null)
                    {
                        userIDs1 = new FastIDSet(2);
                        preferenceForItems.Put(itemID, userIDs1);
                    }
                    userIDs1.Add(userID);
                }
            }

            this.itemIDs = itemIDSet.ToArray();
            itemIDSet    = null; // Might help GC -- this is big
            Array.Sort(itemIDs);

            this.userIDs = new long[userData.Count()];
            int i   = 0;
            var it1 = userData.Keys.GetEnumerator();

            while (it1.MoveNext())
            {
                userIDs[i++] = it1.Current;
            }
            Array.Sort(userIDs);

            this.timestamps = timestamps;
        }
コード例 #13
0
        private List <RecommendedItem> computeTopRecsForCluster(FastIDSet cluster)
        {
            DataModel dataModel       = getDataModel();
            FastIDSet possibleItemIDs = new FastIDSet();
            var       it = cluster.GetEnumerator();

            while (it.MoveNext())
            {
                possibleItemIDs.addAll(dataModel.getItemIDsFromUser(it.Current));
            }

            TopItems.Estimator <long> estimator = new Estimator(cluster, this);

            List <RecommendedItem> topItems = TopItems.getTopItems(NUM_CLUSTER_RECS,
                                                                   possibleItemIDs.GetEnumerator(), null, estimator);

            log.debug("Recommendations are: {}", topItems);
            return(topItems);
        }
コード例 #14
0
        public List <IRecommendedItem> RecommendedBecause(long userID, long itemID, int howMany)
        {
            //Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");

            IDataModel model = GetDataModel();

            TopItems.IEstimator <long> estimator = new RecommendedBecauseEstimator(this, userID, itemID);

            IPreferenceArray prefs = model.GetPreferencesFromUser(userID);
            int       size         = prefs.Length();
            FastIDSet allUserItems = new FastIDSet(size);

            for (int i = 0; i < size; i++)
            {
                allUserItems.Add(prefs.GetItemID(i));
            }
            allUserItems.Remove(itemID);

            return(TopItems.GetTopItems(howMany, allUserItems.GetEnumerator(), null, estimator));
        }
コード例 #15
0
        public override PreferenceArray getPreferencesFromUser(long userID)
        {
            FastIDSet set = this.preferenceFromUsers.get(userID);

            if (set == null)
            {
                throw new NoSuchUserException(userID);
            }
            PreferenceArray    array      = new BooleanUserPreferenceArray(set.size());
            int                i          = 0;
            IEnumerator <long> enumerator = set.GetEnumerator();

            while (enumerator.MoveNext())
            {
                array.setUserID(i, userID);
                array.setItemID(i, enumerator.Current);
                i++;
            }
            return(array);
        }
コード例 #16
0
        /// @throws NoSuchUserException
        ///           if there is no such user
        public override IPreferenceArray GetPreferencesFromUser(long userID)
        {
            FastIDSet itemIDs = preferenceFromUsers.Get(userID);

            if (itemIDs == null)
            {
                throw new NoSuchUserException(userID);
            }
            IPreferenceArray prefArray = new BooleanUserPreferenceArray(itemIDs.Count());
            int i  = 0;
            var it = itemIDs.GetEnumerator();

            while (it.MoveNext())
            {
                prefArray.SetUserID(i, userID);
                prefArray.SetItemID(i, it.Current);
                i++;
            }
            return(prefArray);
        }
コード例 #17
0
        public override IPreferenceArray GetPreferencesForItem(long itemID)
        {
            FastIDSet userIDs = preferenceForItems.Get(itemID);

            if (userIDs == null)
            {
                throw new NoSuchItemException(itemID);
            }
            IPreferenceArray prefArray = new BooleanItemPreferenceArray(userIDs.Count());
            int i  = 0;
            var it = userIDs.GetEnumerator();

            while (it.MoveNext())
            {
                prefArray.SetUserID(i, it.Current);
                prefArray.SetItemID(i, itemID);
                i++;
            }
            return(prefArray);
        }
コード例 #18
0
        public GenericBooleanPrefDataModel(FastByIDMap <FastIDSet> userData, FastByIDMap <FastByIDMap <DateTime?> > timestamps)
        {
            this.preferenceFromUsers = userData;
            this.preferenceForItems  = new FastByIDMap <FastIDSet>();
            FastIDSet set = new FastIDSet();

            foreach (KeyValuePair <long, FastIDSet> pair in this.preferenceFromUsers.entrySet())
            {
                long      key = pair.Key;
                FastIDSet c   = pair.Value;
                set.addAll(c);
                IEnumerator <long> enumerator = c.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    long      current = enumerator.Current;
                    FastIDSet set3    = this.preferenceForItems.get(current);
                    if (set3 == null)
                    {
                        set3 = new FastIDSet(2);
                        this.preferenceForItems.put(current, set3);
                    }
                    set3.add(key);
                }
            }
            this.itemIDs = set.toArray();
            set          = null;
            Array.Sort <long>(this.itemIDs);
            this.userIDs = new long[userData.size()];
            int num3 = 0;
            IEnumerator <long> enumerator2 = userData.Keys.GetEnumerator();

            while (enumerator2.MoveNext())
            {
                this.userIDs[num3++] = enumerator2.Current;
            }
            Array.Sort <long>(this.userIDs);
            this.timestamps = timestamps;
        }
コード例 #19
0
        public override IList <IRecommendedItem> Recommend(long userID, int howMany, IDRescorer rescorer)
        {
            //Preconditions.checkArgument(howMany >= 1, "howMany must be at least 1");

            log.Debug("Recommending items for user ID '{}'", userID);

            long[] theNeighborhood = neighborhood.GetUserNeighborhood(userID);

            if (theNeighborhood.Length == 0)
            {
                return(new List <IRecommendedItem>());
            }

            FastIDSet allItemIDs = getAllOtherItems(theNeighborhood, userID);

            TopItems.IEstimator <long> estimator = new Estimator(this, userID, theNeighborhood);

            List <IRecommendedItem> topItems = TopItems
                                               .GetTopItems(howMany, allItemIDs.GetEnumerator(), rescorer, estimator);

            log.Debug("Recommendations are: {}", topItems);
            return(topItems);
        }
コード例 #20
0
 private void addSomeOf(FastIDSet possibleItemIDs, FastIDSet itemIDs)
 {
     if (itemIDs.size() > this.maxItemsPerUser)
     {
         SamplingLongPrimitiveIterator iterator = new SamplingLongPrimitiveIterator(itemIDs.GetEnumerator(), ((double)this.maxItemsPerUser) / ((double)itemIDs.size()));
         while (iterator.MoveNext())
         {
             possibleItemIDs.add(iterator.Current);
         }
     }
     else
     {
         possibleItemIDs.addAll(itemIDs);
     }
 }
コード例 #21
0
 private void addSomeOf(FastIDSet possibleItemIDs, FastIDSet itemIDs) {
   if (itemIDs.Count() > maxItemsPerUser) {
     var it =
         new SamplinglongPrimitiveIterator(itemIDs.GetEnumerator(), (double) maxItemsPerUser / itemIDs.Count() );
     while (it.MoveNext()) {
       possibleItemIDs.Add(it.Current);
     }
   } else {
     possibleItemIDs.AddAll(itemIDs);
   }
 }
コード例 #22
0
        protected override float doEstimatePreference(long theUserID, PreferenceArray preferencesFromUser, long itemID)
        {
            DataModel dataModel       = getDataModel();
            int       size            = preferencesFromUser.length();
            FastIDSet possibleItemIDs = new FastIDSet(size);

            for (int i = 0; i < size; i++)
            {
                possibleItemIDs.add(preferencesFromUser.getItemID(i));
            }
            possibleItemIDs.remove(itemID);

            List <RecommendedItem> mostSimilar = mostSimilarItems(itemID, possibleItemIDs.GetEnumerator(), neighborhoodSize, null);

            long[] theNeighborhood = new long[mostSimilar.Count() + 1];
            theNeighborhood[0] = -1;

            List <long> usersRatedNeighborhood = new List <long>();
            int         nOffset = 0;

            foreach (RecommendedItem rec in mostSimilar)
            {
                theNeighborhood[nOffset++] = rec.getItemID();
            }

            if (mostSimilar.Count != 0)
            {
                theNeighborhood[mostSimilar.Count] = itemID;
                for (int i = 0; i < theNeighborhood.Length; i++)
                {
                    PreferenceArray usersNeighborhood = dataModel.getPreferencesForItem(theNeighborhood[i]);
                    int             size1             = usersRatedNeighborhood.Count == 0 ? usersNeighborhood.length() : usersRatedNeighborhood.Count;
                    for (int j = 0; j < size1; j++)
                    {
                        if (i == 0)
                        {
                            usersRatedNeighborhood.Add(usersNeighborhood.getUserID(j));
                        }
                        else
                        {
                            if (j >= usersRatedNeighborhood.Count)
                            {
                                break;
                            }
                            long index = usersRatedNeighborhood[j];
                            if (!usersNeighborhood.hasPrefWithUserID(index) || index == theUserID)
                            {
                                usersRatedNeighborhood.Remove(index);
                                j--;
                            }
                        }
                    }
                }
            }

            double[] weights = null;
            if (mostSimilar.Count != 0)
            {
                weights = getInterpolations(itemID, theNeighborhood, usersRatedNeighborhood);
            }

            int    n               = 0;
            double preference      = 0.0;
            double totalSimilarity = 0.0;

            foreach (long jitem in theNeighborhood)
            {
                float?pref = dataModel.getPreferenceValue(theUserID, jitem);

                if (pref != null)
                {
                    double weight = weights[n];
                    preference      += pref.Value * weight;
                    totalSimilarity += weight;
                }
                n++;
            }
            return(totalSimilarity == 0.0 ? float.NaN : (float)(preference / totalSimilarity));
        }
コード例 #23
0
        private List <RecommendedItem> doMostSimilarItems(long[] itemIDs, int howMany, TopItems.Estimator <long> estimator)
        {
            FastIDSet set = this.mostSimilarItemsCandidateItemsStrategy.getCandidateItems(itemIDs, this.getDataModel());

            return(TopItems.getTopItems(howMany, set.GetEnumerator(), null, estimator));
        }