metric = $metric ?? function (Point $a, Point $b) { $aCoordinates = $a->coordinates; $bCoordinates = $b->coordinates; return MetricsND::euclidean($aCoordinates, $bCoordinates); }; $this->linkage = $linkage ?? function (array $a, array $b, array $distances) { return self::averageDistanceLinkage($a, $b, $distances); }; } /** * Maximum/Complete-Linkage clustering */ public static function maximumDistanceLinkage(array $setA, array $setB, array $distances) : float { $max = \PHP_INT_MIN; foreach ($setA as $a) { foreach ($setB as $b) { if ($distances[$a][$b] > $max) { $max = $distances[$a][$b]; } } } return $max; } /** * Minimum/Single-Linkage clustering */ public static function minimumDistanceLinkage(array $setA, array $setB, array $distances) : float { $min = \PHP_INT_MAX; foreach ($setA as $a) { foreach ($setB as $b) { if ($distances[$a][$b] < $min) { $min = $distances[$a][$b]; } } } return $min; } /** * Unweighted average linkage clustering (UPGMA) */ public static function averageDistanceLinkage(array $setA, array $setB, array $distances) : float { $distance = 0; foreach ($setA as $a) { $distance += \array_sum($distances[$a]); } return $distance / \count($setA) / \count($setB); } /** * {@inheritdoc} */ public function getCentroids() : array { return []; } /** * {@inheritdoc} */ public function getClusters() : array { return []; } /** * {@inheritdoc} */ public function cluster(Point $point) : ?Point { return null; } /** * {@inheritdoc} */ public function getNoise() : array { return []; } }