核密度估计 - 绝对数

时间:2015-07-15 16:33:30

标签: python scikit-learn kernel-density

我一直在使用内核密度估计,但到目前为止,我总是通过分析和归一化分布来避免简单的方法,其中不需要在不同集合之间进行比较。在我目前的项目中,我想比较绝对尺度上的2D密度分布,似乎我错过了关于KDE如何工作的关键点。我需要从两个不同的数据集中比较天空中的恒星密度,为此我需要绝对数字(每个区域的星星)或者我可以直接比较两个计算的密度估计值。为了说明我的问题,请看一下这段代码:

# Import stuff
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.ticker import MultipleLocator

# Define kernel
kernel = KernelDensity(kernel="gaussian", bandwidth=1)

# Set some parameters for the synthetic data
mean = [0, 0]
cov = [[0.2, 1], [0, 1]]

# Create two data sets with different densities
x1, y1 = np.random.multivariate_normal(mean,cov,100).T
x2, y2 = np.random.multivariate_normal(mean,cov,1000).T

# Create grid
xgrid = np.arange(-5, 5, 0.1)
ygrid = np.arange(-5, 5, 0.1)
xy_coo = np.meshgrid(xgrid, ygrid)
grid = np.array([xy_coo[0].reshape(-1), xy_coo[1].reshape(-1)])

# Prepare data
data1 = np.vstack([x1, y1])
data2 = np.vstack([x2, y2])

# Evaluate density
log_dens1 = kernel.fit(data1.T).score_samples(grid.T)
dens1 = np.exp(log_dens1).reshape([len(xgrid), len(ygrid)])
log_dens2 = kernel.fit(data2.T).score_samples(grid.T)
dens2 = np.exp(log_dens2).reshape([len(xgrid), len(ygrid)])

# Plot the distributions and densities
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))

im1 = ax1.imshow(dens1, extent=[-5, 5, -5, 5], origin="lower", vmin=0, vmax=0.1)
ax1.scatter(x1, y1, s=1, marker=".")
divider1 = make_axes_locatable(ax1)
cax1 = divider1.append_axes("top", size="10%", pad=0.4)
cbar1 = plt.colorbar(im1, cax=cax1, orientation="horizontal", ticks=MultipleLocator(0.02), format="%.2f")

im2 = ax2.imshow(dens2, extent=[-5, 5, -5, 5], origin="lower", vmin=0, vmax=0.1)
ax2.scatter(x2, y2, s=1, marker=".")
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("top", size="10%", pad=0.4)
cbar2 = plt.colorbar(im2, cax=cax2, orientation="horizontal", ticks=MultipleLocator(0.02), format="%.2f")

plt.show()

现在,上面的图像是使用此代码获得的结果的示例。代码只生成两个数据集:一个包含100个源,另一个包含1000个源。它们的分布在图中显示为散点。然后代码评估给定网格上的内核密度。该核密度显示在具有颜色的图像的背景中。现在让我感到困惑的是,我获得的密度(颜色条中颜色的值)对于两个分布几乎相同,即使我在第二组中有10倍的源。这使得不可能将密度分布直接相互比较。

我的问题:

a)密度究竟是如何归一化的?按数量计算?

b)有没有办法从KDE获得绝对密度估算?在这些任意单位中说每1x1盒子的来源?

谢谢

1 个答案:

答案 0 :(得分:0)

KDE是概率密度函数的非参数估计,因此概率之和必须等于1.您可以将其视为通过观测数量归一化的平滑直方图。

因此,要获得绝对数,您只需要乘以观察数。