示例#1
0
        private static IPreferenceArray cloneAndMergeInto(IPreferenceArray delegatePrefs,
                                                          long itemID,
                                                          long newUserID,
                                                          float value)
        {
            int length    = delegatePrefs == null ? 0 : delegatePrefs.Length();
            int newLength = length + 1;
            IPreferenceArray newPreferenceArray = new GenericItemPreferenceArray(newLength);

            // Set item ID once
            newPreferenceArray.SetItemID(0, itemID);

            int positionToInsert = 0;

            while (positionToInsert < length && newUserID > delegatePrefs.GetUserID(positionToInsert))
            {
                positionToInsert++;
            }

            for (int i = 0; i < positionToInsert; i++)
            {
                newPreferenceArray.SetUserID(i, delegatePrefs.GetUserID(i));
                newPreferenceArray.SetValue(i, delegatePrefs.GetValue(i));
            }
            newPreferenceArray.SetUserID(positionToInsert, newUserID);
            newPreferenceArray.SetValue(positionToInsert, value);
            for (int i = positionToInsert + 1; i < newLength; i++)
            {
                newPreferenceArray.SetUserID(i, delegatePrefs.GetUserID(i - 1));
                newPreferenceArray.SetValue(i, delegatePrefs.GetValue(i - 1));
            }

            return(newPreferenceArray);
        }
        public override int GetNumUsersWithPreferenceFor(long itemID1, long itemID2)
        {
            IPreferenceArray prefs1 = preferenceForItems.Get(itemID1);

            if (prefs1 == null)
            {
                return(0);
            }
            IPreferenceArray prefs2 = preferenceForItems.Get(itemID2);

            if (prefs2 == null)
            {
                return(0);
            }

            int  size1   = prefs1.Length();
            int  size2   = prefs2.Length();
            int  count   = 0;
            int  i       = 0;
            int  j       = 0;
            long userID1 = prefs1.GetUserID(0);
            long userID2 = prefs2.GetUserID(0);

            while (true)
            {
                if (userID1 < userID2)
                {
                    if (++i == size1)
                    {
                        break;
                    }
                    userID1 = prefs1.GetUserID(i);
                }
                else if (userID1 > userID2)
                {
                    if (++j == size2)
                    {
                        break;
                    }
                    userID2 = prefs2.GetUserID(j);
                }
                else
                {
                    count++;
                    if (++i == size1 || ++j == size2)
                    {
                        break;
                    }
                    userID1 = prefs1.GetUserID(i);
                    userID2 = prefs2.GetUserID(j);
                }
            }
            return(count);
        }
示例#3
0
        public virtual IPreferenceArray GetPreferencesForItem(long itemID)
        {
            if (tempPrefs == null)
            {
                return(_delegate.GetPreferencesForItem(itemID));
            }
            IPreferenceArray delegatePrefs = null;

            try {
                delegatePrefs = _delegate.GetPreferencesForItem(itemID);
            } catch (NoSuchItemException nsie) {
                // OK. Probably an item that only the anonymous user has
                //if (log.isDebugEnabled()) {
                log.Debug("Item {} unknown", itemID);
                //}
            }
            for (int i = 0; i < tempPrefs.Length(); i++)
            {
                if (tempPrefs.GetItemID(i) == itemID)
                {
                    return(cloneAndMergeInto(delegatePrefs, itemID, tempPrefs.GetUserID(i), tempPrefs.GetValue(i)));
                }
            }
            if (delegatePrefs == null)
            {
                // No, didn't find it among the anonymous user prefs
                throw new NoSuchItemException(itemID);
            }
            return(delegatePrefs);
        }
        protected override FastIDSet doGetCandidateItems(long[] preferredItemIDs, IDataModel dataModel)
        {
            FastIDSet possibleItemsIDs = new FastIDSet();

            foreach (long itemID in preferredItemIDs)
            {
                IPreferenceArray itemPreferences = dataModel.GetPreferencesForItem(itemID);
                int numUsersPreferringItem       = itemPreferences.Length();
                for (int index = 0; index < numUsersPreferringItem; index++)
                {
                    possibleItemsIDs.AddAll(dataModel.GetItemIDsFromUser(itemPreferences.GetUserID(index)));
                }
            }
            possibleItemsIDs.RemoveAll(preferredItemIDs);
            return(possibleItemsIDs);
        }
