我是Python的新手,我必须估算2D样本的密度。我的第一个想法是一个简单的直方图估计器,我实现如下:
num = 10**4
sp = 0.01
subsetf1 = np.random.uniform(0,1,size=(num,2)) # I created this set to test the estimator
def f_est(x,y,h=sp, subset=subsetf1):
indicator = np.zeros(num)
for i in range(num):
if (x <= subset[i][0] <= (x + h)) and (y <= subset[i][1] <= (y + h)):
indicator[i] = 1
else : indicator[i] = 0
return sum(indicator)/(num*h**2)
#f_est should yield values closely to 1 if 0 <x,y <1 , because subsetf1 contains uniformly distributed values on [0,1).
问题是f_est
经常产生大于1的值,这让我相信我的代码是错误的,但我不知道错误可能在哪里。我也尝试过核密度估算,但如果我尝试类似的东西:
from scipy import stats
xmin = partsetf1[0].min()
xmax = partsetf1[0].max()
ymin = partsetf1[1].min()
ymax = partsetf1[1].max()
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([X.ravel(), Y.ravel()])
values = np.vstack([partsetf1[0], partsetf1[1]])
gkde=stats.gaussian_kde(values)
f = np.reshape(gkde(positions).T, X.shape)
f产生奇怪的值,这些值是不对的。 如果有人能告诉我代码中的错误在哪里以及如何在Python中使用kde会很棒,因为我没有找到关于这个主题的好教程。
答案 0 :(得分:0)
核密度估计可以产生大于1的值,因为它们不返回概率,而是概率密度。您的案例中的概率密度给出了每单位面积的概率,并且可以在本地远大于1。
好消息是,由于您的结果与scipy或statsmodel的结果相匹配,因此听起来您的代码是正确的。