Exemple #1
0
        private static PreferenceArray cloneAndMergeInto(PreferenceArray delegatePrefs, long itemID, long newUserID, float value)
        {
            int             num4;
            int             num   = (delegatePrefs == null) ? 0 : delegatePrefs.length();
            int             size  = num + 1;
            PreferenceArray array = new GenericItemPreferenceArray(size);

            array.setItemID(0, itemID);
            int i = 0;

            while ((i < num) && (newUserID > delegatePrefs.getUserID(i)))
            {
                i++;
            }
            for (num4 = 0; num4 < i; num4++)
            {
                array.setUserID(num4, delegatePrefs.getUserID(num4));
                array.setValue(num4, delegatePrefs.getValue(num4));
            }
            array.setUserID(i, newUserID);
            array.setValue(i, value);
            for (num4 = i + 1; num4 < size; num4++)
            {
                array.setUserID(num4, delegatePrefs.getUserID(num4 - 1));
                array.setValue(num4, delegatePrefs.getValue(num4 - 1));
            }
            return(array);
        }
        private float doEstimatePreference(long userID, long itemID)
        {
            double          count           = 0.0;
            double          totalPreference = 0.0;
            PreferenceArray prefs           = getDataModel().getPreferencesFromUser(userID);

            RunningAverage[] averages = diffStorage.getDiffs(userID, itemID, prefs);
            int size = prefs.length();

            for (int i = 0; i < size; i++)
            {
                RunningAverage averageDiff = averages[i];
                if (averageDiff != null)
                {
                    double averageDiffValue = averageDiff.getAverage();
                    if (weighted)
                    {
                        double weight = averageDiff.getCount();
                        if (stdDevWeighted)
                        {
                            var raaStdDev = averageDiff as RunningAverageAndStdDev;
                            if (raaStdDev != null)
                            {
                                double stdev = raaStdDev.getStandardDeviation();
                                if (!Double.IsNaN(stdev))
                                {
                                    weight /= 1.0 + stdev;
                                }
                            }

                            // If stdev is NaN, then it is because count is 1. Because we're weighting by count,
                            // the weight is already relatively low. We effectively assume stdev is 0.0 here and
                            // that is reasonable enough. Otherwise, dividing by NaN would yield a weight of NaN
                            // and disqualify this pref entirely
                            // (Thanks Daemmon)
                        }
                        totalPreference += weight * (prefs.getValue(i) + averageDiffValue);
                        count           += weight;
                    }
                    else
                    {
                        totalPreference += prefs.getValue(i) + averageDiffValue;
                        count           += 1.0;
                    }
                }
            }
            if (count <= 0.0)
            {
                RunningAverage itemAverage = diffStorage.getAverageItemPref(itemID);
                return(itemAverage == null ? float.NaN : (float)itemAverage.getAverage());
            }
            else
            {
                return((float)(totalPreference / count));
            }
        }
Exemple #3
0
        protected virtual float doEstimatePreference(long userID, PreferenceArray preferencesFromUser, long itemID)
        {
            double num  = 0.0;
            double num2 = 0.0;
            int    num3 = 0;

            double[] numArray = this.similarity.itemSimilarities(itemID, preferencesFromUser.getIDs());
            for (int i = 0; i < numArray.Length; i++)
            {
                double d = numArray[i];
                if (!double.IsNaN(d))
                {
                    num  += d * preferencesFromUser.getValue(i);
                    num2 += d;
                    num3++;
                }
            }
            if (num3 <= 1)
            {
                return(float.NaN);
            }
            float estimate = (float)(num / num2);

            if (this.capper != null)
            {
                estimate = this.capper.capEstimate(estimate);
            }
            return(estimate);
        }
