123 std::vector<std::pair<double, double> >
ransac(
124 const std::vector<std::pair<double, double> >& pairs,
129 bool relative_d =
false)
134 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."));
135 d = pairs.size() * d / 100;
140 if (pairs.size() <= n)
143 String(
"RANSAC: Number of total data points (") +
String(pairs.size()) +
") must be larger than number of initial points (n=" +
String(n) +
").");
148 std::vector< std::pair<double, double> > alsoinliers, betterdata, bestdata;
149 std::vector<std::pair<double, double> > pairs_shuffled = pairs;
150 double besterror = std::numeric_limits<double>::max();
151 typename TModelType::ModelParameters coeff;
153 std::pair<double, double > bestcoeff;
154 double betterrsq = 0;
158 for (
size_t ransac_int=0; ransac_int<k; ransac_int++)
161 if (bestdata.size() == pairs.size())
break;
169 coeff = model.rm_fit(pairs_shuffled.begin(), pairs_shuffled.begin()+n);
176 alsoinliers = model.rm_inliers(pairs_shuffled.begin()+n, pairs_shuffled.end(), coeff, t);
178 if (alsoinliers.size() > d
179 || alsoinliers.size() >= (pairs_shuffled.size()-n))
182 std::copy( pairs_shuffled.begin(), pairs_shuffled.begin()+n, back_inserter(betterdata) );
183 betterdata.insert( betterdata.end(), alsoinliers.begin(), alsoinliers.end() );
184 typename TModelType::ModelParameters bettercoeff = model.rm_fit(betterdata.begin(), betterdata.end());
185 double bettererror = model.rm_rss(betterdata.begin(), betterdata.end(), bettercoeff);
187 betterrsq = model.rm_rsq(betterdata);
194 if (betterdata.size() > bestdata.size() || (betterdata.size() == bestdata.size() && (bettererror < besterror)))
196 besterror = bettererror;
197 bestdata = betterdata;
199 bestcoeff = bettercoeff;
201 std::cout <<
"RANSAC " << ransac_int <<
": Points: " << betterdata.size() <<
" RSQ: " << bestrsq <<
" Error: " << besterror <<
" c0: " << bestcoeff.first <<
" c1: " << bestcoeff.second << std::endl;
208 std::cout <<
"=======STARTPOINTS=======" << std::endl;
209 for (std::vector<std::pair<double, double> >::iterator it = bestdata.begin(); it != bestdata.end(); ++it)
211 std::cout << it->first <<
"\t" << it->second << std::endl;
213 std::cout <<
"=======ENDPOINTS=======" << std::endl;