Go to the documentation of this file.00001
00002
00003 #ifndef vpdfl_mixture_builder_h_
00004 #define vpdfl_mixture_builder_h_
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <vpdfl/vpdfl_builder_base.h>
00019 #include <vpdfl/vpdfl_mixture_builder.h>
00020 #include <vpdfl/vpdfl_mixture.h>
00021 #include <vcl_iosfwd.h>
00022
00023
00024
00025 class vpdfl_mixture;
00026
00027
00028 class vpdfl_mixture_builder : public vpdfl_builder_base
00029 {
00030 vcl_vector<vpdfl_builder_base*> builder_;
00031 double min_var_;
00032 int max_its_;
00033 vcl_vector<vnl_vector<double> > initial_means_;
00034
00035
00036 bool weights_fixed_;
00037
00038
00039
00040 void initialise_given_means(vpdfl_mixture& model,
00041 const vnl_vector<double>* data,
00042 const vcl_vector<vnl_vector<double> >& mean,
00043 const vcl_vector<double>& wts) const;
00044
00045
00046 void initialise_to_regular_samples(vpdfl_mixture& model,
00047 const vnl_vector<double>* data,
00048 const vcl_vector<double>& wts) const;
00049
00050
00051 void initialise_diagonal(vpdfl_mixture& model,
00052 const vnl_vector<double>* data,
00053 const vcl_vector<double>& wts) const;
00054
00055
00056 void initialise(vpdfl_mixture& model,
00057 const vnl_vector<double>* data,
00058 const vcl_vector<double>& wts) const;
00059
00060
00061 void e_step(vpdfl_mixture& model,
00062 vcl_vector<vnl_vector<double> >& probs,
00063 const vnl_vector<double>* data,
00064 const vcl_vector<double>& wts) const;
00065
00066
00067 double m_step(vpdfl_mixture& model,
00068 const vcl_vector<vnl_vector<double> >& probs,
00069 const vnl_vector<double>* data,
00070 const vcl_vector<double>& wts) const;
00071
00072 void init();
00073 void delete_stuff();
00074
00075 public:
00076
00077
00078 vpdfl_mixture_builder();
00079
00080
00081 vpdfl_mixture_builder(const vpdfl_mixture_builder&);
00082
00083
00084 vpdfl_mixture_builder& operator=(const vpdfl_mixture_builder&);
00085
00086
00087 virtual ~vpdfl_mixture_builder();
00088
00089
00090
00091 void init(const vpdfl_builder_base& builder, int n);
00092
00093
00094 bool weights_fixed() const { return weights_fixed_; }
00095
00096
00097 void set_weights_fixed(bool b);
00098
00099
00100 void set_max_iterations(int n);
00101
00102
00103 int max_iterations() const { return max_its_; }
00104
00105
00106 unsigned n_builders() const { return builder_.size(); }
00107
00108
00109 vpdfl_builder_base& builder(unsigned i) { return *builder_[i]; }
00110
00111
00112 virtual vpdfl_pdf_base* new_model() const;
00113
00114
00115 virtual void set_min_var(double min_var);
00116
00117
00118 virtual double min_var() const;
00119
00120
00121
00122
00123 static void calc_mean_and_variance(vpdfl_mixture& model);
00124
00125
00126 virtual void build(vpdfl_pdf_base& model,
00127 const vnl_vector<double>& mean) const;
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 virtual void build(vpdfl_pdf_base& model,
00138 mbl_data_wrapper<vnl_vector<double> >& data) const;
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 virtual void weighted_build(vpdfl_pdf_base& model,
00149 mbl_data_wrapper<vnl_vector<double> >& data,
00150 const vcl_vector<double>& wts) const;
00151
00152
00153
00154
00155 void preset_initial_means(const vcl_vector<vnl_vector<double> >& component_means);
00156
00157
00158
00159 short version_no() const;
00160
00161
00162 virtual vcl_string is_a() const;
00163
00164
00165 virtual bool is_class(vcl_string const& s) const;
00166
00167
00168 virtual vpdfl_builder_base* clone() const;
00169
00170
00171 virtual void print_summary(vcl_ostream& os) const;
00172
00173
00174 virtual void b_write(vsl_b_ostream& bfs) const;
00175
00176
00177 virtual void b_read(vsl_b_istream& bfs);
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 virtual void config_from_stream(vcl_istream & is);
00196 };
00197
00198 #endif // vpdfl_mixture_builder_h_