php-ml/docs/math/distance.md

110 lines
2.0 KiB
Markdown

# Distance
Selected algorithms require the use of a function for calculating the distance.
### Euclidean
Class for calculating Euclidean distance.
![euclidean](https://upload.wikimedia.org/math/8/4/9/849f040fd10bb86f7c85eb0bbe3566a4.png "Euclidean Distance")
To calculate Euclidean distance:
```
$a = [4, 6];
$b = [2, 5];
$euclidean = new Euclidean();
$euclidean->distance($a, $b);
// return 2.2360679774998
```
### Manhattan
Class for calculating Manhattan distance.
![manhattan](https://upload.wikimedia.org/math/4/c/5/4c568bd1d76a6b15e19cb2ac3ad75350.png "Manhattan Distance")
To calculate Manhattan distance:
```
$a = [4, 6];
$b = [2, 5];
$manhattan = new Manhattan();
$manhattan->distance($a, $b);
// return 3
```
### Chebyshev
Class for calculating Chebyshev distance.
![chebyshev](https://upload.wikimedia.org/math/7/1/2/71200f7dbb43b3bcfbcbdb9e02ab0a0c.png "Chebyshev Distance")
To calculate Chebyshev distance:
```
$a = [4, 6];
$b = [2, 5];
$chebyshev = new Chebyshev();
$chebyshev->distance($a, $b);
// return 2
```
### Minkowski
Class for calculating Minkowski distance.
![minkowski](https://upload.wikimedia.org/math/a/a/0/aa0c62083c12390cb15ac3217de88e66.png "Minkowski Distance")
To calculate Minkowski distance:
```
$a = [4, 6];
$b = [2, 5];
$minkowski = new Minkowski();
$minkowski->distance($a, $b);
// return 2.080
```
You can provide the `lambda` parameter:
```
$a = [6, 10, 3];
$b = [2, 5, 5];
$minkowski = new Minkowski($lambda = 5);
$minkowski->distance($a, $b);
// return 5.300
```
### Custom distance
To apply your own function of distance use the `Distance` interface. Example:
```
class CustomDistance implements Distance
{
/**
* @param array $a
* @param array $b
*
* @return float
*/
public function distance(array $a, array $b) : float
{
$distance = [];
$count = count($a);
for ($i = 0; $i < $count; ++$i) {
$distance[] = $a[$i] * $b[$i];
}
return min($distance);
}
}
```