Exemple #4
0
        public void removeItemPref(long userID, long itemIDA, float prefValue)
        {
            PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID);

            try
            {
                buildAverageDiffsLock.EnterWriteLock();

                FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA);

                int length = userPreferences.length();
                for (int i = 0; i < length; i++)
                {
                    long  itemIDB = userPreferences.getItemID(i);
                    float bValue  = userPreferences.getValue(i);

                    if (itemIDA < itemIDB)
                    {
                        if (aMap != null)
                        {
                            RunningAverage average = aMap.get(itemIDB);
                            if (average != null)
                            {
                                if (average.getCount() <= 1)
                                {
                                    aMap.remove(itemIDB);
                                }
                                else
                                {
                                    average.removeDatum(bValue - prefValue);
                                }
                            }
                        }
                    }
                    else if (itemIDA > itemIDB)
                    {
                        FastByIDMap <RunningAverage> bMap = averageDiffs.get(itemIDB);
                        if (bMap != null)
                        {
                            RunningAverage average = bMap.get(itemIDA);
                            if (average != null)
                            {
                                if (average.getCount() <= 1)
                                {
                                    aMap.remove(itemIDA);
                                }
                                else
                                {
                                    average.removeDatum(prefValue - bValue);
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                buildAverageDiffsLock.ExitWriteLock();
            }
        }
        public RandomRecommender(DataModel dataModel)
            : base(dataModel)
        {
            this.random = RandomUtils.getRandom();
            float negativeInfinity        = float.NegativeInfinity;
            float positiveInfinity        = float.PositiveInfinity;
            IEnumerator <long> enumerator = dataModel.getUserIDs();

            while (enumerator.MoveNext())
            {
                long            current = enumerator.Current;
                PreferenceArray array   = dataModel.getPreferencesFromUser(current);
                for (int i = 0; i < array.length(); i++)
                {
                    float num5 = array.getValue(i);
                    if (num5 < positiveInfinity)
                    {
                        positiveInfinity = num5;
                    }
                    if (num5 > negativeInfinity)
                    {
                        negativeInfinity = num5;
                    }
                }
            }
            this.minPref = positiveInfinity;
            this.maxPref = negativeInfinity;
        }
Exemple #6
0
        private long processOneUser(long averageCount, long userID)
        {
            log.debug("Processing prefs for user {}", userID);
            // Save off prefs for the life of this loop iteration
            PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID);
            int             length          = userPreferences.length();

            for (int i = 0; i < length - 1; i++)
            {
                float prefAValue = userPreferences.getValue(i);
                long  itemIDA    = userPreferences.getItemID(i);
                FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA);
                if (aMap == null)
                {
                    aMap = new FastByIDMap <RunningAverage>();
                    averageDiffs.put(itemIDA, aMap);
                }
                for (int j = i + 1; j < length; j++)
                {
                    // This is a performance-critical block
                    long           itemIDB = userPreferences.getItemID(j);
                    RunningAverage average = aMap.get(itemIDB);
                    if (average == null && averageCount < maxEntries)
                    {
                        average = buildRunningAverage();
                        aMap.put(itemIDB, average);
                        averageCount++;
                    }
                    if (average != null)
                    {
                        average.addDatum(userPreferences.getValue(j) - prefAValue);
                    }
                }
                RunningAverage itemAverage = averageItemPref.get(itemIDA);
                if (itemAverage == null)
                {
                    itemAverage = buildRunningAverage();
                    averageItemPref.put(itemIDA, itemAverage);
                }
                itemAverage.addDatum(prefAValue);
            }
            return(averageCount);
        }
Exemple #7
0
        public void addItemPref(long userID, long itemIDA, float prefValue)
        {
            PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID);

            try
            {
                buildAverageDiffsLock.EnterWriteLock();

                FastByIDMap <RunningAverage> aMap = averageDiffs.get(itemIDA);
                if (aMap == null)
                {
                    aMap = new FastByIDMap <RunningAverage>();
                    averageDiffs.put(itemIDA, aMap);
                }
                int length = userPreferences.length();
                for (int i = 0; i < length; i++)
                {
                    long  itemIDB = userPreferences.getItemID(i);
                    float bValue  = userPreferences.getValue(i);
                    if (itemIDA < itemIDB)
                    {
                        RunningAverage average = aMap.get(itemIDB);
                        if (average == null)
                        {
                            average = buildRunningAverage();
                            aMap.put(itemIDB, average);
                        }
                        average.addDatum(bValue - prefValue);
                    }
                    else
                    {
                        FastByIDMap <RunningAverage> bMap = averageDiffs.get(itemIDB);
                        if (bMap == null)
                        {
                            bMap = new FastByIDMap <RunningAverage>();
                            averageDiffs.put(itemIDB, bMap);
                        }
                        RunningAverage average = bMap.get(itemIDA);
                        if (average == null)
                        {
                            average = buildRunningAverage();
                            bMap.put(itemIDA, average);
                        }
                        average.addDatum(prefValue - bValue);
                    }
                }
            }
            finally
            {
                buildAverageDiffsLock.ExitWriteLock();
            }
        }
