#include "cmm/gmm.hpp"
#include "cmm/gmm_estimator.hpp"
#include <map>
#include <chrono>
#include <cmath>
using namespace cmm;
std::vector<double> CollabMM::compute_estimation(const Eigen::VectorXd& X) const{
if([&]() -> bool { for(int i = 0; i < _nbr_class; i++)
{if(!_model.at(i).empty()) return false;} return true;}())
return std::vector<double>(_nbr_class,1./(double)_nbr_class);
// Estimator<CollabMM> estimator(this, X);
return estimation<CollabMM>(this,X);
}
//SCORE_CALCULATOR
#ifndef NO_PARALLEL
void CollabMM::_score_calculator::operator()(const tbb::blocked_range<size_t>& r){
double sum = _sum;
for(size_t i = r.begin(); i != r.end(); ++i){
if(_samples[i].first == _label || _all_samples)
sum += std::log(_samples.estimations[i][_label]);
}
_sum = sum;
}
#endif
double CollabMM::_score_calculator::compute(){
#ifdef NO_PARALLEL
_sum = 0;
for(int i = 0; i < _samples.size(); i++){
if(_samples[i].first == _label || _all_samples)
_sum += std::log(_samples.estimations[i][_label]);
}
#else
tbb::parallel_reduce(tbb::blocked_range<size_t>(0,_samples.size()),*this);
#endif
return _sum/((double)_samples.get_data(_label).size());
}
//--SCORE_CALCULATOR
void CollabMM::update_factors(){
for(int i = 0; i < _nbr_class; i++)
_update_factors(i);
}
void CollabMM::_update_factors(int lbl){
double sum_size = 0;
for(auto& components : _model[lbl])
sum_size += components->size();
for(auto& c : _model[lbl]){
c->set_factor((double)c->size()/((double)sum_size));
}
}
void CollabMM::new_component(const Eigen::VectorXd& sample, int label){
Component::Ptr component(new Component(_dimension,label));
component->add(sample);
component->update_parameters();
_model[label].push_back(component);
update_factors();
}
void CollabMM::knn(const Eigen::VectorXd& center, Data& output, int k){
double min_dist, dist;
int min_index;
Data cpy_samples(_samples);
for(int j = 0; j < k; j++){
min_dist = sqrt((cpy_samples[0].second - center).transpose()*(cpy_samples[0].second - center));
min_index = 0;
for(int i = 1; i < cpy_samples.size(); i++){
dist = sqrt((cpy_samples[i].second - center).transpose()*(cpy_samples[i].second - center));
if(dist < min_dist){
min_index = i;
min_dist = dist;
}
}
output.add(cpy_samples[min_index]);
cpy_samples.erase(min_index);
}
}
double CollabMM::confidence(const Eigen::VectorXd& X) const{
int size = 0;
for(int i = 0; i < _model.size() ; i++){
if(_model.at(i).size() < 5)
continue;
size += _model.at(i).size();
}
if(size == 0)
return 0;
//* Look for the closest consistent (size >= 5) component of X
Eigen::VectorXd distances(size);
int k = 0;
// double denominator = 0;
for(int i = 0 ; i < _model.size(); i++){
for (int j = 0; j < _model.at(i).size(); j++) {
if(_model.at(i).size() < 5)
continue;
distances(k) = _model.at(i).at(j)->distance(X);
k++;
}
}
int r=0,c=0;
distances.minCoeff(&r,&c);
//*/
//* Compute the real indexes of the components in the model
int lbl = 0, s = _model.at(lbl).size();
while(r >= s){
if(s >= 5)
r = r - s;
lbl++;
s = _model.at(lbl).size();
}
//*/
return _model.at(lbl).at(r)->compute_multivariate_normal_dist(X)/
_model.at(lbl).at(r)->compute_multivariate_normal_dist(_model.at(lbl).at(r)->get_mu());
}
double CollabMM::loglikelihood(){
_score_calculator sc(this,_samples);
return sc.compute();
}
double CollabMM::loglikelihood(int label){
_score_calculator sc(this,_samples,false,label);
return sc.compute();
}
bool CollabMM::_merge(const Component::Ptr& comp){
// if comp have too few samples or there is only one component in lbl model abort
if(comp->size() < 5 || _model[comp->get_label()].size() == 1)
return false;
int lbl = comp->get_label();
int ind;
for(ind = 0; ind < _model[lbl].size(); ind++)
if(_model[lbl][ind].get() == comp.get())
break;
if(ind == _model[lbl].size())
return false;
//* Capture time.
#ifdef VERBOSE
std::cout << "merge function" << std::endl;
std::chrono::system_clock::time_point timer;
timer = std::chrono::system_clock::now();
#endif
//*/
CollabMM candidate;
double score, candidate_score;
if(_llhood_drive)
score = loglikelihood();
//* Find the closest component within the same class
Eigen::VectorXd distances(_model[lbl].size());
int r, c;
for (int j = 0; j < _model[lbl].size(); j++) {
if(_model[lbl][j] == comp){
distances(j) = 1000000;
continue;
}
distances(j) = comp->distance(_model[lbl][j]->get_mu());
}
distances.minCoeff(&r,&c);
//*/
// if(_model[lbl][r]->get_samples().size() < 5)
// return false;
if(comp->intersect(_model[lbl][r])){// check instersection
if(_llhood_drive){
candidate = CollabMM(_model);
candidate.set_samples(_samples);
candidate.model()[lbl][ind]->merge(candidate.model()[lbl][r]);
candidate.model()[lbl].erase(candidate.model()[lbl].begin() + r);
candidate.update_factors();
candidate._estimate_training_dataset();
candidate_score = candidate.loglikelihood();
#ifdef VERBOSE
std::cout << candidate_score << " >? " << score << std::endl;
#endif
}
if(!_llhood_drive || candidate_score > score){
#ifdef VERBOSE
std::cout << "-_- MERGE _-_" << std::endl;
#endif
_model[lbl][ind]->merge(_model[lbl][r]);
_model[lbl].erase(_model[lbl].begin() + r);
update_factors(); //* Display time spent for the algorithm.
//* Display time spent for the algorithm.
#ifdef VERBOSE
std::cout << "Merge finish, time spent : "
<< std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now() - timer).count() << std::endl;
#endif
//*/
return true;
}
}
//* Display time spent for the algorithm.
#ifdef VERBOSE
std::cout << "Merge finish, time spent : "
<< std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now() - timer).count() << std::endl;
#endif
//*/
return false;
}
std::pair<double,double> CollabMM::_coeff_intersection(int ind1, int lbl1, int ind2, int lbl2){
std::pair<double,double> coeffs;
Eigen::VectorXd eigenval, eigenval2, diff_mu;
Eigen::MatrixXd eigenvect, eigenvect2;
_model[lbl1][ind1]->compute_eigenvalues(eigenval,eigenvect);
_model[lbl2][ind2]->compute_eigenvalues(eigenval2,eigenvect2);
diff_mu = _model[lbl1][ind1]->get_mu() - _model[lbl1][ind1]->get_mu();
coeffs.first = diff_mu.dot(eigenvect.col(0)) - diff_mu.squaredNorm()*diff_mu.squaredNorm();
coeffs.second = diff_mu.dot(eigenvect2.col(0)) - diff_mu.squaredNorm()*diff_mu.squaredNorm();
return coeffs;
}
double CollabMM::_component_score(int i, int lbl){
Data knn_output;
knn(_model[lbl][i]->get_mu(), knn_output,_model[lbl][i]->size());
_score_calculator sc(this,knn_output,lbl);
return sc.compute();
}
bool CollabMM::_split(const Component::Ptr& comp){
//*If the component have less than 4 element abort
if(comp->size() < 5)
return false;
//*/
if(_max_nb_components != 0 && _model[comp->get_label()].size() >= _max_nb_components){
#ifdef VERBOSE
std::cout << "maximum number of components reach : " << _max_nb_components << std::endl;
std::co
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
为了解决其任务,机器人需要具有解释其感知的能力。 在视觉的情况下,这种解释特别困难,并且依赖于对场景结构的理解,至少在其任务和感觉运动能力的范围内。 能够根据自己的任务和能力构建和调整这种解释过程的机器人将突破机器人在非受控环境中所能达到的极限。 一种解决方案是为机器人提供过程来构建不特定于环境或情况的此类表示。 很多工作都集中在对象分割、识别和操作上。 鉴于可能的对象和环境范围广泛,仅根据其视觉外观定义对象具有挑战性。 因此,当前的工作对场景的结构进行了简化假设。 这种假设的一个例子是桌面假设,它假设物体位于平坦的表面上。 这样的假设降低了对象提取过程对假设成立的环境的适应性。 为了限制这样的假设,我们引入了一种探索方法,旨在识别场景中的可移动元素,而不考虑对象的概念。 通过使用交互式感知框架,我们旨在以最少的上下文特定假设引导环境表示的获取过程。 机器人系统构建了一个称为相关图的感知图,它指示当前场景的可移动部分。 在线训练分类器以预测每个区域的类别(可移动或不可移动)。 它还用于选择与之交互的区域,以最小化分类的不确定性。 引入了一个特定的分类器来满足这些需求:协作混合模型分类器
资源推荐
资源详情
资源评论
收起资源包目录
通过交互式感知从一组有限的假设中引导机器人生态感知 (980个子文件)
gmm.cpp 22KB
gmm.cpp 22KB
multiclass_test.cpp 12KB
multiclass_test.cpp 12KB
incrgmm_test.cpp 11KB
incrgmm_test.cpp 11KB
test_false_samples.cpp 10KB
test_false_samples.cpp 10KB
component.cpp 10KB
component.cpp 10KB
test.cpp 10KB
test.cpp 10KB
test_em.cpp 9KB
test_em.cpp 9KB
incr_gmm.cpp 9KB
incr_gmm.cpp 9KB
test_batch.cpp 8KB
test_batch.cpp 8KB
online_train_gmm.cpp 7KB
online_train_gmm.cpp 7KB
eggholder_two_class_problem.cpp 5KB
eggholder_two_class_problem.cpp 5KB
data.cpp 3KB
data.cpp 3KB
mnist_batch.cpp 3KB
mnist_batch.cpp 3KB
gen_archive_stat.cpp 3KB
gen_archive_stat.cpp 3KB
test_serial.cpp 3KB
test_serial.cpp 3KB
mcs.cpp 3KB
mcs.cpp 3KB
gmm_loglikelihood.cpp 3KB
gmm_loglikelihood.cpp 3KB
batch_train_gmm.cpp 1KB
batch_train_gmm.cpp 1KB
mnist_test.cpp 978B
mnist_test.cpp 978B
test_mvn.cpp 852B
test_mvn.cpp 852B
nnmap.cpp 641B
nnmap.cpp 641B
load_archive.cpp 589B
load_archive.cpp 589B
yml_to_libsvm.cpp 584B
yml_to_libsvm.cpp 584B
yml_to_data_labels.cpp 520B
yml_to_data_labels.cpp 520B
doxygen.css 23KB
doxygen.css 23KB
search.css 4KB
search.css 4KB
tabs.css 1KB
tabs.css 1KB
mnist_reader.hpp 15KB
mnist_reader.hpp 15KB
gmm.hpp 11KB
gmm.hpp 11KB
trainer.hpp 7KB
trainer.hpp 7KB
component.hpp 6KB
component.hpp 6KB
mnist_reader_less.hpp 5KB
mnist_reader_less.hpp 5KB
classifier.hpp 5KB
classifier.hpp 5KB
data.hpp 5KB
data.hpp 5KB
mcs_fct.hpp 5KB
mcs_fct.hpp 5KB
mcs.hpp 4KB
mcs.hpp 4KB
incr_gmm.hpp 3KB
incr_gmm.hpp 3KB
mnist_utils.hpp 3KB
mnist_utils.hpp 3KB
gmm_estimator.hpp 3KB
gmm_estimator.hpp 3KB
mnist_reader_common.hpp 2KB
mnist_reader_common.hpp 2KB
serialization.hpp 1KB
serialization.hpp 1KB
nnmap.hpp 1KB
nnmap.hpp 1KB
gmm_8cpp_source.html 136KB
gmm_8cpp_source.html 136KB
classcmm_1_1_collab_m_m.html 79KB
classcmm_1_1_collab_m_m.html 79KB
_c_make_c_compiler_id_8c_source.html 74KB
_c_make_c_compiler_id_8c_source.html 74KB
namespacemnist.html 74KB
namespacemnist.html 74KB
_c_make_c_x_x_compiler_id_8cpp_source.html 73KB
_c_make_c_x_x_compiler_id_8cpp_source.html 73KB
component_8cpp_source.html 68KB
component_8cpp_source.html 68KB
mnist__reader_8hpp_source.html 66KB
mnist__reader_8hpp_source.html 66KB
gmm_8hpp_source.html 62KB
gmm_8hpp_source.html 62KB
共 980 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
科研吧
- 粉丝: 11
- 资源: 218
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功