Определение эллипса вокруг точек данных
У меня есть вопрос / идея, которую я не знаю, как это сделать.
У меня есть точечный график X против Y
Я могу нарисовать прямоугольник, а затем выбрать все точки в.
В идеале я хочу определить эллипс, так как он лучше фиксирует форму и исключает все точки, находящиеся за ее пределами.
Как это сделать? это вообще возможно? Я нарисовал сюжет используя matplotlib.
Я использовал линейную регрессию (LR), чтобы соответствовать точкам, но это не совсем то, что я ищу. Я хочу определить ПРИМЕРНО эллипс, чтобы охватить как можно больше точек внутри него, а затем исключить точки за его пределами. Как я могу определить уравнение / код, чтобы выбрать те, которые внутри?
1 ответ
Если у вас есть структура данных, представленная на графике, вы можете сделать это с помощью функции и понимания списка.
Если у вас есть данные в списке, как это:
# Made up data
lst = [
# First element is X, second is Y.
(0,0),
(92,20),
(10,0),
(13,40),
(27,31),
(.5,.5),
]
def shape_bounds(x):
"""
Function that returns lower and upper bounds for y based on x
Using a circle as an example here.
"""
r = 4
# A circle is x**2 + y**2 = r**2, r = radius
if -r <= x <= r:
y = sqrt(r**2-x**2)
return -y, y
else:
return 1, -1 # Remember, returns lower, upper.
# This will fail any lower < x < upper test.
def in_shape(elt):
"""
Unpacks a pair and tests if y is inside the shape bounds given by x
"""
x, y = elt
lower_bound, upper_bound = shape_bounds(x)
if lower_bound < y < upper_bound:
return True
else:
return False
# Demo walkthrough
for elt in lst:
x, y = elt
print x, y
lower_bound, upper_bound = shape_bounds(x)
if lower_bound < y < upper_bound:
print "X: {0}, Y: {1} is in the circle".format(x, y)
# New list of only points inside the shape
new_lst = [x for x in lst if in_shape(x)]
Что касается эллипса, попробуйте изменить уравнение формы на основе этого