Причина этого в том, что в ваших наблюдениях гораздо больше единиц, чем 768. Таким образом, даже если -1 не совсем равно 1, оно получает высокое прогнозируемое значение, потому что гистограмма имеет гораздо большее значение при 1, чем при 768.
С точностью до мультипликативной константы формула для прогнозирования выглядит следующим образом:
![введите здесь описание изображения](https://i.stack.imgur.com/EMAGM.gif)
где K — ваше ядро, D — ваши наблюдения, а h — пропускная способность. Глядя на документ для gaussian_kde
, мы обратите внимание, что если для bw_method
не указано значение, оно каким-то образом оценивается, что здесь вас не устраивает.
Таким образом, вы можете попробовать несколько разных значений: чем больше пропускная способность, тем больше точек, удаленных от ваших новых данных, учитывается, предельный случай — это почти постоянная прогнозируемая функция.
С другой стороны, очень маленькая пропускная способность учитывает только очень близкие точки, а это то, что вам нужно.
Несколько графиков, иллюстрирующих влияние пропускной способности: ![введите здесь описание изображения](https://i.stack .imgur.com/bwOsM.png)
Используемый код:
import matplotlib.pyplot as plt
f, axarr = plt.subplots(2, 2, figsize=(10, 10))
for i, h in enumerate([0.01, 0.1, 1, 5]):
my_pdf = gaussian_kde(osservazioni, h)
axarr[i//2, i%2].plot(x, my_pdf(x), 'r') # distribution function
axarr[i//2, i%2].set_title("Bandwidth: {0}".format(h))
axarr[i//2, i%2].hist(osservazioni, normed=1, alpha=.3) # histogram
С вашим текущим кодом для x=-1 значение K((x-x_i)/h) для всех x_i, равных 1, меньше 1, но вы суммируете много этих значений (есть 921 1 с в ваших наблюдениях, а также 357 2 с)
С другой стороны, для x = 768 значение ядра равно 1 для всех x_i, равных 768, но таких точек не так много (39, если быть точным). Так что здесь множество «маленьких» терминов составляют большую сумму, чем небольшое количество более крупных терминов.
Если вы не хотите такого поведения, вы можете уменьшить размер вашего гауссовского ядра: таким образом штраф (K (-2)), выплачиваемый из-за расстояния между -1 и 1, будет выше. Но я думаю, что это было бы переобучением ваших наблюдений.
Формула для определения того, является ли новая выборка приемлемой (по сравнению с вашим эмпирическим распределением) или нет, является скорее статистической проблемой, вы можете взглянуть на stats.stackexchange.com
Вы всегда можете попытаться использовать низкое значение для полосы пропускания, что даст вам прогнозируемую функцию с пиком. Затем вы можете нормализовать эту функцию, разделив ее на максимальное значение.
После этого все предсказанные значения будут между 0 и 1:
maxDensityValue = np.max(my_pdf(x))
for e in new_values:
print("{0} {1}".format(e, my_pdf(e)/maxDensityValue))
person
P. Camilleri
schedule
21.08.2015