1 """RANSAC estimation."""
10 def initial_estimate(data):
11 return random.sample(data, 2)
13 def points_to_line((x1, y1), (x2, y2)):
14 return (y2 - y1, x1 - x2, x2 * y1 - x1 * y2)
16 def filter_near(data, line, distance):
18 dst = lambda (x, y): abs(a * x + b * y + c) / sqrt(a*a+b*b)
19 is_near = lambda p: dst(p) <= distance
20 return [p for p in data if is_near(p)]
22 def least_squares(data):
23 x = NP.matrix([(a, 1) for (a, b) in data])
25 y = NP.matrix([[b] for (a, b) in data])
26 [a,c] = NP.dot(NP.linalg.inv(NP.dot(xt, x)), xt).dot(y).flat
31 return points_to_line(*data)
33 return least_squares(data)
35 def iterate(data, distance):
37 consensual = initial_estimate(data)
38 while (len(consensual) > consensus):
39 consensus = len(consensual)
40 model = get_model(consensual)
41 consensual = filter_near(data, model, distance)
42 return consensus, model, consensual
44 def estimate(data, dist, k):
48 for i in xrange(0, k):
49 new, new_model, new_consensual = iterate(data, dist)
53 consensual = new_consensual
55 return model, consensual
57 def ransac_duo(data, dist, k, mk):
60 model, cons = estimate(set(data) - set(cons), dist, k)
61 return (model, cons), estimate(set(data) - set(cons), dist, k)