在核密度估计中,空间中任意点的密度可以通过(wiki)来估计:
在 sklearn 中可以从这个分布中抽取样本:
kde = KernelDensity().fit(z) # fit kde
z_sampled = kde.sample(100) # draw 100 samples
是否有明确的公式可以从这样的分布中抽取样本?
请您参考如下方法:
这取决于内核。
但一般方法很简单。让我们在这里假设一个 gaussian-kernel:
- 从
X中均匀选取一个原点x - 从链接到这一点的内核中提取一个值:
- 高斯:
sample = Gaussian/Normal(x, b)(x=mean; b=standard deviation) 其中x = 统一选择的点code> 和b=Bandwidth。
- 高斯:
是的,抽样不需要配件。一切都取决于原始数据和带宽参数!
与 sklearn's implementation 比较:
i = rng.randint(data.shape[0], size=n_samples)
if self.kernel == 'gaussian':
return np.atleast_2d(rng.normal(data[i], self.bandwidth))
我省略了访问 data[i] 所需的底层树结构。 np.atleast_2d 只是为了与 sklearn 的 API 兼容。
