knncolle
Collection of KNN methods in C++
Loading...
Searching...
No Matches
distances.hpp
Go to the documentation of this file.
1#ifndef KNNCOLLE_DISTANCES_HPP
2#define KNNCOLLE_DISTANCES_HPP
3
4#include <cmath>
5#include <cstddef>
6
13namespace knncolle {
14
21template<typename Data_, typename Distance_>
23public:
27 DistanceMetric() = default;
28 DistanceMetric(const DistanceMetric&) = default;
29 DistanceMetric(DistanceMetric&&) = default;
30 DistanceMetric& operator=(const DistanceMetric&) = default;
31 DistanceMetric& operator=(DistanceMetric&&) = default;
32 virtual ~DistanceMetric() = default;
37public:
49 virtual Distance_ raw(std::size_t num_dimensions, const Data_* x, const Data_* y) const = 0;
50
55 virtual Distance_ normalize(Distance_ raw) const = 0;
56
61 virtual Distance_ denormalize(Distance_ norm) const = 0;
62};
63
70template<typename Data_, typename Distance_>
71class EuclideanDistance final : public DistanceMetric<Data_, Distance_> {
72public:
76 Distance_ raw(std::size_t num_dimensions, const Data_* x, const Data_* y) const {
77 Distance_ output = 0;
78 for (std::size_t d = 0; d < num_dimensions; ++d) {
79 auto delta = static_cast<Distance_>(x[d]) - static_cast<Distance_>(y[d]); // casting to ensure consistent precision/signedness regardless of Data_.
80 output += delta * delta;
81 }
82 return output;
83 }
84
85 Distance_ normalize(Distance_ raw) const {
86 return std::sqrt(raw);
87 }
88
89 Distance_ denormalize(Distance_ norm) const {
90 return norm * norm;
91 }
95};
96
97
104template<typename Data_, typename Distance_>
105class ManhattanDistance final : public DistanceMetric<Data_, Distance_> {
106public:
110 Distance_ raw(std::size_t num_dimensions, const Data_* x, const Data_* y) const {
111 Distance_ output = 0;
112 for (std::size_t d = 0; d < num_dimensions; ++d) {
113 auto delta = static_cast<Distance_>(x[d]) - static_cast<Distance_>(y[d]); // casting to ensure consistent precision/signedness regardless of Data_.
114 output += std::abs(delta);
115 }
116 return output;
117 }
118
119 Distance_ normalize(Distance_ raw) const {
120 return raw;
121 }
122
123 Distance_ denormalize(Distance_ norm) const {
124 return norm;
125 }
129};
130
131}
132
133#endif
Interface for a distance metric.
Definition distances.hpp:22
virtual Distance_ normalize(Distance_ raw) const =0
virtual Distance_ denormalize(Distance_ norm) const =0
virtual Distance_ raw(std::size_t num_dimensions, const Data_ *x, const Data_ *y) const =0
Compute Euclidean distances between two input vectors.
Definition distances.hpp:71
Compute Manhattan distances between two input vectors.
Definition distances.hpp:105
Collection of KNN algorithms.
Definition Bruteforce.hpp:24