update distance cache

This commit is contained in:
Manish
2018-06-21 23:13:43 +05:30
parent d05cfd31cc
commit 620ee5987f
2 changed files with 66 additions and 44 deletions
@@ -238,6 +238,8 @@ void Constraints::Impostors(arma::Mat<size_t>& outputNeighbors,
arma::Mat<size_t> neighbors;
arma::mat distances;
outputDistance = arma::mat(k, dataset.n_cols, arma::fill::zeros);
// Vectors to store indices.
arma::uvec subIndexSame;
+64 -44
View File
@@ -76,8 +76,8 @@ double LMNNFunction<MetricType>::Evaluate(const arma::mat& coordinates)
// Apply metric over dataset.
transformedDataset = coordinates * dataset;
arma::mat distance = arma::mat(k, dataset.n_cols, arma::fill::zeros);
if (iteration++ % range == 0)
arma::mat distance;
if (iteration % range == 0)
{
// Re-calculate impostors on transformed dataset.
Constraints constraint(transformedDataset, labels, k);
@@ -100,17 +100,22 @@ double LMNNFunction<MetricType>::Evaluate(const arma::mat& coordinates)
// breaking point.
for (size_t l = 0, bp = k; l < bp ; l++)
{
// Check if we already have distance between impostor & data point
// stored.
double distImp = distance(l, i) > 0 ? distance(l, i) :
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
// Calculate cost due to {data point, target neighbors, impostors}
// triplets.
double eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
distImp;
double eval = 0;
if (iteration++ % range == 0)
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
std::pow(distance(l, i), 2);
}
else
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
}
// Check bounding condition.
if (eval < -1)
@@ -139,8 +144,8 @@ double LMNNFunction<MetricType>::Evaluate(const arma::mat& coordinates,
// Apply metric over dataset.
transformedDataset = coordinates * dataset;
arma::mat distance = arma::mat(k, dataset.n_cols, arma::fill::zeros);
if (iteration++ % range == 0)
arma::mat distance;
if (iteration % range == 0)
{
// Re-calculate impostors on transformed dataset.
Constraints constraint(transformedDataset, labels, k);
@@ -162,17 +167,22 @@ double LMNNFunction<MetricType>::Evaluate(const arma::mat& coordinates,
// Bound constraints to avoid uneccesary computation.
for (size_t l = 0, bp = k; l < bp ; l++)
{
// Check if we already have distance between impostor & data point
// stored.
double distImp = distance(l, i) > 0 ? distance(l, i) :
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
// Calculate cost due to {data point, target neighbors, impostors}
// triplets.
double eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
distImp;
double eval = 0;
if (iteration++ % range == 0)
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
std::pow(distance(l, i), 2);
}
else
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
}
// Check bounding condition.
if (eval < -1)
@@ -307,8 +317,8 @@ double LMNNFunction<MetricType>::EvaluateWithGradient(
// Apply metric over dataset.
transformedDataset = coordinates * dataset;
arma::mat distance = arma::mat(k, dataset.n_cols, arma::fill::zeros);
if (iteration++ % range == 0)
arma::mat distance;
if (iteration % range == 0)
{
// Re-calculate impostors on transformed dataset.
Constraints constraint(transformedDataset, labels, k);
@@ -339,17 +349,22 @@ double LMNNFunction<MetricType>::EvaluateWithGradient(
// Bound constraints to avoid uneccesary computation.
for (size_t l = 0, bp = k; l < bp ; l++)
{
// Check if we already have distance between impostor & data point
// stored.
double distImp = distance(l, i) > 0 ? distance(l, i) :
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
// Calculate cost due to {data point, target neighbors, impostors}
// triplets.
double eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
distImp;
double eval = 0;
if (iteration++ % range == 0)
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
std::pow(distance(l, i), 2);
}
else
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
}
// Check bounding condition.
if (eval < -1)
@@ -391,8 +406,8 @@ double LMNNFunction<MetricType>::EvaluateWithGradient(
// Apply metric over dataset.
transformedDataset = coordinates * dataset;
arma::mat distance = arma::mat(k, dataset.n_cols, arma::fill::zeros);
if (iteration++ % range == 0)
arma::mat distance;
if (iteration % range == 0)
{
// Re-calculate impostors on transformed dataset.
Constraints constraint(transformedDataset, labels, k);
@@ -423,17 +438,22 @@ double LMNNFunction<MetricType>::EvaluateWithGradient(
// Bound constraints to avoid uneccesary computation.
for (size_t l = 0, bp = k; l < bp ; l++)
{
// Check if we already have distance between impostor & data point
// stored.
double distImp = distance(l, i) > 0 ? distance(l, i) :
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
// Calculate cost due to {data point, target neighbors, impostors}
// triplets.
double eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
distImp;
double eval = 0;
if (iteration++ % range == 0)
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
std::pow(distance(l, i), 2);
}
else
{
eval = metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(targetNeighbors(j, i))) -
metric.Evaluate(transformedDataset.col(i),
transformedDataset.col(impostors(l, i)));
}
// Check bounding condition.
if (eval < -1)