2014-11-19 2 views
1

У меня есть CSV около 400 000 «забитых» строк, где я обновляю счет, чтобы быть линейным распределением от 1 до 10, округленным до 5 десятичных знаков. (Итак, сверху, столбец [0] равен 10, 9.999997, 9.999995 и т. Д.)Случайное распределение, чтобы соответствовать среднему питону

Я хочу создать сценарий, чтобы вытащить X строк средней оценки Y из списка.

Мое ожидание - это что-то вроде кривой колокола. Это может быть неудобно/невозможно при низких или высоких значениях X и/или Y, но если я выдержу 10 000 строк среднего балла 7, должно быть «немного» при очень низких баллах и достаточно очков, чтобы сгладить распределение.

Моя первая мысль состояла в том, чтобы загрузить значения строки [0] в список чисел, заставить приближенное число к номеру к цели 7, заполняя числа в другой список, а затем используя этот список для вернитесь через CSV и если строка [0] находится в списке output_list, out_writer ([row]). Но моя догадка поэтапная математика, вероятно, очень неэффективна, и я не знаю, какие библиотеки могут мне помочь.

ввода выглядит следующим образом:

Score  Name 
10.0  foo 
9.99997 bar 
9.99995 stuff 
9.99992 thing 
9.9999 other 

т.д.

Я хочу, чтобы иметь возможность вводить большой переменной X и Y счет и выводить CSV из X строк из входного файла таким образом, что их среднее значение равно Y. Конечно, нетривиально (в противном случае я мог бы просто получить строки X/2 по обе стороны от оценки цели из входного файла!) - предпочтительным было бы более широкое распространение.

В идеале я бы нашел решение, позволяющее использовать асимметричные распределения. Например, если бы я хотел, чтобы 100 чисел составляли в среднем 9,0, я ожидал бы около двадцати чисел выше 9,0, чтобы встретить 1,0. Конечно, это может стать беспорядочным, но я также ожидаю, что 1.0 будет 1/20 по вероятности.

+0

Можете ли вы создать небольшой образец ввода и пример вывода для этого упражнения? Я предполагаю, что есть какой-то способ просто «магии» этого в numpy, но я вообще не знаком с ним. –

+1

Возможно, что-то вроде ['numpy.random.normal'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html). Нарисуйте произвольные выборки и возьмите ближайший из своего набора данных. –

+0

Это похоже на то, что я хочу. У меня нет минимума и макс - я беспокоюсь, что он всегда будет рисовать симметричные кривые. Так что, если я хочу в среднем 7, я буду отрывать все до 4? (Стандартное отклонение (10-X)/3, заканчивающееся на + -3,0 за 4 - 10?) Как мне адаптировать numpy.random.normal к моим потребностям? – Xodarap777

ответ

1

Найдено scipy.stats.truncnorm, похоже, что это соответствовало бы счету. Написав небольшую обертку, чтобы преобразовать ее из стандартной нормальной кривой, и она работает достаточно хорошо.

from scipy.stats import truncnorm 

def my_norm(start, end, mean=0, sdev=1, size=None): 
    a = (start - mean)/sdev 
    b = (end - mean)/sdev 
    rv = truncnorm(a, b) 
    return rv.rvs(size)*sdev + mean 

Играйте со стандартными отклонениями (sdev) немного. 1/3 расстояние от ближайшего края кажется, что это будет безопасная ставка (т. Е. Если Y == 8, то sdev = (10-8)/3).

+0

Это работает. Легко выбегать из коробки и очень быстро. В идеале я бы нашел решение, позволяющее использовать асимметричные распределения. Например, если бы я хотел, чтобы 100 чисел составляли в среднем 9,0, я ожидал бы около двадцати чисел выше 9,0, чтобы встретить 1,0. Конечно, это может стать беспорядочным, но я также ожидаю, что 1.0 будет 1/20 по вероятности. – Xodarap777

Смежные вопросы