From 3273ccd2874854bb36feed2ab0b2bf0989939cc2 Mon Sep 17 00:00:00 2001 From: Manuel Gunther <siebenkopf@googlemail.com> Date: Mon, 11 Apr 2016 13:41:11 -0600 Subject: [PATCH] Removed some unused files --- bob/learn/em/.DS_Store | Bin 6148 -> 0 bytes bob/learn/em/cpp/BICMachine.cpp | 348 -------------------------------- bob/learn/em/cpp/BICTrainer.cpp | 94 --------- bob/learn/em/include/.DS_Store | Bin 6148 -> 0 bytes 4 files changed, 442 deletions(-) delete mode 100644 bob/learn/em/.DS_Store delete mode 100644 bob/learn/em/cpp/BICMachine.cpp delete mode 100644 bob/learn/em/cpp/BICTrainer.cpp delete mode 100644 bob/learn/em/include/.DS_Store diff --git a/bob/learn/em/.DS_Store b/bob/learn/em/.DS_Store deleted file mode 100644 index 47a80a664e3fd38c9114f0953bbebcd70e7d0146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8z3~dZp0Z1N%F(jFwA|RR(Y(^<V3PWm2adJ*lK2(kn z1=7pTkjaq8kj#+7fTTY^2c(sSp@boop_rirVkkrqBr%FdLtr!nMnhmU1V%$(Gz7>C z0Y->64sHlNN{)uWXb6mk06YXh<%0sKufV{--~go?AT&sdfsug$)O-igEHF)wegFeV z45SrAgS3KZkX8mp5DRPuSSte~14Jt$xElh}2kMf5Xs~t$MzGBwK3F>gBiLpJ21bZ> z21bZ>21aNPg%P5iff1sefe~yw%ypymXb6mk04xNUAq)Xf{qM@afUExxQ8h}AhQMeD z49gH;WN`_0aROJ$*!>5pYeDsC0#wZbs4_-Sy$lfpDFIdO;OdwOGN>p4RR$6VX$R5Z Y>X?y%0bHApHU?lJG)j+#0DVIM0BW8Zm;e9( diff --git a/bob/learn/em/cpp/BICMachine.cpp b/bob/learn/em/cpp/BICMachine.cpp deleted file mode 100644 index 4abe724..0000000 --- a/bob/learn/em/cpp/BICMachine.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/** - * @date Tue Jun 5 16:54:27 CEST 2012 - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * - * A machine that implements the liner projection of input to the output using - * weights, biases and sums: - * output = sum(inputs * weights) + bias - * It is possible to setup the machine to previously normalize the input taking - * into consideration some input bias and division factor. It is also possible - * to set it up to have an activation function. - * A linear classifier. See C. M. Bishop, "Pattern Recognition and Machine - * Learning", chapter 4 - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.learn.em/BICMachine.h> -#include <bob.math/linear.h> -#include <bob.core/assert.h> -#include <bob.core/check.h> - -/** - * Initializes an empty BIC Machine - * - * @param use_DFFS Add the Distance From Feature Space during score computation? - */ -bob::learn::em::BICMachine::BICMachine(bool use_DFFS) -: - m_project_data(use_DFFS), - m_use_DFFS(use_DFFS) -{} - -/** - * Assigns the other BICMachine to this, i.e., makes a deep copy of the given machine. - * - * @param other The other BICMachine to get a shallow copy of - * @return a reference to *this - */ -bob::learn::em::BICMachine::BICMachine(const BICMachine& other) -: - m_project_data(other.m_project_data), - m_use_DFFS(other.m_use_DFFS) -{ - if (m_project_data){ - setBIC(false, other.m_mu_I, other.m_lambda_I, other.m_Phi_I, other.m_rho_I, true); - setBIC(true , other.m_mu_E, other.m_lambda_E, other.m_Phi_E, other.m_rho_E, true); - } else { - setIEC(false, other.m_mu_I, other.m_lambda_I, true); - setIEC(true , other.m_mu_E, other.m_lambda_E, true); - } -} - -/** - * Assigns the other BICMachine to this, i.e., makes a deep copy of the given BICMachine - * - * @param other The other BICMachine to get a deep copy of - * @return a reference to *this - */ -bob::learn::em::BICMachine& bob::learn::em::BICMachine::operator=(const BICMachine& other) -{ - if (this != &other) - { - if (other.m_project_data){ - m_use_DFFS = other.m_use_DFFS; - setBIC(false, other.m_mu_I, other.m_lambda_I, other.m_Phi_I, other.m_rho_I, true); - setBIC(true , other.m_mu_E, other.m_lambda_E, other.m_Phi_E, other.m_rho_E, true); - } else { - m_use_DFFS = false; - setIEC(false, other.m_mu_I, other.m_lambda_I, true); - setIEC(true , other.m_mu_E, other.m_lambda_E, true); - } - } - return *this; -} - -/** - * Compares if this machine and the given one are identical - * - * @param other The BICMachine to compare with - * @return true if both machines are identical, i.e., have exactly the same parameters, otherwise false - */ -bool bob::learn::em::BICMachine::operator==(const BICMachine& other) const -{ - return (m_project_data == other.m_project_data && - (!m_project_data || m_use_DFFS == other.m_use_DFFS) && - bob::core::array::isEqual(m_mu_I, other.m_mu_I) && - bob::core::array::isEqual(m_mu_E, other.m_mu_E) && - bob::core::array::isEqual(m_lambda_I, other.m_lambda_I) && - bob::core::array::isEqual(m_lambda_E, other.m_lambda_E) && - (!m_project_data || - (bob::core::array::isEqual(m_Phi_I, other.m_Phi_I) && - bob::core::array::isEqual(m_Phi_E, other.m_Phi_E) && - (!m_use_DFFS || (m_rho_I == other.m_rho_I && m_rho_E == other.m_rho_E))))); -} - -/** - * Checks if this machine and the given one are different - * - * @param other The BICMachine to compare with - * @return false if both machines are identical, i.e., have exactly the same parameters, otherwise true - */ -bool bob::learn::em::BICMachine::operator!=(const BICMachine& other) const -{ - return !(this->operator==(other)); -} - -/** - * Compares the given machine with this for similarity - * - * @param other The BICMachine to compare with - * @param r_epsilon The largest value any parameter might relatively differ between the two machines - * @param a_epsilon The largest value any parameter might absolutely differ between the two machines - - * @return true if both machines are approximately equal, otherwise false - */ -bool bob::learn::em::BICMachine::is_similar_to(const BICMachine& other, - const double r_epsilon, const double a_epsilon) const -{ - if (m_project_data){ - // compare data - if (not bob::core::array::hasSameShape(m_Phi_I, other.m_Phi_I)) return false; - if (not bob::core::array::hasSameShape(m_Phi_E, other.m_Phi_E)) return false; - // check that the projection matrices are close, - // but allow that eigen vectors might have opposite directions - // (i.e., they are either identical -> difference is 0, or opposite -> sum is zero) - for (int i = m_Phi_I.extent(1); i--;){ - const blitz::Array<double,1>& sub1 = m_Phi_I(blitz::Range::all(), i); - const blitz::Array<double,1>& sub2 = other.m_Phi_I(blitz::Range::all(), i); - blitz::Array<double,1> sub2_negative(-sub2); - if (!bob::core::array::isClose(sub1, sub2, r_epsilon, a_epsilon) && !bob::core::array::isClose(sub1, sub2_negative, r_epsilon, a_epsilon)) return false; - } - for (int i = m_Phi_E.shape()[1]; i--;){ - const blitz::Array<double,1>& sub1 = m_Phi_E(blitz::Range::all(), i); - const blitz::Array<double,1>& sub2 = other.m_Phi_E(blitz::Range::all(), i); - blitz::Array<double,1> sub2_negative(-sub2); - if (!bob::core::array::isClose(sub1, sub2, r_epsilon, a_epsilon) && !bob::core::array::isClose(sub1, sub2_negative, r_epsilon, a_epsilon)) return false; - } - } - - return (m_project_data == other.m_project_data && - (!m_project_data || m_use_DFFS == other.m_use_DFFS) && - bob::core::array::isClose(m_mu_I, other.m_mu_I, r_epsilon, a_epsilon) && - bob::core::array::isClose(m_mu_E, other.m_mu_E, r_epsilon, a_epsilon) && - bob::core::array::isClose(m_lambda_I, other.m_lambda_I, r_epsilon, a_epsilon) && - bob::core::array::isClose(m_lambda_E, other.m_lambda_E, r_epsilon, a_epsilon) && - (!m_project_data || - (!m_use_DFFS || (bob::core::isClose(m_rho_I, other.m_rho_I, r_epsilon, a_epsilon) && - bob::core::isClose(m_rho_E, other.m_rho_E, r_epsilon, a_epsilon))))); -} - - - -void bob::learn::em::BICMachine::initialize(bool clazz, int input_length, int projected_length){ - blitz::Array<double,1>& diff = clazz ? m_diff_E : m_diff_I; - blitz::Array<double,1>& proj = clazz ? m_proj_E : m_proj_I; - diff.resize(input_length); - proj.resize(projected_length); -} - -/** - * Sets the parameters of the given class that are required for computing the IEC scores (Guenther, Wuertz) - * - * @param clazz false for the intrapersonal class, true for the extrapersonal one. - * @param mean The mean vector of the training data - * @param variances The variances of the training data - * @param copy_data If true, makes a deep copy of the matrices, otherwise it just references it (the default) - */ -void bob::learn::em::BICMachine::setIEC( - bool clazz, - const blitz::Array<double,1>& mean, - const blitz::Array<double,1>& variances, - bool copy_data -){ - m_project_data = false; - // select the right matrices to write - blitz::Array<double,1>& mu = clazz ? m_mu_E : m_mu_I; - blitz::Array<double,1>& lambda = clazz ? m_lambda_E : m_lambda_I; - - // copy mean and variances - if (copy_data){ - mu.resize(mean.shape()); - mu = mean; - lambda.resize(variances.shape()); - lambda = variances; - } else { - mu.reference(mean); - lambda.reference(variances); - } -} - -/** - * Sets the parameters of the given class that are required for computing the BIC scores (Teixeira) - * - * @param clazz false for the intrapersonal class, true for the extrapersonal one. - * @param mean The mean vector of the training data - * @param variances The eigenvalues of the training data - * @param projection The PCA projection matrix - * @param rho The residual eigenvalues, used for DFFS calculation - * @param copy_data If true, makes a deep copy of the matrices, otherwise it just references it (the default) - */ -void bob::learn::em::BICMachine::setBIC( - bool clazz, - const blitz::Array<double,1>& mean, - const blitz::Array<double,1>& variances, - const blitz::Array<double,2>& projection, - const double rho, - bool copy_data -){ - m_project_data = true; - // select the right matrices to write - blitz::Array<double,1>& mu = clazz ? m_mu_E : m_mu_I; - blitz::Array<double,1>& lambda = clazz ? m_lambda_E : m_lambda_I; - blitz::Array<double,2>& Phi = clazz ? m_Phi_E : m_Phi_I; - double& rho_ = clazz ? m_rho_E : m_rho_I; - - // copy information - if (copy_data){ - mu.resize(mean.shape()); - mu = mean; - lambda.resize(variances.shape()); - lambda = variances; - Phi.resize(projection.shape()); - Phi = projection; - } else { - mu.reference(mean); - lambda.reference(variances); - Phi.reference(projection); - } - rho_ = rho; - - // check that rho has a reasonable value (if it is used) - if (m_use_DFFS && rho_ < 1e-12) throw std::runtime_error("The given average eigenvalue (rho) is too close to zero"); - - // initialize temporaries - initialize(clazz, Phi.shape()[0], Phi.shape()[1]); -} - -/** - * Set or unset the usage of the Distance From Feature Space - * - * @param use_DFFS The new value of use_DFFS - */ -void bob::learn::em::BICMachine::use_DFFS(bool use_DFFS){ - m_use_DFFS = use_DFFS; - if (m_project_data && m_use_DFFS && (m_rho_E < 1e-12 || m_rho_I < 1e-12)) std::runtime_error("The average eigenvalue (rho) is too close to zero, so using DFFS will not work"); -} - -/** - * Loads the BICMachine from the given hdf5 file. - * - * @param config The hdf5 file containing the required information. - */ -void bob::learn::em::BICMachine::load(bob::io::base::HDF5File& config){ - //reads all data directly into the member variables - m_project_data = config.read<bool>("project_data"); - m_mu_I.reference(config.readArray<double,1>("intra_mean")); - m_lambda_I.reference(config.readArray<double,1>("intra_variance")); - if (m_project_data){ - m_use_DFFS = config.read<bool>("use_DFFS"); - m_Phi_I.reference(config.readArray<double,2>("intra_subspace")); - initialize(false, m_Phi_I.shape()[0], m_Phi_I.shape()[1]); - m_rho_I = config.read<double>("intra_rho"); - } - - m_mu_E.reference(config.readArray<double,1>("extra_mean")); - m_lambda_E.reference(config.readArray<double,1>("extra_variance")); - if (m_project_data){ - m_Phi_E.reference(config.readArray<double,2>("extra_subspace")); - initialize(true, m_Phi_E.shape()[0], m_Phi_E.shape()[1]); - m_rho_E = config.read<double>("extra_rho"); - } - // check that rho has reasonable values - if (m_project_data && m_use_DFFS && (m_rho_E < 1e-12 || m_rho_I < 1e-12)) throw std::runtime_error("The loaded average eigenvalue (rho) is too close to zero"); - -} - -/** - * Saves the parameters of the BICMachine to the given hdf5 file. - * - * @param config The hdf5 file to write the configuration into. - */ -void bob::learn::em::BICMachine::save(bob::io::base::HDF5File& config) const{ - config.set("project_data", m_project_data); - config.setArray("intra_mean", m_mu_I); - config.setArray("intra_variance", m_lambda_I); - if (m_project_data){ - config.set("use_DFFS", m_use_DFFS); - config.setArray("intra_subspace", m_Phi_I); - config.set("intra_rho", m_rho_I); - } - - config.setArray("extra_mean", m_mu_E); - config.setArray("extra_variance", m_lambda_E); - if (m_project_data){ - config.setArray("extra_subspace", m_Phi_E); - config.set("extra_rho", m_rho_E); - } -} - -/** - * Computes the BIC or IEC score for the given input vector. - * The score itself is the log-likelihood score of the given input vector belonging to the intrapersonal class. - * No sanity checks of input and output are performed. - * - * @param input A vector (of difference values) to compute the BIC or IEC score for. - * @param output The one-element array that will contain the score afterwards. - */ -void bob::learn::em::BICMachine::forward_(const blitz::Array<double,1>& input, double& output) const{ - if (m_project_data){ - // subtract mean - m_diff_I = input - m_mu_I; - m_diff_E = input - m_mu_E; - // project data to intrapersonal and extrapersonal subspace - bob::math::prod(m_diff_I, m_Phi_I, m_proj_I); - bob::math::prod(m_diff_E, m_Phi_E, m_proj_E); - - // compute Mahalanobis distance - output = blitz::sum(blitz::pow2(m_proj_E) / m_lambda_E) - blitz::sum(blitz::pow2(m_proj_I) / m_lambda_I); - - // add the DFFS? - if (m_use_DFFS){ - output += blitz::sum(blitz::pow2(m_diff_E) - blitz::pow2(m_proj_E)) / m_rho_E; - output -= blitz::sum(blitz::pow2(m_diff_I) - blitz::pow2(m_proj_I)) / m_rho_I; - } - output /= (m_proj_E.extent(0) + m_proj_I.extent(0)); - } else { - // forward without projection - output = blitz::mean( blitz::pow2(input - m_mu_E) / m_lambda_E - - blitz::pow2(input - m_mu_I) / m_lambda_I); - } -} - -/** - * Computes the BIC or IEC score for the given input vector. - * The score itself is the log-likelihood score of the given input vector belonging to the intrapersonal class. - * Sanity checks of input and output shape are performed. - * - * @param input A vector (of difference values) to compute the BIC or IEC score for. - * @param output The one-element array that will contain the score afterwards. - */ -void bob::learn::em::BICMachine::forward(const blitz::Array<double,1>& input, double& output) const{ - // perform some checks - bob::core::array::assertSameShape(input, m_mu_E); - - // call the actual method - forward_(input, output); -} - diff --git a/bob/learn/em/cpp/BICTrainer.cpp b/bob/learn/em/cpp/BICTrainer.cpp deleted file mode 100644 index 16d0726..0000000 --- a/bob/learn/em/cpp/BICTrainer.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @date Wed Jun 6 10:29:09 CEST 2012 - * @author Manuel Guenther <Manuel.Guenther@idiap.ch> - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.learn.em/BICTrainer.h> -#include <bob.learn.linear/pca.h> -#include <bob.learn.linear/machine.h> - -static double sqr(const double& x){ - return x*x; -} - -/** - * This function trains one of the classes of the given machine with the given data. - * It computes either BIC projection matrices, or IEC mean and variance. - * - * @param clazz false for the intrapersonal class, true for the extrapersonal one. - * @param machine The machine to be trained. - * @param differences A set of (intra/extra)-personal difference vectors that should be trained. - */ -void bob::learn::em::BICTrainer::train_single(bool clazz, bob::learn::em::BICMachine& machine, const blitz::Array<double,2>& differences) const { - int subspace_dim = clazz ? m_M_E : m_M_I; - int input_dim = differences.extent(1); - int data_count = differences.extent(0); - blitz::Range a = blitz::Range::all(); - - if (subspace_dim){ - // train the class using BIC - - // Compute PCA on the given dataset - bob::learn::linear::PCATrainer trainer; - const int n_eigs = trainer.output_size(differences); - bob::learn::linear::Machine pca(input_dim, n_eigs); - blitz::Array<double,1> variances(n_eigs); - trainer.train(pca, variances, differences); - - // compute rho - double rho = 0.; - int non_zero_eigenvalues = std::min(input_dim, data_count-1); - // assert that the number of kept eigenvalues is not chosen to big - if (subspace_dim >= non_zero_eigenvalues) - throw std::runtime_error((boost::format("The chosen subspace dimension %d is larger than the theoretical number of nonzero eigenvalues %d")%subspace_dim%non_zero_eigenvalues).str()); - // compute the average of the reminding eigenvalues - for (int i = subspace_dim; i < non_zero_eigenvalues; ++i){ - rho += variances(i); - } - rho /= non_zero_eigenvalues - subspace_dim; - - // limit dimensionalities - pca.resize(input_dim, subspace_dim); - variances.resizeAndPreserve(subspace_dim); - - // check that all variances are meaningful - for (int i = 0; i < subspace_dim; ++i){ - if (variances(i) < 1e-12) - throw std::runtime_error((boost::format("The chosen subspace dimension is %d, but the %dth eigenvalue is already to small")%subspace_dim%i).str()); - } - - // initialize the machine - blitz::Array<double, 2> projection = pca.getWeights(); - blitz::Array<double, 1> mean = pca.getInputSubtraction(); - machine.setBIC(clazz, mean, variances, projection, rho); - } else { - // train the class using IEC - // => compute mean and variance only - blitz::Array<double,1> mean(input_dim), variance(input_dim); - - // compute mean and variance - mean = 0.; - variance = 0.; - for (int n = data_count; n--;){ - const blitz::Array<double,1>& diff = differences(n,a); - assert(diff.shape()[0] == input_dim); - for (int i = input_dim; i--;){ - mean(i) += diff(i); - variance(i) += sqr(diff(i)); - } - } - // normalize mean and variances - for (int i = 0; i < input_dim; ++i){ - // intrapersonal - variance(i) = (variance(i) - sqr(mean(i)) / data_count) / (data_count - 1.); - mean(i) /= data_count; - if (variance(i) < 1e-12) - throw std::runtime_error((boost::format("The variance of the %dth dimension is too small. Check your data!")%i).str()); - } - - // set the results to the machine - machine.setIEC(clazz, mean, variance); - } -} diff --git a/bob/learn/em/include/.DS_Store b/bob/learn/em/include/.DS_Store deleted file mode 100644 index 34b4a20f450a2fe6b32abb36f282ba6e1cc123f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8z3~dZp0Z1N%F(jFwB8(vOz-Htyq%tHj6fxv6=t1QO zQ6RlM3`q?63`q=n49NOZ8FEvKlXH^t^K%FpGAchB0;3@?8UmvsFd71*AwYBpfa+dQ z{m)Ibj!}i9Aut*OBP9et<%0sGZO`BUr5hkLNQ!}xfdSkFU}RumfrSYpxF5g(k^^Z4 z(IBlL8l;th5yS$U0oKaE2-V66?uLN$fx09h8mygx5o|Mv57y4W2)3Dlff1sefe~sm zBeaLY2+_{K2+_{K2(}&Ox>0&G1V%#u76Qx=h5)GkcV%F})&Ga68YM?VU^E1VWe6~` zxCFa6fh%R~{sYyup!zfcs^$Px86&7(hKPZbfU0(Ib<6}ARFr@!1BrvQgJ^Jd%*en1 TuFXdq1F#SprAI@6z99er@?{mD -- GitLab