Генерация случайных данных на основе существующих данных

есть ли способ в python генерировать случайные данные на основе распределения уже существующих данных?

Вот статистические параметры моего набора данных:

Data
count   209.000000
mean    1.280144
std     0.374602
min     0.880000
25%     1.060000
50%     1.150000
75%     1.400000
max     4.140000

поскольку это не нормальное распределение, это невозможно сделать с помощью np.random.normal. Любые идеи?

Распространение

Спасибо.

Изменить: Выполнение KDE:

from sklearn.neighbors import KernelDensity
# Gaussian KDE
kde = KernelDensity(kernel='gaussian', bandwidth=0.525566).fit(data['y'].to_numpy().reshape(-1, 1))
sns.distplot(kde.sample(2400))

КДЕ


person qwertz    schedule 18.03.2020    source источник
comment
Взгляните на статистику. .stackexchange.com/questions/215938/ также towardsdatascience.com/   -  person Vishnudev    schedule 18.03.2020
comment
У вас есть 2 варианта. (1) определить распределение (хи-квадрат?) и сгенерировать его. (2) Сделайте box cox, создайте нормальный, а затем выполните reverse   -  person Sergey Bushmanov    schedule 18.03.2020
comment
для варианта (1): это также может быть вейбулл. как я могу быть в этом уверен?. Сначала попробую вариант (2). ты   -  person qwertz    schedule 18.03.2020


Ответы (1)


В общем, реальные данные не совсем соответствуют «хорошему» распределению, подобно нормальному распределению или распределению Вейбулла.

Как и в случае с машинным обучением, выборка из распределения точек данных обычно состоит из двух шагов:

  • Подогнать модель данных к данным.

  • Затем прогнозируйте новую точку данных на основе этой модели с помощью случайности.

Есть несколько способов оценить распределение данных и выборки по этой оценке:

  • Оценка плотности ядра.
  • Модели гауссовской смеси.
  • Гистограммы.
  • Регрессионные модели.
  • Другие модели машинного обучения.

Кроме того, такие методы, как оценка по максимальному правдоподобию, позволяют подогнать известное распределение (например, нормальное распределение) к данным, но оценочное распределение, как правило, более грубое, чем при оценке плотности ядра или другом машинном обучении. модели.

См. также мой раздел "Случайные числа из распределения точек данных".

person Peter O.    schedule 18.03.2020
comment
Но как мне выполнить регрессионную модель для одного параметра? - person qwertz; 18.03.2020
comment
Модели регрессии применяются к входным и выходным данным (например, к данным о продажах за определенный месяц), а это не те данные, которые вы здесь показали. Для вашей проблемы игнорируйте советы по регрессионным моделям. Возможно, наиболее многообещающим решением для ваших данных является оценка плотности ядра, которую scikit- учиться поддерживает. - person Peter O.; 18.03.2020
comment
но kde также нуждается в параметрах, верно? Моей подгонке нужен второй параметр, а у меня только один - person qwertz; 18.03.2020
comment
Что вы имеете в виду под параметрами? - person Peter O.; 18.03.2020
comment
Теперь я понимаю, что вы имеете в виду: для оценки плотности ядра требуется параметр полосы пропускания, который примерно соответствует стандартному отклонению точек данных. См. также этот пост в блоге, чтобы узнать, как определить этот параметр пропускной способности с помощью scikit-learn. - person Peter O.; 18.03.2020
comment
Проблема, возникающая при создании моих данных таким образом, заключается в следующем: я получаю значения ниже 1, что невозможно для физического параметра, который представляют значения. Есть ли способ установить ограничения для оценки kde? Смотрите исходный пост выше :) - person qwertz; 18.03.2020
comment
Вы можете исключить значения ниже 1 следующим образом (я не проверял это, так как не знаю, возвращает ли kde.sample массив NumPy): s = kde.sample(2400); s = s[s >= 1]. - person Peter O.; 18.03.2020