comparison src/DistanceMetric.cpp @ 156:d6df9fe7b12f refactors

Implement distance metric selection (euclidean or cosine)
author Chris Cannam
date Thu, 29 Jan 2015 10:25:47 +0000
parents b79151bb75af
children d6c1556fadd0
comparison
equal deleted inserted replaced
151:246de093f0f1 156:d6df9fe7b12f
37 DistanceMetric::calcDistance(const vector<double> &f1, 37 DistanceMetric::calcDistance(const vector<double> &f1,
38 const vector<double> &f2) 38 const vector<double> &f2)
39 { 39 {
40 double d = 0; 40 double d = 0;
41 double sum = 0; 41 double sum = 0;
42 double eps = 1e-16;
42 43
43 int featureSize = f1.size(); 44 int featureSize = f1.size();
44 assert(int(f2.size()) == featureSize); 45 assert(int(f2.size()) == featureSize);
45 46
47 if (m_params.metric == Cosine) {
48
49 double num = 0, denom1 = 0, denom2 = 0;
50
51 for (int i = 0; i < featureSize; ++i) {
52 num += f1[i] * f2[i];
53 denom1 += f1[i] * f1[i];
54 denom2 += f2[i] * f2[i];
55 }
56
57 d = 1.0 - (num / (eps + sqrt(denom1 * denom2)));
58
59 if (m_params.noise == AddNoise) {
60 d += 1e-2;
61 }
62 if (d > 1.0) d = 1.0;
63
64 return d; // normalisation param ignored
65 }
66
67 // Euclidean
68
46 for (int i = 0; i < featureSize; i++) { 69 for (int i = 0; i < featureSize; i++) {
47 d += fabs(f1[i] - f2[i]); 70 d += fabs(f1[i] - f2[i]);
48 sum += fabs(f1[i]) + fabs(f2[i]); 71 sum += fabs(f1[i]) + fabs(f2[i]);
49 } 72 }
50 73