Commit e3b09a68d6e1d90b040d5417c1f0de2de4543c43

Authored by Josh Klontz
1 parent 83dd836b

exposed DKE equations

sdk/core/common.h
... ... @@ -200,6 +200,33 @@ QList<T> CumSum(const QList<T> &vals)
200 200  
201 201  
202 202 /****
  203 +KernelDensityBandwidth
  204 + Calculate DKE bandwidth parameter 'h'
  205 +****/
  206 +template <typename T>
  207 +double KernelDensityBandwidth(const QList<T> &vals)
  208 +{
  209 + double mean, stddev;
  210 + MeanStdDev(vals, &mean, &stddev);
  211 + return pow(4 * pow(stddev, 5.0) / (3 * vals.size()), 0.2);
  212 +}
  213 +
  214 +
  215 +/****
  216 +KernelDensityEstimation
  217 + Compute kernel density at value x with bandwidth h.
  218 +****/
  219 +template <typename T>
  220 +double KernelDensityEstimation(const QList<T> &vals, double x, double h)
  221 +{
  222 + double y = 0;
  223 + foreach (T val, vals)
  224 + y += exp(-pow((val-x)/h,2)/2)/sqrt(2*3.1415926353898);
  225 + return y / (vals.size() * h);
  226 +}
  227 +
  228 +
  229 +/****
203 230 RandSample
204 231 Returns a vector of n integers sampled in the range <min, max].
205 232 If unique then there will be no repeated integers.
... ...
sdk/core/plot.cpp
... ... @@ -109,21 +109,6 @@ static float getTAR(const QList&lt;OperatingPoint&gt; &amp;operatingPoints, float FAR)
109 109 return m * FAR + b;
110 110 }
111 111  
112   -static float kernelDensityBandwidth(const QList<double> &vals)
113   -{
114   - double mean, stddev;
115   - Common::MeanStdDev(vals, &mean, &stddev);
116   - return pow(4 * pow(stddev, 5.0) / (3 * vals.size()), 0.2);
117   -}
118   -
119   -static float kernelDensityEstimation(const QList<double> &vals, double x, double h)
120   -{
121   - double y = 0;
122   - foreach (double val, vals)
123   - y += exp(-pow((val-x)/h,2)/2)/sqrt(2*CV_PI);
124   - return y / (vals.size() * h);
125   -}
126   -
127 112 float Evaluate(const QString &simmat, const QString &mask, const QString &csv)
128 113 {
129 114 qDebug("Evaluating %s with %s", qPrintable(simmat), qPrintable(mask));
... ... @@ -237,13 +222,13 @@ float Evaluate(const QString &amp;simmat, const QString &amp;mask, const QString &amp;csv)
237 222 sampledImpostorScores.append(impostorScore);
238 223 }
239 224  
240   - const double hGenuine = kernelDensityBandwidth(sampledGenuineScores);
  225 + const double hGenuine = Common::KernelDensityBandwidth(sampledGenuineScores);
241 226 foreach (double f, sampledGenuineScores)
242   - lines.append(QString("KDEGenuine,%1,%2").arg(QString::number(f), QString::number(kernelDensityEstimation(sampledGenuineScores, f, hGenuine))));
  227 + lines.append(QString("KDEGenuine,%1,%2").arg(QString::number(f), QString::number(Common::KernelDensityEstimation(sampledGenuineScores, f, hGenuine))));
243 228  
244   - const double hImpostor = kernelDensityBandwidth(sampledImpostorScores);
  229 + const double hImpostor = Common::KernelDensityBandwidth(sampledImpostorScores);
245 230 foreach (double f, sampledImpostorScores)
246   - lines.append(QString("KDEImpostor,%1,%2").arg(QString::number(f), QString::number(kernelDensityEstimation(sampledImpostorScores, f, hImpostor))));
  231 + lines.append(QString("KDEImpostor,%1,%2").arg(QString::number(f), QString::number(Common::KernelDensityEstimation(sampledImpostorScores, f, hImpostor))));
247 232  
248 233 // Write Cumulative Match Characteristic (CMC) curve
249 234 const int Max_Retrieval = 25;
... ...