Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
}