6 namespace mltk::metrics::dist{
10 template<
typename T =
double>
13 std::string m_family, m_name;
17 std::string& family() {
return m_family; }
18 std::string& name() {
return m_name; }
28 template<
typename T =
double>
32 this->m_family =
"Lp Minkowski distances";
33 this->m_name =
"Euclidean";
38 for(
int i = 0; i < p.
size(); i++)
40 return std::sqrt(sum);
44 template<
typename T =
double>
48 this->m_family =
"Lp Minkowski distances";
49 this->m_name =
"Manhattan";
52 return mltk::abs(p1 - p2).sum();
56 template<
typename T =
double>
60 this->m_family =
"Lp Minkowski distances";
61 this->m_name =
"Chebyshev";
70 template<
typename T =
double>
74 this->m_family =
"L1 Distance measures";
75 this->m_name =
"Lorentzian";
78 return mltk::log(1 - mltk::abs(p1 - p2)).sum();
82 template<
typename T =
double>
86 return (mltk::abs(p1 - p2) / (mltk::abs(p1) + mltk::abs(p2))).sum();
90 template<
typename T =
double>
94 return mltk::abs(p1 - p2).sum() / (p1 + p2).sum();
98 template<
typename T =
double>
102 return mltk::abs(p1 - p2).sum() / p1.
size();
106 template<
typename T =
double>
110 return (1 / 2) * mltk::abs(p1 - p2).sum();
116 template<
typename T =
double>
120 this->m_family =
"Inner product metrics measures";
121 this->m_name =
"Jaccard";
124 return mltk::pow(p1 - p2, 2).sum() /
125 (mltk::pow(p1, 2).sum() + mltk::pow(p2, 2).sum() - (p1 * p2).sum());
129 template<
typename T =
double>
133 this->m_family =
"Inner product metrics measures";
134 this->m_name =
"Cosine";
137 return 1 - (p1 * p2).sum() / (std::sqrt(mltk::pow(p1, 2).sum()) * std::sqrt(mltk::pow(p2, 2).sum()));
141 template<
typename T =
double>
145 this->m_family =
"Inner product metrics measures";
146 this->m_name =
"Dice";
149 return 1 - 2 * (p1 * p2).sum() / (mltk::pow(p1, 2).sum() + mltk::pow(p2, 2).sum());
153 template<
typename T =
double>
157 this->m_family =
"Inner product metrics measures";
158 this->m_name =
"Chord";
161 return std::sqrt(2 - 2 * ((p1 * p2).sum() / (mltk::pow(p1, 2).sum() * mltk::pow(p2, 2).sum())));
167 template<
typename T =
double>
171 this->m_family =
"Squared Chord distance measures";
172 this->m_name =
"Bhattacharyya";
175 return -std::sqrt(mltk::pow(p1 * p2, 0.5).sum());
179 template<
typename T =
double>
183 this->m_family =
"Squared Chord distance measures";
184 this->m_name =
"SquaredChord";
187 return mltk::pow(mltk::pow(p1, 0.5) - mltk::pow(p2, 0.5), 2).sum();
191 template<
typename T =
double>
195 this->m_family =
"Squared Chord distance measures";
196 this->m_name =
"Matusita";
199 return std::sqrt(mltk::pow(mltk::pow(p1, 0.5) - mltk::pow(p2, 0.5), 2).sum());
203 template<
typename T =
double>
207 this->m_family =
"Squared Chord distance measures";
208 this->m_name =
"Hellinger";
211 return std::sqrt(2 * mltk::pow(mltk::pow(p1, 0.5) - mltk::pow(p2, 0.5), 2).sum());
217 template<
typename T =
double>
221 this->m_family =
"Squared L2 distance measures";
222 this->m_name =
"SquaredEuclidean";
225 return mltk::pow(p1 - p2, 2).sum();
229 template<
typename T =
double>
233 this->m_family =
"Squared L2 distance measures";
234 this->m_name =
"Clark";
237 return mltk::pow((p1 - p2)/(mltk::abs(p1) + mltk::abs(p2)), 2).sum();
241 template<
typename T =
double>
245 this->m_family =
"Squared L2 distance measures";
246 this->m_name =
"Neyman";
249 return (mltk::pow(p1 - p2, 2)/p1).sum();
253 template<
typename T =
double>
257 this->m_family =
"Squared L2 distance measures";
258 this->m_name =
"Pearson";
261 return (mltk::pow(p1 - p2, 2)/p2).sum();
265 template<
typename T =
double>
269 this->m_family =
"Squared L2 distance measures";
270 this->m_name =
"Pearson";
273 return (mltk::pow(p1 - p2, 2)/(p1 + p2)).sum();
277 template<
typename T =
double>
281 this->m_family =
"Squared L2 distance measures";
282 this->m_name =
"ProbabilisticSymmetric";
285 return 2 * (mltk::pow(p1 - p2, 2)/(p1 + p2)).sum();
289 template<
typename T =
double>
293 this->m_family =
"Squared L2 distance measures";
294 this->m_name =
"Divergence";
297 return 2 * (mltk::pow(p1 - p2, 2)/mltk::pow(p1 + p2, 2)).sum();
301 template<
typename T =
double>
305 this->m_family =
"Squared L2 distance measures";
306 this->m_name =
"AdditiveSymmetric";
309 return 2 * ((mltk::pow(p1 - p2, 2) * (p1 + p2))/(p1 * p2)).sum();
313 template<
typename T =
double>
317 this->m_family =
"Squared L2 distance measures";
318 this->m_name =
"Average";
321 return std::sqrt((1/p1.
size())*(mltk::pow(p1 - p2, 2)).sum());
333 template<
typename T =
double>
337 this->m_family =
"Squared L2 distance measures";
338 this->m_name =
"SquaredChiSquared";
341 return (mltk::pow(p1 - p2, 2)/mltk::abs(p1 + p2)).sum();
347 template<
typename T =
double>
351 this->m_family =
"Shannon entropy distance measures";
352 this->m_name =
"KullbackLeibler";
355 return (p1 * mltk::log(p1/p2)).sum();
359 template<
typename T =
double>
363 this->m_family =
"Shannon entropy distance measures";
364 this->m_name =
"Jeffreys";
367 return ((p1 - p2) * mltk::log(p1/p2)).sum();
371 template<
typename T =
double>
375 this->m_family =
"Shannon entropy distance measures";
376 this->m_name =
"KDivergence";
379 return (p1 * mltk::log((2 * p1)/(p1 + p2))).sum();
383 template<
typename T =
double>
387 this->m_family =
"Shannon entropy distance measures";
388 this->m_name =
"Topsoe";
391 return (p1 * mltk::log((2 * p1)/(p1 + p2))).sum() + (p2 * mltk::log((2 * p2)/(p1 + p2))).sum();
395 template<
typename T =
double>
399 this->m_family =
"Shannon entropy distance measures";
400 this->m_name =
"JensenShannon";
403 return (1/2) * (p1 * mltk::log((2 * p1)/(p1 + p2))).sum() + (p2 * mltk::log((2 * p2)/(p1 + p2))).sum();
407 template<
typename T =
double>
411 this->m_family =
"Shannon entropy distance measures";
412 this->m_name =
"JensenDifference";
415 return (1/2) * ((p1 * mltk::log(p1) + p2 * mltk::log(p2))/2 - ((p1 + p2)/2) * mltk::log((p1 + p2)/2)).sum();
429 template<
typename T =
double>
433 return std::max((mltk::pow(p1 - p2, 2)/p1).sum(), (mltk::pow(p1 - p2, 2)/p2).sum());
437 template<
typename T =
double>
441 return std::max((mltk::pow(p1 - p2, 2)/p1).sum(), (mltk::pow(p1 - p2, 2)/p2).sum());
447 template<
typename T =
double>
451 this->m_family =
"Other distance measures";
452 this->m_name =
"AverageL1Linf";
455 return (mltk::abs(p1-p2).sum() +
mltk::max(mltk::abs(p1-p2)))/2;
459 template<
typename T =
double>
463 this->m_family =
"Other distance measures";
464 this->m_name =
"KumarJohnson";
467 return (mltk::pow(mltk::pow(p1, 2) + mltk::pow(p2, 2), 2)/(2 * mltk::pow(p1 * p2, 3/2))).sum();
471 template<
typename T =
double>
475 this->m_family =
"Other distance measures";
476 this->m_name =
"Taneja";
479 return (((p1 + p2)/2) * mltk::log((p1 + p2)/(2*mltk::pow(p1 * p2, 0.5)))).sum();
483 template<
typename T =
double>
487 this->m_family =
"Other distance measures";
488 this->m_name =
"Hassanat";
492 for(
size_t i = 0; i < p1.
size(); i++){
495 sum += 1 - (1+_min)/(1+
std::max(p1[i], p2[i]));
498 sum += 1 - (1+_min + std::abs(_min))/(1+_max + std::abs(_max));
std::size_t size() const
Returns the dimension of the point.
Definition: Point.hpp:133
Definition: DistanceMetric.hpp:302
Definition: DistanceMetric.hpp:448
Definition: DistanceMetric.hpp:314
Definition: DistanceMetric.hpp:99
Definition: DistanceMetric.hpp:168
Definition: DistanceMetric.hpp:83
Definition: DistanceMetric.hpp:57
Definition: DistanceMetric.hpp:154
Definition: DistanceMetric.hpp:230
Definition: DistanceMetric.hpp:130
Definition: DistanceMetric.hpp:142
Base functor class for the implementation of new metrics metrics.
Definition: DistanceMetric.hpp:11
Definition: DistanceMetric.hpp:290
Functor for the computation of the euclidean metrics between two points.
Definition: DistanceMetric.hpp:29
Definition: DistanceMetric.hpp:484
Definition: DistanceMetric.hpp:204
Definition: DistanceMetric.hpp:117
Definition: DistanceMetric.hpp:360
Definition: DistanceMetric.hpp:408
Definition: DistanceMetric.hpp:396
Definition: DistanceMetric.hpp:372
Definition: DistanceMetric.hpp:348
Definition: DistanceMetric.hpp:460
Definition: DistanceMetric.hpp:71
Definition: DistanceMetric.hpp:45
Definition: DistanceMetric.hpp:192
Definition: DistanceMetric.hpp:430
Definition: DistanceMetric.hpp:438
Definition: DistanceMetric.hpp:242
Definition: DistanceMetric.hpp:107
Definition: DistanceMetric.hpp:254
Definition: DistanceMetric.hpp:278
Definition: DistanceMetric.hpp:91
Definition: DistanceMetric.hpp:334
Definition: DistanceMetric.hpp:180
Definition: DistanceMetric.hpp:218
Definition: DistanceMetric.hpp:266
Definition: DistanceMetric.hpp:472
Definition: DistanceMetric.hpp:384
T min(const Point< T, R > &p)
Returns the min value of the point.
Definition: Point.hpp:557
T max(const Point< T, R > &p)
Returns the max value of the point.
Definition: Point.hpp:544