{{ message }}

Instantly share code, notes, and snippets.

# geohot/ransac_polyfit.py

Last active Mar 17, 2021
RANSAC polyfit. Fit polynomials with RANSAC in Python
 def ransac_polyfit(x, y, order=3, n=20, k=100, t=0.1, d=100, f=0.8): # Thanks https://en.wikipedia.org/wiki/Random_sample_consensus # n – minimum number of data points required to fit the model # k – maximum number of iterations allowed in the algorithm # t – threshold value to determine when a data point fits a model # d – number of close data points required to assert that a model fits well to data # f – fraction of close data points required besterr = np.inf bestfit = None for kk in xrange(k): maybeinliers = np.random.randint(len(x), size=n) maybemodel = np.polyfit(x[maybeinliers], y[maybeinliers], order) alsoinliers = np.abs(np.polyval(maybemodel, x)-y) < t if sum(alsoinliers) > d and sum(alsoinliers) > len(x)*f: bettermodel = np.polyfit(x[alsoinliers], y[alsoinliers], order) thiserr = np.sum(np.abs(np.polyval(bettermodel, x[alsoinliers])-y[alsoinliers])) if thiserr < besterr: bestfit = bettermodel besterr = thiserr return bestfit

### arielisrael commented Mar 31, 2020

 does x[maybeinliers] work for you? I got: TypeError: only integer scalar arrays can be converted to a scalar index Needed to create lists of x and y values through list comprehension to use instead of x[maybeinliers] and y[maybeinliers]