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
12namespace knncolle {
13
20template<typename Data_, typename Distance_>
22public:
26 DistanceMetric() = default;
27 DistanceMetric(const DistanceMetric&) = default;
28 DistanceMetric(DistanceMetric&&) = default;
29 DistanceMetric& operator=(const DistanceMetric&) = default;
30 DistanceMetric& operator=(DistanceMetric&&) = default;
31 virtual ~DistanceMetric() = default;
36public:
48 virtual Distance_ raw(size_t num_dimensions, const Data_* x, const Data_* y) const = 0;
49
54 virtual Distance_ normalize(Distance_ raw) const = 0;
55
60 virtual Distance_ denormalize(Distance_ norm) const = 0;
61};
62
69template<typename Data_, typename Distance_>
70class EuclideanDistance final : public DistanceMetric<Data_, Distance_> {
71public:
75 Distance_ raw(size_t num_dimensions, const Data_* x, const Data_* y) const {
76 Distance_ output = 0;
77 for (size_t d = 0; d < num_dimensions; ++d) {
78 auto delta = static_cast<Distance_>(x[d]) - static_cast<Distance_>(y[d]); // casting to ensure consistent precision/signedness regardless of Data_.
79 output += delta * delta;
80 }
81 return output;
82 }
83
84 Distance_ normalize(Distance_ raw) const {
85 return std::sqrt(raw);
86 }
87
88 Distance_ denormalize(Distance_ norm) const {
89 return norm * norm;
90 }
94};
95
96
103template<typename Data_, typename Distance_>
104class ManhattanDistance final : public DistanceMetric<Data_, Distance_> {
105public:
109 Distance_ raw(size_t num_dimensions, const Data_* x, const Data_* y) const {
110 Distance_ output = 0;
111 for (size_t d = 0; d < num_dimensions; ++d) {
112 auto delta = static_cast<Distance_>(x[d]) - static_cast<Distance_>(y[d]); // casting to ensure consistent precision/signedness regardless of Data_.
113 output += std::abs(delta);
114 }
115 return output;
116 }
117
118 Distance_ normalize(Distance_ raw) const {
119 return raw;
120 }
121
122 Distance_ denormalize(Distance_ norm) const {
123 return norm;
124 }
128};
129
130}
131
132#endif
Interface for a distance metric.
Definition distances.hpp:21
virtual Distance_ raw(size_t num_dimensions, const Data_ *x, const Data_ *y) const =0
virtual Distance_ normalize(Distance_ raw) const =0
virtual Distance_ denormalize(Distance_ norm) const =0
Compute Euclidean distances between two input vectors.
Definition distances.hpp:70
Compute Manhattan distances between two input vectors.
Definition distances.hpp:104
Collection of KNN algorithms.
Definition Bruteforce.hpp:23