From 20c287b91345e348cc00b8a0da53ff967be0cac9 Mon Sep 17 00:00:00 2001 From: astrojhgu Date: Sat, 14 May 2011 16:24:05 +0000 Subject: git-svn-id: file:///home/svn/opt_utilities@197 ed2142bd-67ad-457f-ba7c-d818d4011675 --- distributions/component.hpp | 9 +- distributions/kmm_component.hpp | 205 ++++++++++++++++++++++++++++++++++++++++ misc/optvec.hpp | 18 ++-- statistics/kmm_stat.hpp | 101 ++++++++++++++++++++ 4 files changed, 323 insertions(+), 10 deletions(-) create mode 100644 distributions/kmm_component.hpp create mode 100644 statistics/kmm_stat.hpp diff --git a/distributions/component.hpp b/distributions/component.hpp index d761bf8..ee13adb 100644 --- a/distributions/component.hpp +++ b/distributions/component.hpp @@ -46,7 +46,14 @@ namespace opt_utilities { for(int i=0;i0) + { + add_component(*rhs.components[i],rhs.get_param_info(rhs.weight_num[i-1]).get_value()); + } + else + { + add_component(*rhs.components[i]); + } } for(int i=0;i +#include +#include +#include +#include + + + +namespace opt_utilities +{ + template + class kmm_component + :public model,optvec,optvec,std::string> + { + private: + std::vector,optvec,optvec,std::string>*> components; + std::vector weight_num; + private: + kmm_component* do_clone()const + { + return new kmm_component(*this); + } + + const char* do_get_type_name()const + { + return "Multi-distribution"; + } + public: + kmm_component() + { + //this->push_param_info(param_info >("x0",0)); + //this->push_param_info(param_info >("sigma",1)); + } + + kmm_component(const kmm_component& rhs) + { + for(int i=0;i=1) + { + add_component(*rhs.components[i],rhs.get_param_info(rhs.weight_num[i-1]).get_value()); + } + else + { + add_component(*rhs.components[i]); + } + } + for(int i=0;idestroy(); + } + components.clear(); + for(int i=0;idestroy(); + } + } + + + public: + void add_component(const model,optvec,optvec,std::string>& m,const T& w=0) + { + int morder=components.size(); + components.push_back(m.clone()); + std::ostringstream oss; + oss<1) + { + param_info,std::string> p1(std::string("_w")+smorder,w); + this->push_param_info(p1); + weight_num.push_back(this->get_num_params()-1); + } + int np=m.get_num_params(); + for(int i=0;i,std::string> p(m.get_param_info(i)); + param_info,std::string> p1(p.get_name()+smorder,p.get_value()); + this->push_param_info(p1); + } + } + + optvec convert_unit_sph(const optvec& p) + { + int ndim=p.size()+1; + optvec result(ndim); + result[0]=1; + for(int i=0;i do_eval(const optvec& x,const optvec& param) + { + T result(0); + optvec weight_angle; + for(int i=0;i weight(convert_unit_sph(weight_angle)); + + int pnum=0; + for(int i=0;i p(components[i]->get_num_params()); + for(int j=0;jeval(x,p)[0]*weight[i]); + ++pnum; + } + optvec result1(1); + result1[0]=result;; + return result1; + } + + optvec eval_unsumed(const optvec& x,const optvec& param) + { + optvec weight_angle; + for(int i=0;i weight(convert_unit_sph(weight_angle)); + optvec result(components.size()); + int pnum=0; + for(int i=0;i p(components[i]->get_num_params()); + for(int j=0;jeval(x,p)[0]*weight[i]); + ++pnum; + } + + return result; + } + + + + private: + std::string do_get_information()const + { + return ""; + } + }; +} + + + +#endif +//EOF diff --git a/misc/optvec.hpp b/misc/optvec.hpp index e52e853..7967e5c 100644 --- a/misc/optvec.hpp +++ b/misc/optvec.hpp @@ -53,7 +53,7 @@ namespace opt_utilities optvec operator+(const optvec& x1,const optvec& x2) { - optvec result(min(x1.size(),x2.size())); + optvec result(std::min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]+x2[i]; @@ -76,7 +76,7 @@ namespace opt_utilities template optvec& operator+=(optvec& x1,const optvec& x2) { - for(size_t i=0;i!=min(x1.size(),x2.size());++i) + for(size_t i=0;i!=std::min(x1.size(),x2.size());++i) { x1[i]+=x2[i]; } @@ -87,7 +87,7 @@ namespace opt_utilities optvec operator-(const optvec& x1,const optvec& x2) { - optvec result(min(x1.size(),x2.size())); + optvec result(std::min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]-x2[i]; @@ -123,7 +123,7 @@ namespace opt_utilities template optvec& operator-=(optvec& x1,const optvec& x2) { - for(size_t i=0;i!=min(x1.size(),x2.size());++i) + for(size_t i=0;i!=std::min(x1.size(),x2.size());++i) { x1[i]-=x2[i]; } @@ -134,7 +134,7 @@ namespace opt_utilities optvec operator*(const optvec& x1,const optvec& x2) { - optvec result(min(x1.size(),x2.size())); + optvec result(std::min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]*x2[i]; @@ -170,7 +170,7 @@ namespace opt_utilities template optvec& operator*=(optvec& x1,const optvec& x2) { - for(size_t i=0;i!=min(x1.size(),x2.size());++i) + for(size_t i=0;i!=std::min(x1.size(),x2.size());++i) { x1[i]*=x2[i]; } @@ -192,7 +192,7 @@ namespace opt_utilities optvec operator/(const optvec& x1,const optvec& x2) { - optvec result(min(x1.size(),x2.size())); + optvec result(std::min(x1.size(),x2.size())); for(size_t i=0;i!=result.size();++i) { result[i]=x1[i]/x2.at(i); @@ -227,7 +227,7 @@ namespace opt_utilities template optvec& operator/=(optvec& x1,const optvec& x2) { - for(size_t i=0;i!=min(x1.size(),x2.size());++i) + for(size_t i=0;i!=std::min(x1.size(),x2.size());++i) { x1[i]/=x2.at(i); } @@ -258,7 +258,7 @@ namespace opt_utilities template bool operator<(const optvec& x1,const optvec& x2) { - for(size_t i=0;i!=min(x1.size(),x2.size());++i) + for(size_t i=0;i!=std::min(x1.size(),x2.size());++i) { if(x1[i]!=x2[i]) { diff --git a/statistics/kmm_stat.hpp b/statistics/kmm_stat.hpp new file mode 100644 index 0000000..0a205bd --- /dev/null +++ b/statistics/kmm_stat.hpp @@ -0,0 +1,101 @@ +/** + \file kmm_stat.hpp + \brief maximum-liklihood statistic + \author Junhua Gu + */ + +#ifndef KMM_STAT_HPP +#define KMM_STAT_HPP +#define OPT_HEADER +#include +#include +#include +#include +#include + + +using std::cout;using std::endl; +namespace opt_utilities +{ + + /** + \brief c-statistic, max-likelihood method + \tparam Ty the return type of model + \tparam Tx the type of the self-var + \tparam Tp the type of model parameter + \tparam Ts the type of the statistic + \tparam Tstr the type of the string used + */ + template + class kmm_stat + :public statistic,optvec,optvec,Ts,Tstr> + { + private: + bool verb; + int n; + public: + kmm_stat() + :verb(true) + {} + + void verbose(bool v) + { + verb=v; + } + + const char* do_get_type_name()const + { + return "kmm likelihood"; + } + + public: + + statistic,optvec,optvec,Ts,Tstr>* do_clone()const + { + // return const_cast*>(this); + return new kmm_stat(*this); + } + + Ts do_eval(const optvec& p) + { + Ts result(0); + + kmm_component* kmm= + dynamic_cast* >(&const_cast,optvec,optvec,std::string>&>(this->get_fitter().get_model())); + + if(kmm==0) + { + throw opt_exception("model is not a kmm component"); + } + + for(int i=(this->get_data_set()).size()-1;i>=0;--i) + { + optvec unsummed_possibility(kmm->eval_unsumed(this->get_data_set().get_data(i).get_x(),p)); + T maxp=*max_element(unsummed_possibility.begin(),unsummed_possibility.end()); + T logp=std::log(maxp); + result-=this->get_data_set().get_data(i).get_y()[0]*logp; + } + + if(verb) + { + n++; + if(n%10==0) + { + cout<<"a:"<