public void TestExpectedWeightedConfusion()
        {
            double expectedAbsoluteErrorAsWeightedConfusion = this.evaluator.ExpectedWeightedConfusion(
                this.dataset,
                this.uncertainPredictions,
                RatingMatrix.AbsoluteErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating));

            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetricExpectation(this.dataset, this.uncertainPredictions, Metrics.AbsoluteError),
                expectedAbsoluteErrorAsWeightedConfusion,
                CompareEps);

            double expectedSquaredErrorAsWeightedConfusion = this.evaluator.ExpectedWeightedConfusion(
                this.dataset,
                this.uncertainPredictions,
                RatingMatrix.SquaredErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating));

            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetricExpectation(this.dataset, this.uncertainPredictions, Metrics.SquaredError),
                expectedSquaredErrorAsWeightedConfusion,
                CompareEps);

            double expectedZeroOneErrorAsWeightedConfusion = this.evaluator.ExpectedWeightedConfusion(
                this.dataset,
                this.uncertainPredictions,
                RatingMatrix.ZeroOneErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating));

            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetricExpectation(this.dataset, this.uncertainPredictions, Metrics.ZeroOneError),
                expectedZeroOneErrorAsWeightedConfusion,
                CompareEps);
        }
        public void TestWeightedConfusion()
        {
            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetric(this.dataset, this.predictions, Metrics.AbsoluteError),
                this.evaluator.WeightedConfusion(this.dataset, this.predictions, RatingMatrix.AbsoluteErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating)),
                CompareEps);

            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetric(this.dataset, this.predictions, Metrics.SquaredError),
                this.evaluator.WeightedConfusion(this.dataset, this.predictions, RatingMatrix.SquaredErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating)),
                CompareEps);

            Assert.Equal(
                this.evaluator.ModelDomainRatingPredictionMetric(this.dataset, this.predictions, Metrics.ZeroOneError),
                this.evaluator.WeightedConfusion(this.dataset, this.predictions, RatingMatrix.ZeroOneErrorLossMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating)),
                CompareEps);
        }
        public void TestConfusionMatrix()
        {
            var trueConfusion = new RatingMatrix(this.starRatingInfo.MinStarRating, this.starRatingInfo.MaxStarRating);

            trueConfusion[1, 4] = 3.0 / 12.0;
            trueConfusion[2, 2] = 1.0 / 3.0;
            trueConfusion[2, 3] = 1.0 / 6.0;
            trueConfusion[3, 5] = 1.0 / 12.0;
            trueConfusion[4, 1] = 1.0 / 12.0;
            trueConfusion[5, 5] = 1.0 / 12.0;
            RatingMatrix confusion = this.evaluator.ConfusionMatrix(this.dataset, this.predictions, RecommenderMetricAggregationMethod.PerUserFirst);

            Assert.Equal(trueConfusion.MaxRating, confusion.MaxRating);
            for (int i = 1; i <= confusion.MaxRating; ++i)
            {
                for (int j = 1; j <= confusion.MaxRating; ++j)
                {
                    Assert.Equal(trueConfusion[i, j], confusion[i, j], CompareEps);
                }
            }
        }