Exemple #8
0
        private static float?getPreferenceForItem(PreferenceArray preferencesFromUser, long itemID)
        {
            int num = preferencesFromUser.length();

            for (int i = 0; i < num; i++)
            {
                if (preferencesFromUser.getItemID(i) == itemID)
                {
                    return(new float?(preferencesFromUser.getValue(i)));
                }
            }
            return(null);
        }
Exemple #9
0
        public override float?getPreferenceValue(long userID, long itemID)
        {
            PreferenceArray array = this.getPreferencesFromUser(userID);
            int             num   = array.length();

            for (int i = 0; i < num; i++)
            {
                if (array.getItemID(i) == itemID)
                {
                    return(new float?(array.getValue(i)));
                }
            }
            return(null);
        }
        private static double computeThreshold(PreferenceArray prefs)
        {
            if (prefs.length() < 2)
            {
                return(double.NegativeInfinity);
            }
            RunningAverageAndStdDev dev = new FullRunningAverageAndStdDev();
            int num = prefs.length();

            for (int i = 0; i < num; i++)
            {
                dev.addDatum((double)prefs.getValue(i));
            }
            return(dev.getAverage() + dev.getStandardDeviation());
        }
        public FastIDSet getRelevantItemsIDs(long userID, int at, double relevanceThreshold, DataModel dataModel)
        {
            PreferenceArray array = dataModel.getPreferencesFromUser(userID);
            FastIDSet       set   = new FastIDSet(at);

            array.sortByValueReversed();
            for (int i = 0; (i < array.length()) && (set.size() < at); i++)
            {
                if (array.getValue(i) >= relevanceThreshold)
                {
                    set.add(array.getItemID(i));
                }
            }
            return(set);
        }
 public override float?getPreferenceValue(long userID, long itemID)
 {
     if (this.isAnonymousUser(userID))
     {
         PreferenceArray array = this.tempPrefs[userID];
         for (int i = 0; i < array.length(); i++)
         {
             if (array.getItemID(i) == itemID)
             {
                 return(new float?(array.getValue(i)));
             }
         }
         return(null);
     }
     return(base.getDelegate().getPreferenceValue(userID, itemID));
 }
Exemple #13
0
            public float get(long key)
            {
                PreferenceArray array = this.inf.dataModel.getPreferencesFromUser(key);
                int             num   = array.length();

                if (num == 0)
                {
                    return(AveragingPreferenceInferrer.ZERO);
                }
                RunningAverage average = new FullRunningAverage();

                for (int i = 0; i < num; i++)
                {
                    average.addDatum((double)array.getValue(i));
                }
                return((float)average.getAverage());
            }
 private void buildAverageDiffs()
 {
     lock (this)
     {
         DataModel          model      = this.getDataModel();
         IEnumerator <long> enumerator = model.getUserIDs();
         while (enumerator.MoveNext())
         {
             long            current = enumerator.Current;
             PreferenceArray array   = model.getPreferencesFromUser(current);
             int             num2    = array.length();
             for (int i = 0; i < num2; i++)
             {
                 long  itemID = array.getItemID(i);
                 float num5   = array.getValue(i);
                 addDatumAndCreateIfNeeded(itemID, num5, this.itemAverages);
                 addDatumAndCreateIfNeeded(current, num5, this.userAverages);
                 this.overallAveragePrefValue.addDatum((double)num5);
             }
         }
     }
 }
        private void splitOneUsersPrefs(double trainingPercentage, FastByIDMap <PreferenceArray> trainingPrefs, FastByIDMap <PreferenceArray> testPrefs, long userID, DataModel dataModel)
        {
            List <Preference> prefs = null;
            List <Preference> list2 = null;
            PreferenceArray   array = dataModel.getPreferencesFromUser(userID);
            int num = array.length();

            for (int i = 0; i < num; i++)
            {
                Preference item = new GenericPreference(userID, array.getItemID(i), array.getValue(i));
                if (this.random.nextDouble() < trainingPercentage)
                {
                    if (prefs == null)
                    {
                        prefs = new List <Preference>(3);
                    }
                    prefs.Add(item);
                }
                else
                {
                    if (list2 == null)
                    {
                        list2 = new List <Preference>(3);
                    }
                    list2.Add(item);
                }
            }
            if (prefs != null)
            {
                trainingPrefs.put(userID, new GenericUserPreferenceArray(prefs));
                if (list2 != null)
                {
                    testPrefs.put(userID, new GenericUserPreferenceArray(list2));
                }
            }
        }
 private void buildAverageDiffs()
 {
     lock (this)
     {
         DataModel          model      = this.getDataModel();
         IEnumerator <long> enumerator = model.getUserIDs();
         while (enumerator.MoveNext())
         {
             PreferenceArray array = model.getPreferencesFromUser(enumerator.Current);
             int             num   = array.length();
             for (int i = 0; i < num; i++)
             {
                 long           key     = array.getItemID(i);
                 RunningAverage average = this.itemAverages.get(key);
                 if (average == null)
                 {
                     average = new FullRunningAverage();
                     this.itemAverages.put(key, average);
                 }
                 average.addDatum((double)array.getValue(i));
             }
         }
     }
 }
