2015-07-09 7 views
0

У меня есть список x значений чисел.Контур обратной связи Python для получения определенного количества точек в диапазоне около медианы

Для начала я указываю диапазон. Я хочу получить значения от x, которые лежат в этом диапазоне. Диапазон значений будет ± R из медианы x. Я хочу настроить R для получения определенного количества значений N. Единственный способ, который я вижу в достижении этого, - это какой-то цикл обратной связи. Что было бы быстрым и эффективным способом максимально приблизить к N, насколько это возможно?

например.

x = ['3','5','1','2','4'] Я хочу, чтобы диапазон значений от 3-R<3<3+R в 3 является медианой. Скажем, N = 3. Полученные значения были бы ['2','3','4'] с R работал в качестве 1.

Пример кода:

N = 3 
x = ['3','5','1','2','4'] 
R = 1 
n = some number to allow room for error 
y = values of x in range ±R from median 
while len(y) > N+n or len(y) < N-n: 
    if len(y) > N+n: 
     R -= ADJUST VALUE PROPORTIONAL TO ERROR HERE? 
    if len(y) < N-n: 
     R += ADJUST VALUE PROPORTIONAL TO ERROR HERE? 
    y = values of x in range ±R from median (update y list with new R) 

ответ

1

наивности, я попробовал бы своего рода Bolzano theorem подхода. Вы получаете медианное значение, а затем значение, которое наиболее далекое от медианного, и назовите расстояние между ними L0. Конечно, это будет включать все пункты. Затем вы делите L0 на 2 и проверьте, сколько точек находится в пределах интервала. Это слишком много или слишком мало?

  • Если слишком много, L0 = L и L = L0/2.
  • Если их слишком мало, L = (L0 + L)/2.

Таким образом, вы окажетесь в форме рекурсивно.