Issues (14)

src/Clustering/KMeans/Point.php (1 issue)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Phpml\Clustering\KMeans;
6
7
use ArrayAccess;
8
9
class Point implements ArrayAccess, \Countable
10
{
11
    /**
12
     * @var int
13
     */
14
    protected $dimension;
15
16
    /**
17
     * @var array
18
     */
19
    protected $coordinates = [];
20
21
    /**
22
     * @var mixed
23
     */
24
    protected $label;
25
26
    /**
27
     * @param mixed $label
28
     */
29
    public function __construct(array $coordinates, $label = null)
30
    {
31
        $this->dimension = count($coordinates);
32
        $this->coordinates = $coordinates;
33
        $this->label = $label;
34
    }
35
36
    public function toArray(): array
37
    {
38
        return $this->coordinates;
39
    }
40
41
    /**
42
     * @return float|int
43
     */
44
    public function getDistanceWith(self $point, bool $precise = true)
45
    {
46
        $distance = 0;
47
        for ($n = 0; $n < $this->dimension; ++$n) {
48
            $difference = $this->coordinates[$n] - $point->coordinates[$n];
49
            $distance += $difference * $difference;
50
        }
51
52
        return $precise ? $distance ** .5 : $distance;
53
    }
54
55
    /**
56
     * @param Point[] $points
57
     */
58
    public function getClosest(array $points): ?self
59
    {
60
        $minPoint = null;
61
62
        foreach ($points as $point) {
63
            $distance = $this->getDistanceWith($point, false);
64
65
            if (!isset($minDistance)) {
66
                $minDistance = $distance;
67
                $minPoint = $point;
68
69
                continue;
70
            }
71
72
            if ($distance < $minDistance) {
0 ignored issues
show
Comprehensibility Best Practice introduced by Arkadiusz Kondas
The variable $minDistance seems to be defined later in this foreach loop on line 66. Are you sure it is defined here?
Loading history...
73
                $minDistance = $distance;
74
                $minPoint = $point;
75
            }
76
        }
77
78
        return $minPoint;
79
    }
80
81
    public function getCoordinates(): array
82
    {
83
        return $this->coordinates;
84
    }
85
86
    /**
87
     * @param mixed $offset
88
     */
89
    public function offsetExists($offset): bool
90
    {
91
        return isset($this->coordinates[$offset]);
92
    }
93
94
    /**
95
     * @param mixed $offset
96
     *
97
     * @return mixed
98
     */
99
    public function offsetGet($offset)
100
    {
101
        return $this->coordinates[$offset];
102
    }
103
104
    /**
105
     * @param mixed $offset
106
     * @param mixed $value
107
     */
108
    public function offsetSet($offset, $value): void
109
    {
110
        $this->coordinates[$offset] = $value;
111
    }
112
113
    /**
114
     * @param mixed $offset
115
     */
116
    public function offsetUnset($offset): void
117
    {
118
        unset($this->coordinates[$offset]);
119
    }
120
121
    public function count(): int
122
    {
123
        return count($this->coordinates);
124
    }
125
}
126