Exemple #17
0
        public override double itemSimilarity(long itemID1, long itemID2)
        {
            double          num18;
            DataModel       model  = base.getDataModel();
            PreferenceArray array  = model.getPreferencesForItem(itemID1);
            PreferenceArray array2 = model.getPreferencesForItem(itemID2);
            int             num    = array.length();
            int             num2   = array2.length();

            if ((num == 0) || (num2 == 0))
            {
                return(double.NaN);
            }
            long   num3  = array.getUserID(0);
            long   num4  = array2.getUserID(0);
            int    i     = 0;
            int    num6  = 0;
            double num7  = 0.0;
            double num8  = 0.0;
            double num9  = 0.0;
            double num10 = 0.0;
            double sumXY = 0.0;
            double num12 = 0.0;
            int    n     = 0;

            while (true)
            {
                int num14 = (num3 < num4) ? -1 : ((num3 > num4) ? 1 : 0);
                if (num14 == 0)
                {
                    double num15 = array.getValue(i);
                    double num16 = array2.getValue(num6);
                    sumXY += num15 * num16;
                    num7  += num15;
                    num8  += num15 * num15;
                    num9  += num16;
                    num10 += num16 * num16;
                    double num17 = num15 - num16;
                    num12 += num17 * num17;
                    n++;
                }
                if (num14 <= 0)
                {
                    if (++i == num)
                    {
                        break;
                    }
                    num3 = array.getUserID(i);
                }
                if (num14 >= 0)
                {
                    if (++num6 == num2)
                    {
                        break;
                    }
                    num4 = array2.getUserID(num6);
                }
            }
            if (this.centerData)
            {
                double num19 = n;
                double num20 = num7 / num19;
                double num21 = num9 / num19;
                double num22 = sumXY - (num21 * num7);
                double num23 = num8 - (num20 * num7);
                double num24 = num10 - (num21 * num9);
                num18 = this.computeResult(n, num22, num23, num24, num12);
            }
            else
            {
                num18 = this.computeResult(n, sumXY, num8, num10, num12);
            }
            if (!double.IsNaN(num18))
            {
                num18 = this.normalizeWeightResult(num18, n, this.cachedNumUsers);
            }
            return(num18);
        }
