Skip to content

Instantly share code, notes, and snippets.

@aafaqin
Forked from geohot/ransac_polyfit.py
Created March 17, 2021 10:05
Show Gist options
  • Save aafaqin/bb81094840144b08936269a5f04960db to your computer and use it in GitHub Desktop.
Save aafaqin/bb81094840144b08936269a5f04960db 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment