示例#1
0
        protected virtual float doEstimatePreference(long userID, IPreferenceArray preferencesFromUser, long itemID)
        {
            double preference      = 0.0;
            double totalSimilarity = 0.0;
            int    count           = 0;

            double[] similarities = similarity.ItemSimilarities(itemID, preferencesFromUser.GetIDs());
            for (int i = 0; i < similarities.Length; i++)
            {
                double theSimilarity = similarities[i];
                if (!Double.IsNaN(theSimilarity))
                {
                    // Weights can be negative!
                    preference      += theSimilarity * preferencesFromUser.GetValue(i);
                    totalSimilarity += theSimilarity;
                    count++;
                }
            }
            // Throw out the estimate if it was based on no data points, of course, but also if based on
            // just one. This is a bit of a band-aid on the 'stock' item-based algorithm for the moment.
            // The reason is that in this case the estimate is, simply, the user's rating for one item
            // that happened to have a defined similarity. The similarity score doesn't matter, and that
            // seems like a bad situation.
            if (count <= 1)
            {
                return(float.NaN);
            }
            float estimate = (float)(preference / totalSimilarity);

            if (capper != null)
            {
                estimate = capper.capEstimate(estimate);
            }
            return(estimate);
        }
  /// 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.
 protected override float doEstimatePreference(long userID, IPreferenceArray preferencesFromUser, long itemID)
   {
   double[] similarities = getSimilarity().ItemSimilarities(itemID, preferencesFromUser.GetIDs());
   bool foundAPref = false;
   double totalSimilarity = 0.0;
   foreach (double theSimilarity in similarities) {
     if (!Double.IsNaN(theSimilarity)) {
       foundAPref = true;
       totalSimilarity += theSimilarity;
     }
   }
   return foundAPref ? (float) totalSimilarity : float.NaN;
 }
示例#3
0
        /// 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.
        protected override float doEstimatePreference(long userID, IPreferenceArray preferencesFromUser, long itemID)
        {
            double[] similarities    = getSimilarity().ItemSimilarities(itemID, preferencesFromUser.GetIDs());
            bool     foundAPref      = false;
            double   totalSimilarity = 0.0;

            foreach (double theSimilarity in similarities)
            {
                if (!Double.IsNaN(theSimilarity))
                {
                    foundAPref       = true;
                    totalSimilarity += theSimilarity;
                }
            }
            return(foundAPref ? (float)totalSimilarity : float.NaN);
        }
 public FastIDSet GetCandidateItems(long userID, IPreferenceArray preferencesFromUser, IDataModel dataModel)
 {
     return(doGetCandidateItems(preferencesFromUser.GetIDs(), dataModel));
 }
 public FastIDSet GetCandidateItems(long userID, IPreferenceArray preferencesFromUser, IDataModel dataModel)
   {
   return doGetCandidateItems(preferencesFromUser.GetIDs(), dataModel);
 }