Skip to content

Instantly share code, notes, and snippets.

@ricardodeazambuja
Forked from geohot/ransac_polyfit.py
Created May 5, 2020 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ricardodeazambuja/2bbbe339c2ed581198084272b03403e2 to your computer and use it in GitHub Desktop.
Save ricardodeazambuja/2bbbe339c2ed581198084272b03403e2 to your computer and use it in GitHub Desktop.
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
@ricardodeazambuja
Copy link
Author

Maybe this could help speeding things up:
https://stackoverflow.com/a/20203966

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment