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; }
/// 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); }