Implements Bhattacharyya distance based on normal (gaussian) model to serve as feature selection criterion.
More...
|
|
typedef Criterion_Normal< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR > | parent |
| | base class: the normal-model template-method skeleton
|
|
typedef Clonable_Impl< Criterion_Normal_Bhattacharyya, parent > | parent_impl |
| | implements clone(); sharing/stateless_clone throw in Criterion
|
|
typedef std::shared_ptr< DATAACCESSOR > | PDataAccessor |
| | shared pointer to the data accessor the model is learned from
|
|
typedef std::shared_ptr< SUBSET > | PSubset |
| | shared pointer to the feature subset being evaluated
|
|
typedef std::shared_ptr< DATAACCESSOR > | PDataAccessor |
| | shared pointer to the data accessor the model is learned from
|
|
typedef std::shared_ptr< SUBSET > | PSubset |
| | shared pointer to the feature subset being evaluated
|
|
typedef std::shared_ptr< SUBSET > | PSubset |
| | shared pointer to the feature subset being evaluated
|
|
typedef std::shared_ptr< SUBSET > | PSubset |
| | shared pointer to the feature subset being evaluated
|
|
| virtual const char * | criterion_name () const override |
| | class name, used in output and error messages
|
| virtual void | allocate_buffers () override |
| | (re)allocate criterion-specific work buffers for get_n() features (use the alloc_* helpers)
|
| virtual void | update_derived_model () override |
| virtual bool | evaluate_narrowed (RETURNTYPE &result, const PSubset sub) override |
| | narrow remaining buffers to sub, redim work buffers to get_d(), compute the criterion value. On entry _model and _meandif have ALREADY been narrowed to sub by evaluate(), so the implementation sees only the d selected features; get_d() is that d, and _meandif->at(i) addresses the narrowed positions. sub is non-empty (evaluate() rejects d==0 before the call).
|
|
| Criterion_Normal (const Criterion_Normal &cn) |
| | Copy-constructor; deep-copies _model and _meandif (subclasses copy their own buffers separately).
|
|
void | alloc_vector (std::unique_ptr< Indexed_Vector< DATATYPE, DIMTYPE, SUBSET > > &v) |
| | lazy (re)allocation of a work vector for get_n() features, for use from allocate_buffers()
|
|
template<typename MATRIXVALUETYPE> |
| void | alloc_matrix (std::unique_ptr< Indexed_Matrix< MATRIXVALUETYPE, DIMTYPE, SUBSET > > &m, const bool LUstorage=false) |
| | lazy (re)allocation of a work matrix for get_n() features; LUstorage as required by Indexed_Matrix::LUdecompose() temp storage
|
|
void | set_cloned (const bool cloned=true) |
| | marks/unmarks this instance as a clone; call from clone()/stateless_clone() overrides (Clonable_Impl does this automatically)
|
|
void | set_sharing (const bool sharing=true) |
| | marks/unmarks this instance as sharing (see is_sharing())
|
|
void | set_sharing_cloned (const bool cloned=true, const bool sharing=true) |
| | sets both flags at once; call from sharing_clone() overrides (Clonable_Impl does this automatically)
|
|
| friend | parent_impl |
|
std::unique_ptr< Indexed_Matrix< DATATYPE, DIMTYPE, SUBSET > > | _cov12 |
| | (cov[0]+cov[1]), computed by update_derived_model()
|
|
std::unique_ptr< Indexed_Matrix< DATATYPE, DIMTYPE, SUBSET > > | _cov12_div2 |
| | _cov12/2, the pooled covariance whose determinant enters the Bhattacharyya distance
|
|
std::unique_ptr< Indexed_Matrix< REALTYPE, DIMTYPE, SUBSET > > | _invbuf |
| | inverse of the narrowed _cov12, used in the quadratic-form term
|
|
std::unique_ptr< Indexed_Matrix< REALTYPE, DIMTYPE, SUBSET > > | _LUtemp |
| | scratch LU-decomposition storage, reused for each matrix inversion/determinant
|
|
| Criterion_Normal< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR > * | clone () const override |
| | dispatches to the DEEP_KIND mechanism (default CLONE_DEEP: Derived's copy-constructor)
|
| Criterion_Normal< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR > * | sharing_clone () const override |
| | dispatches to the SHARING_KIND mechanism (default CLONE_INHERIT: defers to Base, which throws by family convention)
|
| Criterion_Normal< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR > * | stateless_clone () const override |
| | dispatches to the STATELESS_KIND mechanism (default CLONE_INHERIT: defers to Base, which throws by family convention)
|
| virtual bool | initialize (PDataAccessor da) |
| | template method: learn model, compute _meandif, then allocate_buffers() + update_derived_model().
|
| virtual bool | evaluate (RETURNTYPE &result, const PSubset sub) override |
| | template method: narrow model and _meandif to sub, then evaluate_narrowed()
|
| virtual bool | is_monotonic () const override |
|
DIMTYPE | get_n () const |
| | the full (raw, unnarrowed) feature count the model was learned for
|
|
DIMTYPE | get_d () const |
| | the currently active (narrowed) feature count, see evaluate()
|
| virtual std::ostream & | print (std::ostream &os) const override |
| | writes a human-readable identification of the object; base default writes nothing
|
| Criterion * | sharing_clone () const override |
| Criterion * | stateless_clone () const override |
| bool | is_clone () const |
|
bool | is_sharing () const |
| | true if this instance is a sharing_clone() result (referencing, not owning, the source's structures)
|
|
bool | is_sharing_clone () const |
| | true if this instance is BOTH a clone and sharing – i.e. specifically a sharing_clone() result, not a clone()/stateless_clone() one
|
|
std::unique_ptr< Model_Normal< DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR > > | _model |
| | the learned per-class normal (mean/covariance) model, narrowed in evaluate()
|
|
std::unique_ptr< Indexed_Vector< DATATYPE, DIMTYPE, SUBSET > > | _meandif |
| | mean[0]-mean[1], shared by all two-class normal criteria
|
template<class RETURNTYPE, typename DATATYPE, typename REALTYPE, typename IDXTYPE, typename DIMTYPE, class SUBSET, class DATAACCESSOR>
class FST::Criterion_Normal_Bhattacharyya< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR >
Implements Bhattacharyya distance based on normal (gaussian) model to serve as feature selection criterion.
For the two classes modelled as Gaussians (mu0,S0) and (mu1,S1) restricted to the d selected features, with m = mu0-mu1 and S = (S0+S1)/2, the value returned is
B = 1/8 * m^T S^-1 m + 1/2 * ln( det(S) / sqrt(det(S0)*det(S1)) )
i.e. the standard Bhattacharyya distance between two normal distributions: a mean-separation term plus a covariance-dissimilarity term. Higher is better, the value is non-negative and grows with subset size (monotonic w.r.t. cardinality, hence usable with Branch & Bound). evaluate_narrowed() computes the first term equivalently as 0.25 * m^T (S0+S1)^-1 m, which saves halving the summed covariance for the inversion.
- Note
- Defined for two-class problems only
-
Requires non-singular per-class covariances on the evaluated subset - see the remark in evaluate_narrowed()
- Examples
- demo55.cpp.
template<class RETURNTYPE, typename DATATYPE, typename REALTYPE, typename IDXTYPE, typename DIMTYPE, class SUBSET, class DATAACCESSOR>
narrow remaining buffers to sub, redim work buffers to get_d(), compute the criterion value. On entry _model and _meandif have ALREADY been narrowed to sub by evaluate(), so the implementation sees only the d selected features; get_d() is that d, and _meandif->at(i) addresses the narrowed positions. sub is non-empty (evaluate() rejects d==0 before the call).
Implements FST::Criterion_Normal< RETURNTYPE, DATATYPE, REALTYPE, IDXTYPE, DIMTYPE, SUBSET, DATAACCESSOR >.