11 #include <OpenMS/config.h>
40 RANSACParam(
size_t p_n,
size_t p_k,
double p_t,
size_t p_d,
bool p_relative_d =
false)
45 if (
d >= 100)
throw Exception::Precondition(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
String(
"RANSAC: Relative 'd' >= 100% given. Use a lower value; the more outliers you expect, the lower it should be."));
52 r <<
"RANSAC param:\n n: " <<
n <<
"\n k: " <<
k <<
" iterations\n t: " <<
t <<
" threshold\n d: " <<
d <<
" inliers\n\n";
68 template<
typename TModelType = RansacModelLinear>
73 explicit RANSAC(uint64_t seed = time(
nullptr)):
87 std::vector<std::pair<double, double> >
ransac(
88 const std::vector<std::pair<double, double> >& pairs,
124 std::vector<std::pair<double, double> >
ransac(
125 const std::vector<std::pair<double, double> >& pairs,
130 bool relative_d =
false)
135 if (d >= 100)
throw Exception::Precondition(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
String(
"RANSAC: Relative 'd' >= 100% given. Use a lower value; the more outliers you expect, the lower it should be."));
136 d = pairs.size() * d / 100;
141 if (pairs.size() <= n)
144 String(
"RANSAC: Number of total data points (") +
String(pairs.size()) +
") must be larger than number of initial points (n=" +
String(n) +
").");
149 std::vector< std::pair<double, double> > alsoinliers, betterdata, bestdata;
150 std::vector<std::pair<double, double> > pairs_shuffled = pairs;
151 double besterror = std::numeric_limits<double>::max();
152 typename TModelType::ModelParameters coeff;
154 std::pair<double, double > bestcoeff;
155 double betterrsq = 0;
159 for (
size_t ransac_int=0; ransac_int<
k; ransac_int++)
162 if (bestdata.size() == pairs.size())
break;
170 coeff = model.rm_fit(pairs_shuffled.begin(), pairs_shuffled.begin()+n);
177 alsoinliers = model.rm_inliers(pairs_shuffled.begin()+n, pairs_shuffled.end(), coeff, t);
179 if (alsoinliers.size() > d
180 || alsoinliers.size() >= (pairs_shuffled.size()-n))
183 std::copy( pairs_shuffled.begin(), pairs_shuffled.begin()+n, back_inserter(betterdata) );
184 betterdata.insert( betterdata.end(), alsoinliers.begin(), alsoinliers.end() );
185 typename TModelType::ModelParameters bettercoeff = model.rm_fit(betterdata.begin(), betterdata.end());
186 double bettererror = model.rm_rss(betterdata.begin(), betterdata.end(), bettercoeff);
188 betterrsq = model.rm_rsq(betterdata);
195 if (betterdata.size() > bestdata.size() || (betterdata.size() == bestdata.size() && (bettererror < besterror)))
197 besterror = bettererror;
198 bestdata = betterdata;
200 bestcoeff = bettercoeff;
202 std::cout <<
"RANSAC " << ransac_int <<
": Points: " << betterdata.size() <<
" RSQ: " << bestrsq <<
" Error: " << besterror <<
" c0: " << bestcoeff.first <<
" c1: " << bestcoeff.second << std::endl;
209 std::cout <<
"=======STARTPOINTS=======" << std::endl;
210 for (std::vector<std::pair<double, double> >::iterator it = bestdata.begin(); it != bestdata.end(); ++it)
212 std::cout << it->first <<
"\t" << it->second << std::endl;
214 std::cout <<
"=======ENDPOINTS=======" << std::endl;
Precondition failed exception.
Definition: Exception.h:133
This class provides a generic implementation of the RANSAC outlier detection algorithm....
Definition: RANSAC.h:70
void setSeed(uint64_t seed)
set seed for random shuffle
Definition: RANSAC.h:81
Math::RandomShuffler shuffler_
Definition: RANSAC.h:221
std::vector< std::pair< double, double > > ransac(const std::vector< std::pair< double, double > > &pairs, size_t n, size_t k, double t, size_t d, bool relative_d=false)
This function provides a generic implementation of the RANSAC outlier detection algorithm....
Definition: RANSAC.h:124
std::vector< std::pair< double, double > > ransac(const std::vector< std::pair< double, double > > &pairs, const RANSACParam &p)
alias for ransac() with full params
Definition: RANSAC.h:87
RANSAC(uint64_t seed=time(nullptr))
Definition: RANSAC.h:73
Definition: MathFunctions.h:382
void seed(uint64_t val)
Definition: MathFunctions.h:406
void portable_random_shuffle(RandomAccessIterator first, RandomAccessIterator last)
Definition: MathFunctions.h:397
A more convenient string class.
Definition: String.h:34
const double k
Definition: Constants.h:132
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:22
A simple struct to carry all the parameters required for a RANSAC run.
Definition: RANSAC.h:33
std::string toString() const
Definition: RANSAC.h:49
size_t d
The number of close data values (according to 't') required to assert that a model fits well to data.
Definition: RANSAC.h:59
size_t n
data points: The minimum number of data points required to fit the model
Definition: RANSAC.h:56
double t
Threshold value: for determining when a data point fits a model. Corresponds to the maximal squared d...
Definition: RANSAC.h:58
size_t k
iterations: The maximum number of iterations allowed in the algorithm
Definition: RANSAC.h:57
RANSACParam(size_t p_n, size_t p_k, double p_t, size_t p_d, bool p_relative_d=false)
Full constructor.
Definition: RANSAC.h:40
bool relative_d
Should 'd' be interpreted as percentages (0-100) of data input size.
Definition: RANSAC.h:60
RANSACParam()
Default constructor.
Definition: RANSAC.h:35