Я хочу получить оценку плотности ядра для положительных точек данных. Используя пакет Python Scipy Stats, я разработал следующий код.
def get_pdf(data):
a = np.array(data)
ag = st.gaussian_kde(a)
x = np.linspace(0, max(data), max(data))
y = ag(x)
return x, y
Это прекрасно работает для большинства наборов данных, но дает ошибочный результат для "всех положительных" точек данных. Чтобы убедиться, что это работает правильно, я использую численное интегрирование для вычисления площади под этой кривой.
def trapezoidal_2(ag, a, b, n):
h = np.float(b - a) / n
s = 0.0
s += ag(a)[0]/2.0
for i in range(1, n):
s += ag(a + i*h)[0]
s += ag(b)[0]/2.0
return s * h
Так как данные распространяются в области (0, int (max (data))), мы должны получить значение, близкое к 1, при выполнении следующей строки.
b = 1
data = st.pareto.rvs(b, size=10000)
data = list(data)
a = np.array(data)
ag = st.gaussian_kde(a)
trapezoidal_2(ag, 0, int(max(data)), int(max(data))*2)
Но при тестировании он дает значение, близкое к 0,5.
Но когда я интегрирую от -100 до максимума (данные), он дает значение, близкое к 1.
trapezoidal_2(ag, -100, int(max(data)), int(max(data))*2+200)
Причина в том, что ag (KDE) определено для значений меньше 0, даже если исходный набор данных содержит только положительные значения.
Итак, как я могу получить оценку плотности ядра, которая учитывает только положительные значения, так что область под кривой в области (o, max (данные)) близка к 1?