aboutsummaryrefslogtreecommitdiff
path: root/measures.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'measures.cpp')
-rw-r--r--measures.cpp40
1 files changed, 35 insertions, 5 deletions
diff --git a/measures.cpp b/measures.cpp
index daf3c78..2a3908f 100644
--- a/measures.cpp
+++ b/measures.cpp
@@ -4,15 +4,19 @@
#include <cmath>
#include <algorithm>
+#include "utils.h"
+
+static const float EPSILON = 1e-6f;
+
arma::vec mp::neighborhoodPreservation(const arma::mat &distA,
const arma::mat &distB,
arma::uword k)
{
- arma::uword n = distA.n_rows;
+ int n = uintToInt<arma::uword, int>(distA.n_rows);
arma::vec np(n);
#pragma omp parallel for shared(np, n)
- for (arma::uword i = 0; i < n; i++) {
+ for (int i = 0; i < n; i++) {
arma::uvec nnA(k);
arma::uvec nnB(k);
arma::vec dist(k);
@@ -39,6 +43,32 @@ arma::vec mp::silhouette(const arma::mat &distA,
return arma::vec(distA.n_rows, arma::fill::zeros);
}
+void mp::aggregatedError(const arma::mat &distX,
+ const arma::mat &distY,
+ arma::vec &v)
+{
+ int n = uintToInt<arma::uword, int>(v.n_elem);
+ double maxX = distX.max();
+ double maxY = distY.max();
+
+ #pragma omp parallel for shared(maxX, maxY, distX, distY, v, n)
+ for (int i = 0; i < n; i++) {
+ v[i] = 0;
+ for (int j = 0; j < n; j++) {
+ if (i == j) {
+ continue;
+ }
+
+ double diff = fabs(distY(i, j) / maxY - distX(i, j) / maxX);
+ if (diff < EPSILON) {
+ continue;
+ }
+
+ v[i] += diff;
+ }
+ }
+}
+
/*
double mp::stress(const arma::mat &Dp, const arma::mat &Dq)
{
@@ -66,16 +96,16 @@ arma::vec mp::klDivergence(const arma::mat &P, const arma::mat &Q)
return diver;
}
-void mp::klDivergence(const arma::mat &P, const arma::mat &Q, arma::vec &diver)
+void mp::klDivergence(const arma::mat &P, const arma::mat &Q, arma::vec &diverg)
{
assert(P.n_rows == P.n_cols);
assert(Q.n_rows == Q.n_cols);
assert(P.n_rows == Q.n_cols);
- assert(diver.n_elem == P.n_rows);
+ assert(diverg.n_elem == P.n_rows);
arma::uword n = P.n_rows;
for (arma::uword i = 0; i < n; i++)
- diver(i) = klDivergence(P.row(i), Q.row(i));
+ diverg(i) = klDivergence(P.row(i), Q.row(i));
}
double mp::klDivergence(const arma::rowvec &pi, const arma::rowvec &qi)