mirror of
https://github.com/Llewellynvdm/php-ml.git
synced 2024-09-22 04:09:01 +00:00
af2d732194
* KMeans associative clustering added * fix travis error * KMeans will return provided keys as point label if they are provided * fix travis * fix travis
51 lines
1.1 KiB
PHP
51 lines
1.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Phpml\Clustering;
|
|
|
|
use Phpml\Clustering\KMeans\Space;
|
|
use Phpml\Exception\InvalidArgumentException;
|
|
|
|
class KMeans implements Clusterer
|
|
{
|
|
public const INIT_RANDOM = 1;
|
|
|
|
public const INIT_KMEANS_PLUS_PLUS = 2;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $clustersNumber;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $initialization;
|
|
|
|
public function __construct(int $clustersNumber, int $initialization = self::INIT_KMEANS_PLUS_PLUS)
|
|
{
|
|
if ($clustersNumber <= 0) {
|
|
throw new InvalidArgumentException('Invalid clusters number');
|
|
}
|
|
|
|
$this->clustersNumber = $clustersNumber;
|
|
$this->initialization = $initialization;
|
|
}
|
|
|
|
public function cluster(array $samples): array
|
|
{
|
|
$space = new Space(count(reset($samples)));
|
|
foreach ($samples as $key => $sample) {
|
|
$space->addPoint($sample, $key);
|
|
}
|
|
|
|
$clusters = [];
|
|
foreach ($space->cluster($this->clustersNumber, $this->initialization) as $cluster) {
|
|
$clusters[] = $cluster->getPoints();
|
|
}
|
|
|
|
return $clusters;
|
|
}
|
|
}
|