1#ifndef FSTMODELMULTINOM_H
2#define FSTMODELMULTINOM_H
119template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
120class Model_Multinomial :
public Model<SUBSET,DATAACCESSOR> {
171 const std::unique_ptr<REALTYPE[]>&
get_IB()
const {
return _IB;}
172 const std::unique_ptr<REALTYPE[]>&
get_MI()
const {
return _MI;}
189 std::unique_ptr<REALTYPE[]>
_Pc;
191 std::unique_ptr<REALTYPE[]>
_Pv;
192 std::unique_ptr<REALTYPE[]>
_MI;
193 std::unique_ptr<REALTYPE[]>
_IB;
206template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
207Model_Multinomial<DATATYPE,REALTYPE,IDXTYPE,DIMTYPE,SUBSET,DATAACCESSOR>::Model_Multinomial(
const Model_Multinomial& mm) :
208 Model<SUBSET,DATAACCESSOR>(mm),
216 notify(
"Model_Multinomial copy-constructor.");
227 _Pv.reset(
new REALTYPE[
_n_max]); memcpy((
void *)
_Pv.get(),(
void *)(mm.
_Pv).get(),
sizeof(REALTYPE)*
_n_max);
228 _MI.reset(
new REALTYPE[
_n_max]); memcpy((
void *)
_MI.get(),(
void *)(mm.
_MI).get(),
sizeof(REALTYPE)*
_n_max);
229 _IB.reset(
new REALTYPE[
_n_max]); memcpy((
void *)
_IB.get(),(
void *)(mm.
_IB).get(),
sizeof(REALTYPE)*
_n_max);
237template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
241 assert(da->getNoOfClasses()>0);
242 assert(da->getNoOfFeatures()>0);
243 PSubset fullset(
new SUBSET(da->getNoOfFeatures()));
244 fullset->select_all();
246 {std::ostringstream sos; sos <<
"fullset = "<< *fullset << std::endl;
syncout::print(std::cout,sos);}
251template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
255 {std::ostringstream sos; sos <<
"Model_Multinomial::learn():"<<std::endl;
syncout::print(std::cout,sos);}
258 assert(da->getNoOfClasses()>0);
259 assert(da->getNoOfFeatures()>0);
260 assert(sub->get_n_raw()==da->getNoOfFeatures());
280 IDXTYPE _classsizesum=da->getClassSizeSum();
281 assert(_classsizesum>0);
282 if(_classsizesum==0)
throw FST::fst_error(
"Model_Multinomial::learn: zero _classsizesum");
283 for(DIMTYPE c=0;c<
_classes;c++)
_Pc[c]=(REALTYPE)da->getClassSize(c)/(REALTYPE)_classsizesum;
288 for(DIMTYPE f : sub->selected_features()) {
_learn_index[fi++]=f;}
293 std::ostringstream sos; sos <<
"_Pc:"<<std::endl;
294 for(DIMTYPE c=0;c<
_classes;c++) sos <<
_Pc[c] <<
" ";
301 DATATYPE total_sum_length=0;
307 if(total_sum_length==0) {
312 DATATYPE class_sum_length=0;
314 _Pc_d[c]=(REALTYPE)class_sum_length/(REALTYPE)total_sum_length;
320template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
326 typename DATAACCESSOR::PPattern p;
328 assert(da->getSplitIndex()>0);
330 DIMTYPE _features=da->getNoOfFeatures();
334 for(
const auto &blk : da->blocks(
TRAIN)) { p=blk.data; cnt=blk.size;
335 for(IDXTYPE i=0;i<cnt;i++) {
344 std::ostringstream sos; sos <<
"_Nsuminclass:"<<std::endl;
345 for(DIMTYPE c=0;c<
_classes;c++) {
for(DIMTYPE f=0;f<
_n;f++) sos <<
_Nsuminclass[(std::size_t)c*
_n+f] <<
" "; sos << std::endl;}
351template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
361 DATATYPE total_sum_length=0;
362 std::size_t wCV=0, wCd=0;
364 DATATYPE class_sum_length=0;
366 total_sum_length+=class_sum_length;
367 for(DIMTYPE f=0;f<
_d;f++) {
379 std::ostringstream sos; sos <<
"_theta:"<<std::endl;
382 for(DIMTYPE f=0;f<
_d;f++) {tmp+=
_theta[(std::size_t)c*
_d+f]; sos <<
_theta[(std::size_t)c*
_d+f] <<
" "; sos << std::endl;}
383 sos <<
"theta sum over class<"<<c<<
">: "<<tmp<<std::endl;
385 sos <<
"total_sum_length="<<total_sum_length<<
", doc_avg_length="<<
_doc_avg_length<<std::endl;
391template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
396 assert(sub->get_n_raw()==
_n);
397 assert(sub->get_d_raw()>0);
399 for(DIMTYPE f : sub->selected_features())
_index[
_d++]=f;
403template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
407 for(DIMTYPE i=0;i<
_n;i++)
_index[i]=i;
411template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
436 for(DIMTYPE f=0;f<
_n;f++) {
445 if(joint>0.0)
_MI[f]+=joint*(REALTYPE)log(
_theta[wCV+f]/
_Pv[f]);
452 std::ostringstream sos; sos <<
"_MI:"<<std::endl;
453 for(DIMTYPE f=0;f<
_n;f++) sos <<
_MI[f] <<
" ";
460template<
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
476 for(DIMTYPE f=0;f<
_n;f++)
_IB[f]=0.0;
477 std::size_t wCV1,wCV2;
479 REALTYPE _thetasum, value;
480 for(DIMTYPE f=0;f<
_n;f++) {
483 for(DIMTYPE c1=0;c1<
_classes;c1++) {
485 for(DIMTYPE c2=c1+1;c2<
_classes;c2++) {
488 {std::ostringstream sos; sos << _thetasum<< std::endl;
syncout::print(std::cout,sos);}
497 if(combs==0)
throw FST::fst_error(
"Model_Multinomial::compute_IB: division by zero combs");
498 _IB[f]=value/(REALTYPE)combs;
502 std::ostringstream sos; sos <<
"_IB:"<<std::endl;
503 for(DIMTYPE f=0;f<
_n;f++) sos <<
_IB[f] <<
" ";
Implements Naive-like Bayes classifier based on multinomial model.
Definition classifier_multinom_naivebayes.hpp:113
Implements Bhattacharyya distance based on multinomial model to serve as feature selection criterion.
Definition criterion_multinom_bhattacharyya.hpp:100
Implements individual Mutual Information based on multinomial model to serve as feature selection cri...
Definition criterion_multinom_bhattacharyya.hpp:224
Multinomial ("bag of words") model: per-class term-count sums and the Laplace-smoothed term probabili...
Definition model_multinom.hpp:120
DIMTYPE get_d() const
dimensionality currently exposed (post narrow_to()/denarrow())
Definition model_multinom.hpp:159
DIMTYPE _n_max
allocated buffer capacity (dimensionality upper bound); see the NOTE above
Definition model_multinom.hpp:182
std::shared_ptr< SUBSET > PSubset
shared pointer to a feature subset, as consumed by learn()/narrow_to()
Definition model_multinom.hpp:123
void compute_Nsuminclass(PDataAccessor da)
Sums raw per-class, per-(learn-subspace)-feature term counts into _Nsuminclass and sets _allpatterns....
Definition model_multinom.hpp:321
std::unique_ptr< REALTYPE[]> _MI
per-feature (full _n-length) Mutual Information scores, filled by compute_MI()
Definition model_multinom.hpp:192
void compute_IB()
Computes per-feature "Individual Bhattacharyya" (fills _IB, full _n-length): the class-pair-averaged ...
Definition model_multinom.hpp:461
std::unique_ptr< DIMTYPE[]> _index
maps feature subset indexes to raw (full set) feature indexes, used for narrow()ing
Definition model_multinom.hpp:197
void compute_theta()
Computes the Laplace-smoothed term-conditional probabilities _theta = P(feature|class) and _doc_avg_l...
Definition model_multinom.hpp:352
REALTYPE _doc_avg_length
average total term length per training pattern; computed in compute_theta(), needed by compute_IB()
Definition model_multinom.hpp:200
void narrow_to(const PSubset sub) override
Definition model_multinom.hpp:392
std::unique_ptr< REALTYPE[]> _Pv
per-feature marginal term probability scratch, used internally by compute_MI()
Definition model_multinom.hpp:191
REALTYPE get_doc_avg_length() const
average total term length per training pattern; valid after compute_theta()
Definition model_multinom.hpp:162
std::unique_ptr< REALTYPE[]> _Pc
per-class prior P(class), estimated in learn() from da->getClassSize()/getClassSizeSum()
Definition model_multinom.hpp:189
DIMTYPE get_n() const
"full feature set" dimensionality the model was learned at
Definition model_multinom.hpp:158
std::unique_ptr< REALTYPE[]> _theta
P(term|class), Laplace-smoothed; class-major, stride = the _d in effect at the last compute_theta() c...
Definition model_multinom.hpp:188
void denarrow() override
Undoes narrow_to(): model access reverts to the full dimensionality it was learned at.
Definition model_multinom.hpp:404
std::shared_ptr< DATAACCESSOR > PDataAccessor
shared pointer to the data accessor supplying train blocks
Definition model_multinom.hpp:122
DIMTYPE get_n_max() const
allocated buffer capacity (dimensionality upper bound)
Definition model_multinom.hpp:157
const std::unique_ptr< REALTYPE[]> & get_MI() const
raw per-feature Mutual Information buffer (full _n length), valid after compute_MI()
Definition model_multinom.hpp:172
DIMTYPE _d
"virtual subset" dimensionality currently exposed (<=_n), via narrow_to()/denarrow()
Definition model_multinom.hpp:195
std::unique_ptr< DATATYPE[]> _Nsuminclass
per-class, per-learn-subspace-feature raw term-count sums (class-major, stride _n); filled by compute...
Definition model_multinom.hpp:187
void compute_MI()
Computes per-feature Mutual Information (fills _MI, full _n-length).
Definition model_multinom.hpp:412
std::unique_ptr< DIMTYPE[]> _learn_index
maps the to-be-learned model's subspace positions to raw (full-set) feature indices; set by learn(da,...
Definition model_multinom.hpp:203
REALTYPE get_Pc(const DIMTYPE c) const
class prior P(class=c), estimated in learn() from class sizes
Definition model_multinom.hpp:165
DIMTYPE get_classes() const
number of classes, as set by the last learn() call
Definition model_multinom.hpp:160
std::unique_ptr< REALTYPE[]> _IB
per-feature (full _n-length) Individual Bhattacharyya scores, filled by compute_IB()
Definition model_multinom.hpp:193
DIMTYPE _classes
number of classes; initialized in learn(). NOTE: expressions like _classes*_n*_n are evaluated in std...
Definition model_multinom.hpp:174
DIMTYPE _n
Definition model_multinom.hpp:183
std::unique_ptr< REALTYPE[]> _Pc_d
per-class share of total learn-subspace term length; computed in learn(), consumed by compute_MI()/co...
Definition model_multinom.hpp:190
const std::unique_ptr< REALTYPE[]> & get_theta() const
raw P(term|class) buffer, class-major, valid at the dimensionality last passed to compute_theta()
Definition model_multinom.hpp:170
IDXTYPE _allpatterns
total training pattern count summed over all classes; set by compute_Nsuminclass() (called from learn...
Definition model_multinom.hpp:199
const std::unique_ptr< REALTYPE[]> & get_IB() const
raw per-feature Individual Bhattacharyya buffer (full _n length), valid after compute_IB()
Definition model_multinom.hpp:171
virtual void learn(PDataAccessor da) override
Fits the model's parameters from da's training data, over all its features. Concrete models may addit...
Definition model_multinom.hpp:238
FST4 specific error passing class.
Definition error.hpp:61
static void print(std::ostream &os, std::ostringstream &sos)
Writes sos's buffered content to os, serializing concurrent writers under FST_THREADED via a shared m...
Definition global.hpp:86
FST4 specific error passing class.
Matrix representation and operations, allows operation in selected subspace.
Vector representation and operations, allows operation in selected subspace.
Defines interface for data model implementations.
The Feature Selection Toolbox 4 library: every library component – data access, criteria and classifi...
Definition data_accessor.hpp:80
void notify(const std::string msg)
Prints msg followed by a newline via syncout::print(); a no-op unless the preprocessor macro DEBUG is...
Definition global.hpp:112
@ TRAIN
the split's training part
Definition data_accessor.hpp:85