【发布时间】:2019-02-14 04:28:03
【问题描述】:
我想获得正数据点的核密度估计。使用 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 积分到 max(data) 时,它提供了一个接近 1 的值。
trapezoidal_2(ag, -100, int(max(data)), int(max(data))*2+200)
原因是,为小于 0 的值定义了 ag (KDE),即使原始数据集仅包含正值。
那么我怎样才能得到一个只考虑正值的核密度估计,使得区域中曲线下的面积(o,max(数据))接近 1?
【问题讨论】:
标签: python scipy statistics