核密度估计 - 绝对数
Posted
技术标签:
【中文标题】核密度估计 - 绝对数【英文标题】:Kernel Density estimation - absolute numbers 【发布时间】:2015-10-04 19:54:47 【问题描述】:我使用核密度估计已经有一段时间了,但到目前为止,我总是通过分析和归一化分布来逃避简单的方法,其中不需要在不同集合之间进行相互比较。在我当前的项目中,我想比较绝对尺度上的 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】:KDE 是概率密度函数的非参数估计,因此概率之和必须等于 1。您可以将其视为通过观察次数归一化的平滑直方图。
因此,要获得绝对数字,您只需将观察次数乘回即可。
【讨论】:
以上是关于核密度估计 - 绝对数的主要内容,如果未能解决你的问题,请参考以下文章