Esempio n. 1
0
void gmm::batch(const eigen_wsvec_list_t& data, int d, int k) {
  if (data.empty()) {
    *this = gmm();
    return;
  }

  typedef eigen_wsvec_list_t::const_iterator data_iter;
  initialize(data, d, k);

  eigen_svec_list_t old_means;
  eigen_smat_list_t old_covs;
  eigen_solver_list_t old_solvers;
  double old_obj = 0, obj = 0;
  vector<double> weights(k);

  bool converged = false;
  int64_t niter = 1;
  while (!converged) {
    old_covs = covs_;
    old_means = means_;
    old_solvers = cov_solvers_;
    old_obj = obj;
    obj = 0;
    fill(weights.begin(), weights.end(), 0);
    fill(means_.begin(), means_.end(), eigen_svec_t(d));
    fill(covs_.begin(), covs_.end(), eigen_smat_t(d, d));

    for (data_iter i = data.begin(); i != data.end(); ++i) {
      eigen_svec_t cps =
          cluster_probs(i->data, old_means, old_covs, old_solvers);
      for (int c = 0; c < k; ++c) {
        double cp = i->weight * cps.coeff(c);
        means_[c] += cp * i->data;
        covs_[c] += i->data * (i->data.transpose()) * cp;
        weights[c] += cp;
        obj -= std::log(std::max(cp, std::numeric_limits<double>::min()));
      }
    }
    for (int c = 0; c < k; ++c) {
      means_[c] /= weights[c];
      covs_[c] /= weights[c];
      double eps = 0.1;
      covs_[c] -= means_[c] * means_[c].transpose();
      covs_[c] += eps * eye_;
      cov_solvers_[c] =
          shared_ptr<eigen_solver_t>(new eigen_solver_t(covs_[c]));
    }
    converged = is_converged(niter++, means_, old_means, obj, old_obj);
  }
}
Esempio n. 2
0
int main(int argc,char** argv){


    std::cout<< "=== test GMM and GMC === " << std::endl;

    ros::init(argc, argv, "test_statistics");
    ros::NodeHandle nh;


    std::string path_parameters = "/home/guillaume/MatlabWorkSpace/peg_in_hole_RL/PolicyModelSaved/PolicyModel_txt/gmm_xhu";


    stats::GMM gmm(path_parameters);
/*
    stats::GMM gmm_c;
    std::vector<std::size_t> in = {{0,1,2,3}};
    std::vector<std::size_t> out = {{4,5,6}};
    arma::vec x(4);
    x(0) = 0.1765;
    x(1) = 0.3907;
    x(2) = 0.0705;
    x(3) = -1.9986;


    std::cout<< "w(0): " << (gmm.gmm.Weights())[0] << std::endl;
    gmm.gmm.Means()[0].print("Mu(0)");
    gmm.gmm.Covariances()[0].print("Covariance[0]");




    gmm_c.gmm = mlpack::gmm::GMM<double>(gmm.K,3);

    std::cout<< "--- condition---" << std::endl;

    std::cout<< "in : " << in.size() << std::endl;
    std::cout<< "out: " << out.size() << std::endl;

    gmm.condition(gmm_c,x,in,out);*/

    /*std::cout<< "w(0): " << (gmm_c.gmm.Weights())[114] << std::endl;
    gmm_c.gmm.Means()[114].print("Mu(0)");
    gmm_c.gmm.Covariances()[114].print("Covariance[0]");


    arma::vec e; e.resize(3);
*/
   // gmm_c.print();

   // gmm_c.expection(e);

    //e.print("expectation");



    std::cout<< "=== end of test === " << std::endl;



    return 0;
}