示例#5
0
        protected override FastIDSet doGetCandidateItems(long[] preferredItemIDs, IDataModel dataModel)
        {
            var preferredItemIDsIterator = ((IEnumerable <long>)preferredItemIDs).GetEnumerator();

            if (preferredItemIDs.Length > maxItems)
            {
                double samplingRate = (double)maxItems / preferredItemIDs.Length;
                log.Info("preferredItemIDs.Length {0}, samplingRate {1}", preferredItemIDs.Length, samplingRate);
                preferredItemIDsIterator =
                    new SamplinglongPrimitiveIterator(preferredItemIDsIterator, samplingRate);
            }
            FastIDSet possibleItemsIDs = new FastIDSet();

            while (preferredItemIDsIterator.MoveNext())
            {
                long             itemID = preferredItemIDsIterator.Current;
                IPreferenceArray prefs  = dataModel.GetPreferencesForItem(itemID);
                int prefsLength         = prefs.Length();
                if (prefsLength > maxUsersPerItem)
                {
                    var sampledPrefs =
                        new FixedSizeSamplingIterator <IPreference>(maxUsersPerItem, prefs.GetEnumerator());
                    while (sampledPrefs.MoveNext())
                    {
                        addSomeOf(possibleItemsIDs, dataModel.GetItemIDsFromUser(sampledPrefs.Current.GetUserID()));
                    }
                }
                else
                {
                    for (int i = 0; i < prefsLength; i++)
                    {
                        addSomeOf(possibleItemsIDs, dataModel.GetItemIDsFromUser(prefs.GetUserID(i)));
                    }
                }
            }
            possibleItemsIDs.RemoveAll(preferredItemIDs);
            return(possibleItemsIDs);
        }
        public override double ItemSimilarity(long itemID1, long itemID2)
        {
            IDataModel       dataModel = getDataModel();
            IPreferenceArray xPrefs    = dataModel.GetPreferencesForItem(itemID1);
            IPreferenceArray yPrefs    = dataModel.GetPreferencesForItem(itemID2);
            int xLength = xPrefs.Length();
            int yLength = yPrefs.Length();

            if (xLength == 0 || yLength == 0)
            {
                return(Double.NaN);
            }

            long xIndex     = xPrefs.GetUserID(0);
            long yIndex     = yPrefs.GetUserID(0);
            int  xPrefIndex = 0;
            int  yPrefIndex = 0;

            double sumX       = 0.0;
            double sumX2      = 0.0;
            double sumY       = 0.0;
            double sumY2      = 0.0;
            double sumXY      = 0.0;
            double sumXYdiff2 = 0.0;
            int    count      = 0;

            // No, pref inferrers and transforms don't apply here. I think.

            while (true)
            {
                int compare = xIndex <yIndex ? -1 : xIndex> yIndex ? 1 : 0;
                if (compare == 0)
                {
                    // Both users expressed a preference for the item
                    double x = xPrefs.GetValue(xPrefIndex);
                    double y = yPrefs.GetValue(yPrefIndex);
                    sumXY += x * y;
                    sumX  += x;
                    sumX2 += x * x;
                    sumY  += y;
                    sumY2 += y * y;
                    double diff = x - y;
                    sumXYdiff2 += diff * diff;
                    count++;
                }
                if (compare <= 0)
                {
                    if (++xPrefIndex == xLength)
                    {
                        break;
                    }
                    xIndex = xPrefs.GetUserID(xPrefIndex);
                }
                if (compare >= 0)
                {
                    if (++yPrefIndex == yLength)
                    {
                        break;
                    }
                    yIndex = yPrefs.GetUserID(yPrefIndex);
                }
            }

            double result;

            if (centerData)
            {
                // See comments above on these computations
                double n     = (double)count;
                double meanX = sumX / n;
                double meanY = sumY / n;
                // double centeredSumXY = sumXY - meanY * sumX - meanX * sumY + n * meanX * meanY;
                double centeredSumXY = sumXY - meanY * sumX;
                // double centeredSumX2 = sumX2 - 2.0 * meanX * sumX + n * meanX * meanX;
                double centeredSumX2 = sumX2 - meanX * sumX;
                // double centeredSumY2 = sumY2 - 2.0 * meanY * sumY + n * meanY * meanY;
                double centeredSumY2 = sumY2 - meanY * sumY;
                result = computeResult(count, centeredSumXY, centeredSumX2, centeredSumY2, sumXYdiff2);
            }
            else
            {
                result = computeResult(count, sumXY, sumX2, sumY2, sumXYdiff2);
            }

            if (!Double.IsNaN(result))
            {
                result = normalizeWeightResult(result, count, cachedNumUsers);
            }
            return(result);
        }
  private static IPreferenceArray cloneAndMergeInto(IPreferenceArray delegatePrefs,
                                                   long itemID,
                                                   long newUserID,
                                                   float value) {

    int length = delegatePrefs == null ? 0 : delegatePrefs.Length();
    int newLength = length + 1;
    IPreferenceArray newPreferenceArray = new GenericItemPreferenceArray(newLength);

    // Set item ID once
    newPreferenceArray.SetItemID(0, itemID);

    int positionToInsert = 0;
    while (positionToInsert < length && newUserID > delegatePrefs.GetUserID(positionToInsert)) {
      positionToInsert++;
    }

    for (int i = 0; i < positionToInsert; i++) {
      newPreferenceArray.SetUserID(i, delegatePrefs.GetUserID(i));
      newPreferenceArray.SetValue(i, delegatePrefs.GetValue(i));
    }
    newPreferenceArray.SetUserID(positionToInsert, newUserID);
    newPreferenceArray.SetValue(positionToInsert, value);
    for (int i = positionToInsert + 1; i < newLength; i++) {
      newPreferenceArray.SetUserID(i, delegatePrefs.GetUserID(i - 1));
      newPreferenceArray.SetValue(i, delegatePrefs.GetValue(i - 1));
    }

    return newPreferenceArray;
  }