Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
   1  <?php
   2  
   3  declare(strict_types=1);
   4  
   5  namespace Phpml\Clustering;
   6  
   7  use Phpml\Clustering\KMeans\Space;
   8  use Phpml\Exception\InvalidArgumentException;
   9  
  10  class KMeans implements Clusterer
  11  {
  12      public const INIT_RANDOM = 1;
  13  
  14      public const INIT_KMEANS_PLUS_PLUS = 2;
  15  
  16      /**
  17       * @var int
  18       */
  19      private $clustersNumber;
  20  
  21      /**
  22       * @var int
  23       */
  24      private $initialization;
  25  
  26      public function __construct(int $clustersNumber, int $initialization = self::INIT_KMEANS_PLUS_PLUS)
  27      {
  28          if ($clustersNumber <= 0) {
  29              throw new InvalidArgumentException('Invalid clusters number');
  30          }
  31  
  32          $this->clustersNumber = $clustersNumber;
  33          $this->initialization = $initialization;
  34      }
  35  
  36      public function cluster(array $samples): array
  37      {
  38          $space = new Space(count(reset($samples)));
  39          foreach ($samples as $key => $sample) {
  40              $space->addPoint($sample, $key);
  41          }
  42  
  43          $clusters = [];
  44          foreach ($space->cluster($this->clustersNumber, $this->initialization) as $cluster) {
  45              $clusters[] = $cluster->getPoints();
  46          }
  47  
  48          return $clusters;
  49      }
  50  }