k = $k; } /** * {@inheritDoc} */ public function range() : Tuple { return new Tuple(0.0, 1.0); } /** * Return the validation score of a set of probabilities with their ground-truth labels. * * @param list> $probabilities * @param list $labels * @return float */ public function score(array $probabilities, array $labels) : float { ProbabilityAndLabelCountsAreEqual::with($probabilities, $labels)->check(); $n = count($probabilities); if ($n === 0) { return 0.0; } $score = 0.0; foreach ($probabilities as $i => $dist) { $label = $labels[$i]; arsort($dist); $topClasses = array_keys(array_slice($dist, 0, $this->k, true)); foreach ($topClasses as $class) { if ($class == $label) { ++$score; break; } } } return $score / $n; } /** * {@inheritDoc} */ public function __toString() : string { return "Top K Accuracy (k: {$this->k})"; } }