00001 #ifndef rrel_muset_obj_h_ 00002 #define rrel_muset_obj_h_ 00003 //: 00004 // \file 00005 // \author Chuck Stewart 00006 // \date Summer 2001 00007 // The MUSET (MUSE trimmed) objective function., which should be used instead of LMS. 00008 00009 #include <rrel/rrel_objective.h> 00010 00011 class rrel_muse_table; 00012 00013 enum rrel_muse_type { RREL_MUSE_TRIMMED, RREL_MUSE_TRIMMED_SQUARE, RREL_MUSE_QUANTILE }; 00014 00015 //: The MUSET (MUSE trimmed) objective function, which should be used instead of LMS. 00016 // MUSE is a robust objective function in the spirit of LMS/LTS 00017 // (least-median-of-squares / least-trimmed-squares). In fact, it 00018 // can be considered a generalization of these objective functions. 00019 // It can be used in place of them and it really SHOULD because it 00020 // (a) produces much better results, regardless of the inlier 00021 // fraction, and (b) (unlike RANSAC) can tolerate large fractions of 00022 // outliers WITHOUT prior knowledge of scale. It should be used in 00023 // combination with a random sampling search and an appropriate problem 00024 // representation. 00025 // 00026 // Rather than assuming a fixed minimum fraction of inliers and then 00027 // building an objective function based on either the order 00028 // statistics (e.g. the median) or the trimmed statistics, MUSE 00029 // ADAPTIVELY determines the inlier fraction and computes its 00030 // objective function from this inlier fraction. It does this by 00031 // converting the fitting error (residual) order statistics into 00032 // scale estimates, normalizing these, and then choosing the 00033 // smallest. The version given here is called MUSET, because it is 00034 // based on trimmed statistics. This is described in Chapter 4 of 00035 // Jim Miller's thesis. A new paper describing MUSE will be written 00036 // in the autumn of 2001. 00037 // 00038 // MUSE requires a look-up table to compute its normalizing 00039 // parameters. If it does not get one, the constructor builds it. 00040 // MUSE also requires the minimum and maximum possible inlier 00041 // fractions in the data. Usually it is safe to leave the maximum 00042 // fraction at 0.95. The minimum inlier fraction determines the 00043 // random sampling parameters, so it should be set with some care. 00044 // Setting it too low can cause a lot of unnecessary search. 00045 // Setting it too high can cause small structures to be missed. 00046 // 00047 // Finally, MUSE internally contains an additional step called sk 00048 // refinement, which increases its ability to distinguish small 00049 // scale structures. In general it is safe to use this, and the 00050 // constructor defaults to having it set. 00051 00052 class rrel_muset_obj : public rrel_objective 00053 { 00054 public: 00055 //: Constructor. 00056 // \a max_n is the size of the look-up table. 00057 rrel_muset_obj( int max_n, bool use_sk_refine=true); 00058 00059 //: Constructor with previously computed table. 00060 // \a table will be used as the look-up table. 00061 rrel_muset_obj( rrel_muse_table* table, bool use_sk_refine=true); 00062 00063 //: Destructor. 00064 ~rrel_muset_obj(); 00065 00066 //: Evaluate the objective function on heteroscedastic residuals. 00067 // \sa rrel_objective::fcn. 00068 virtual double fcn( vect_const_iter res_begin, vect_const_iter res_end, 00069 vect_const_iter /* scale is unused */, 00070 vnl_vector<double>* = 0 /* param vector is unused */ ) const; 00071 00072 //: Evaluate the objective function on homoscedastic residuals. 00073 // \sa rrel_objective::fcn. 00074 virtual double fcn( vect_const_iter begin, vect_const_iter end, 00075 double = 0 /* scale is unused */, 00076 vnl_vector<double>* = 0 /* param vector is unused */ ) const; 00077 00078 //: Computes the MUSE estimate and best value of k 00079 // \a begin and \a end give the residuals. \a objective is the 00080 // value of the objective function, \a sigma_est is an estimate 00081 // of the scale (and is the objective function), and \a best_k 00082 // is the value of k that produced the scale estimate. 00083 void internal_fcn( vect_const_iter begin, vect_const_iter end, 00084 double& sigma_est, int& best_k ) const; 00085 00086 //: False. 00087 // This MUSE estimator is based on trimmed statistics, and does not 00088 // use a scale estimate. 00089 virtual bool requires_prior_scale() const 00090 { return false; } 00091 00092 //: True, since MUSE can estimate scale. 00093 // \sa rrel_objective::can_estimate_scale. 00094 virtual bool can_estimate_scale() const { return true; } 00095 00096 //: Scale estimate. 00097 virtual double scale( vect_const_iter res_begin, vect_const_iter res_end ) const; 00098 00099 //: Set the minimum fraction of the data that are inliers. 00100 void set_min_inlier_fraction( double min_frac=0.25 ) 00101 { min_frac_ = min_frac; } 00102 00103 //: Set the maximum fraction of the data that could be inliers. 00104 void set_max_inlier_fraction( double max_frac=0.95 ) 00105 { max_frac_ = max_frac; } 00106 00107 //: The increment to use in testing different inlier/outlier fractions. 00108 void set_inlier_fraction_increment( double frac_inc=0.05 ) 00109 { frac_inc_ = frac_inc; } 00110 00111 //: The minimum fraction of the data that must be inliers. 00112 double min_inlier_fraction() const { return min_frac_; } 00113 00114 //: The maximum fraction of the data that could be inliers. 00115 double max_inlier_fraction() const { return max_frac_; } 00116 00117 //: The search step for determining the inlier/outlier fraction. 00118 double inlier_fraction_increment() const { return frac_inc_; } 00119 00120 //: Set the type of MUSE objective function 00121 void set_muse_type( rrel_muse_type t = RREL_MUSE_TRIMMED ) 00122 { muse_type_ = t; } 00123 00124 //: Access the type of MUSE objective function 00125 rrel_muse_type muse_type() const { return muse_type_; } 00126 00127 protected: 00128 bool use_sk_refine_; 00129 rrel_muse_type muse_type_; 00130 00131 bool table_owned_; 00132 rrel_muse_table* table_; 00133 double min_frac_; 00134 double max_frac_; 00135 double frac_inc_; 00136 }; 00137 00138 #endif