Completed
Push — develop ( cce689...6c7416 )
by Arkadiusz
03:24
created

ConfusionMatrix::generateMatrixWithZeros()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 1
1
<?php
2
3
declare (strict_types = 1);
4
5
namespace Phpml\Metric;
6
7
class ConfusionMatrix
8
{
9
    /**
10
     * @param array $actualLabels
11
     * @param array $predictedLabels
12
     * @param array $labels
13
     *
14
     * @return array
15
     */
16
    public static function compute(array $actualLabels, array $predictedLabels, array $labels = null): array
17
    {
18
        $labels = $labels ? array_flip($labels) : self::getUniqueLabels($actualLabels);
19
        $matrix = self::generateMatrixWithZeros($labels);
20
21
        foreach ($actualLabels as $index => $actual) {
22
            $predicted = $predictedLabels[$index];
23
24
            if (!isset($labels[$actual]) || !isset($labels[$predicted])) {
25
                continue;
26
            }
27
28
            if ($predicted === $actual) {
29
                $row = $column = $labels[$actual];
30
            } else {
31
                $row = $labels[$actual];
32
                $column = $labels[$predicted];
33
            }
34
35
            $matrix[$row][$column] += 1;
36
        }
37
38
        return $matrix;
39
    }
40
41
    /**
42
     * @param array $labels
43
     *
44
     * @return array
45
     */
46
    private static function generateMatrixWithZeros(array $labels): array
47
    {
48
        $count = count($labels);
49
        $matrix = [];
50
51
        for ($i = 0; $i < $count; ++$i) {
52
            $matrix[$i] = array_fill(0, $count, 0);
53
        }
54
55
        return $matrix;
56
    }
57
58
    /**
59
     * @param array $labels
60
     *
61
     * @return array
62
     */
63
    private static function getUniqueLabels(array $labels): array
64
    {
65
        $labels = array_values(array_unique($labels));
66
        sort($labels);
67
        $labels = array_flip($labels);
68
69
        return $labels;
70
    }
71
}
72