/// <summary> /// Computes the probability calibration plot for a particular rating value. /// </summary> /// <param name="instanceSource">The instance source providing the ground truth.</param> /// <param name="predictions">A sparse users-by-items matrix of predicted rating distributions.</param> /// <param name="rating">The rating value to generate the calibration plot for.</param> /// <param name="bins">The number of bins to use.</param> /// <returns>The computed probability calibration plot.</returns> public double[] ProbabilityCalibrationPlot( TInstanceSource instanceSource, IDictionary <TUser, IDictionary <TItem, Discrete> > predictions, int rating, int bins) { IStarRatingInfo <TGroundTruthRating> starRatingInfo = this.mapping.GetRatingInfo(instanceSource); var countTotal = new int[bins]; var countGuessed = new int[bins]; foreach (var userWithPredictionList in predictions) { foreach (var itemPrediction in userWithPredictionList.Value) { TUser user = userWithPredictionList.Key; TItem item = itemPrediction.Key; double prob = itemPrediction.Value[rating]; int groundTruth = starRatingInfo.ToStarRating(this.mapping.GetRating(instanceSource, user, item)); int probBin = Math.Min((int)(prob * bins), bins - 1); countTotal[probBin] += 1; countGuessed[probBin] += (groundTruth == rating) ? 1 : 0; } } return(Util.ArrayInit(bins, i => (double)countGuessed[i] / countTotal[i])); }
/// <summary> /// Computes the average of a given rating prediction metric using ground truth in model domain by iterating over /// <paramref name="predictions"/> and using the aggregation method given in <paramref name="aggregationMethod"/>. /// </summary> /// <param name="instanceSource">The instance source providing the ground truth.</param> /// <param name="predictions">A sparse users-by-items matrix of predicted rating distributions.</param> /// <param name="metric">The rating prediction metric using ground truth in model domain.</param> /// <param name="aggregationMethod">A method specifying how metrics are aggregated over all instances.</param> /// <returns>The computed average of the given rating prediction metric.</returns> public double ModelDomainRatingPredictionMetric( TInstanceSource instanceSource, IDictionary <TUser, IDictionary <TItem, int> > predictions, Func <int, int, double> metric, RecommenderMetricAggregationMethod aggregationMethod = RecommenderMetricAggregationMethod.Default) { IStarRatingInfo <TGroundTruthRating> starRatingInfo = this.mapping.GetRatingInfo(instanceSource); Func <TGroundTruthRating, int, double> metricWrapper = (g, p) => metric(starRatingInfo.ToStarRating(g), p); return(this.RatingPredictionMetric(instanceSource, predictions, metricWrapper, aggregationMethod)); }