Exemple #18
0
        public double userSimilarity(long userID1, long userID2)
        {
            double          num18;
            DataModel       model  = base.getDataModel();
            PreferenceArray array  = model.getPreferencesFromUser(userID1);
            PreferenceArray array2 = model.getPreferencesFromUser(userID2);
            int             num    = array.length();
            int             num2   = array2.length();

            if ((num == 0) || (num2 == 0))
            {
                return(double.NaN);
            }
            long   itemID = array.getItemID(0);
            long   num4   = array2.getItemID(0);
            int    i      = 0;
            int    num6   = 0;
            double num7   = 0.0;
            double num8   = 0.0;
            double num9   = 0.0;
            double num10  = 0.0;
            double sumXY  = 0.0;
            double num12  = 0.0;
            int    n      = 0;
            bool   flag   = this.inferrer != null;

            while (true)
            {
                int num14 = (itemID < num4) ? -1 : ((itemID > num4) ? 1 : 0);
                if (flag || (num14 == 0))
                {
                    double num15;
                    double num16;
                    if (itemID == num4)
                    {
                        num15 = array.getValue(i);
                        num16 = array2.getValue(num6);
                    }
                    else if (num14 < 0)
                    {
                        num15 = array.getValue(i);
                        num16 = this.inferrer.inferPreference(userID2, itemID);
                    }
                    else
                    {
                        num15 = this.inferrer.inferPreference(userID1, num4);
                        num16 = array2.getValue(num6);
                    }
                    sumXY += num15 * num16;
                    num7  += num15;
                    num8  += num15 * num15;
                    num9  += num16;
                    num10 += num16 * num16;
                    double num17 = num15 - num16;
                    num12 += num17 * num17;
                    n++;
                }
                if (num14 <= 0)
                {
                    if (++i >= num)
                    {
                        if (!flag || (num4 == 0x7fffffffffffffffL))
                        {
                            break;
                        }
                        itemID = 0x7fffffffffffffffL;
                    }
                    else
                    {
                        itemID = array.getItemID(i);
                    }
                }
                if (num14 >= 0)
                {
                    if (++num6 >= num2)
                    {
                        if (!flag || (itemID == 0x7fffffffffffffffL))
                        {
                            break;
                        }
                        num4 = 0x7fffffffffffffffL;
                    }
                    else
                    {
                        num4 = array2.getItemID(num6);
                    }
                }
            }
            if (this.centerData)
            {
                double num19 = num7 / ((double)n);
                double num20 = num9 / ((double)n);
                double num21 = sumXY - (num20 * num7);
                double num22 = num8 - (num19 * num7);
                double num23 = num10 - (num20 * num9);
                num18 = this.computeResult(n, num21, num22, num23, num12);
            }
            else
            {
                num18 = this.computeResult(n, sumXY, num8, num10, num12);
            }
            if (!double.IsNaN(num18))
            {
                num18 = this.normalizeWeightResult(num18, n, this.cachedNumItems);
            }
            return(num18);
        }
        public double userSimilarity(long userID1, long userID2)
        {
            int             num4;
            PreferenceArray array  = this.dataModel.getPreferencesFromUser(userID1);
            PreferenceArray array2 = this.dataModel.getPreferencesFromUser(userID2);
            int             num    = array.length();
            int             num2   = array2.length();

            if ((num <= 1) || (num2 <= 1))
            {
                return(double.NaN);
            }
            array  = array.clone();
            array2 = array2.clone();
            array.sortByValue();
            array2.sortByValue();
            float num3 = 1f;

            for (num4 = 0; num4 < num; num4++)
            {
                if (array2.hasPrefWithItemID(array.getItemID(num4)))
                {
                    array.setValue(num4, num3);
                    num3++;
                }
            }
            num3 = 1f;
            for (num4 = 0; num4 < num2; num4++)
            {
                if (array.hasPrefWithItemID(array2.getItemID(num4)))
                {
                    array2.setValue(num4, num3);
                    num3++;
                }
            }
            array.sortByItem();
            array2.sortByItem();
            long   num5  = array.getItemID(0);
            long   num6  = array2.getItemID(0);
            int    i     = 0;
            int    num8  = 0;
            double num9  = 0.0;
            int    num10 = 0;

            while (true)
            {
                int num11 = (num5 < num6) ? -1 : ((num5 > num6) ? 1 : 0);
                if (num11 == 0)
                {
                    double num12 = array.getValue(i) - array2.getValue(num8);
                    num9 += num12 * num12;
                    num10++;
                }
                if (num11 <= 0)
                {
                    if (++i >= num)
                    {
                        break;
                    }
                    num5 = array.getItemID(i);
                }
                if (num11 >= 0)
                {
                    if (++num8 >= num2)
                    {
                        break;
                    }
                    num6 = array2.getItemID(num8);
                }
            }
            if (num10 <= 1)
            {
                return(double.NaN);
            }
            return(1.0 - ((6.0 * num9) / ((double)(num10 * ((num10 * num10) - 1)))));
        }