Взять образцы из KDE на основе эмпирических данных (для расчета энтропии) - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь вычислить энтропию (scipy.stats.entropy) между двумя массивами числовых значений, чтобы количественно определить разницу их базовых распределений.

Поскольку для расчета энтропии требуется, чтобы оба входа имели одинаковую форму, я хочу оценить распределение меньшего списка с помощью KDE для выборки новых данных из него.

Работа с входами от 0 до1e-02 Я не могу нарисовать правдоподобные числа из встроенного KDE?

emp_values = np.array([0.000618, 0.000425, 0.000597, 0.000528, 0.000393, 0.000721,
   0.000674, 0.000703, 0.000632, 0.000383, 0.000466, 0.000919,
   0.001419, 0.00063 , 0.000433, 0.000516, 0.001419, 0.000655,
   0.000674, 0.000676, 0.000694, 0.000396, 0.000688, 0.00061 ,
   0.000687, 0.000633, 0.000601, 0.00061 , 0.000747, 0.000356,
   0.000824, 0.000931, 0.000691, 0.000907, 0.000553, 0.000748,
   0.000828, 0.000907, 0.000457, 0.000494])
kde_emp = KernelDensity().fit(emp_values.reshape(-1, 1))

Использование KDE.sample для рисования случайных чисел приводит к тому, что значения полностью выходят за пределы диапазона?

kde_emp.sample(10)
array([[-3.0811253 ],
   [ 1.24822136],
   [ 0.07815318],
   [ 0.01609681],
   [-0.59676707],
   [-0.89988083],
   [-0.59071966],
   [-0.72741754],
   [ 0.82296101],
   [ 0.08329316]])

ЧтоТогда будет ли уместным способом нарисовать 10.000 случайных выборок из подобранного PDF?

1 Ответ

0 голосов
/ 03 ноября 2019

bandwidth KDE по умолчанию равно 1, что слишком велико. попробуйте использовать что-то вроде этого:

kde_emp = KernelDensity(bandwidth=5e-5)
kde_emp.fit(emp_values.reshape(-1, 1))

, чтобы установить пропускную способность для чего-то более чувствительного для этих данных. страница википедии говорит о том, что означает пропускная способность

Я не очень хорошо знаю scikit-learn, но , похоже, нет какого-либо хорошего способа оценкиэто значение автоматически в нем. то есть вам нужно было бы написать свой собственный оценщик (~ 5-10 строк кода)

, который сказал, что если вы только после гауссовского KDE, то у SciPy есть тот, который оценивает пропускную способность для вас. см scipy.stats.gaussian_kde. обратите внимание, что оценщик scipy предполагает, что данные являются унимодальными (как и большинство), тогда как ваши данные, конечно, нет, поэтому вам потребуется меньшее значение пропускной способности

...