source: stable/HeuristicLab.Problems.DataAnalysis/3.4/OnlineCalculators/ConfusionMatrixCalculator.cs

Last change on this file was 17181, checked in by swagner, 21 months ago

#2875: Merged r17180 from trunk to stable

File size: 2.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25
26namespace HeuristicLab.Problems.DataAnalysis {
27  public class ConfusionMatrixCalculator {
28    public static double[,] Calculate(IEnumerable<double> originalValues, IEnumerable<double> estimatedValues, out OnlineCalculatorError errorState) {
29      if (!originalValues.Any() || !estimatedValues.Any()) {
30        errorState = OnlineCalculatorError.InsufficientElementsAdded;
31        return null;
32      }
33
34      Dictionary<double, int> classValueIndexMapping = new Dictionary<double, int>();
35      int index = 0;
36      foreach (double classValue in originalValues.OrderBy(x => x)) {
37        if (!classValueIndexMapping.ContainsKey(classValue)) {
38          classValueIndexMapping.Add(classValue, index);
39          index++;
40        }
41      }
42
43      int classes = classValueIndexMapping.Count;
44      double[,] confusionMatrix = new double[classes, classes];
45
46
47      IEnumerator<double> originalEnumerator = originalValues.GetEnumerator();
48      IEnumerator<double> estimatedEnumerator = estimatedValues.GetEnumerator();
49      int originalIndex;
50      int estimatedIndex;
51      while (originalEnumerator.MoveNext() & estimatedEnumerator.MoveNext()) {
52        if (!classValueIndexMapping.TryGetValue(originalEnumerator.Current, out originalIndex)) {
53          errorState = OnlineCalculatorError.InvalidValueAdded;
54          return null;
55        }
56        if (!classValueIndexMapping.TryGetValue(estimatedEnumerator.Current, out estimatedIndex)) {
57          errorState = OnlineCalculatorError.InvalidValueAdded;
58          return null;
59        }
60
61        confusionMatrix[estimatedIndex, originalIndex] += 1;
62      }
63
64      if (originalEnumerator.MoveNext() || estimatedEnumerator.MoveNext()) {
65        throw new ArgumentException("Number of elements in originalValues and estimatedValues enumerations doesn't match.");
66
67      }
68
69      errorState = OnlineCalculatorError.None;
70      return confusionMatrix;
71    }
72  }
73}
Note: See TracBrowser for help on using the repository browser.