gpt4 book ai didi

python - 获取 SciPy 的 gaussian_kde 函数使用的带宽

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:57 32 4
gpt4 key购买 nike

我正在使用 SciPy 的 stats.gaussian_kde函数从 x,y 点的数据集生成核密度估计 (kde) 函数。

这是我的代码的简单 MWE:

import numpy as np
from scipy import stats

def random_data(N):
# Generate some random data.
return np.random.uniform(0., 10., N)

# Data lists.
x_data = random_data(100)
y_data = random_data(100)

# Obtain the gaussian kernel.
kernel = stats.gaussian_kde(np.vstack([x_data, y_data]))

由于我没有手动设置带宽(通过 bw_method 键),函数默认使用 Scott 规则(参见函数描述)。我需要的是获取由 stats.gaussian_kde 函数自动设置的带宽值。

我试过使用:

print kernel.set_bandwidth()

但它总是返回 None 而不是 float 。

最佳答案

简答

带宽是 kernel.covariance_factor() 乘以您正在使用的样本的标准

(这是一维样本的情况,在默认情况下使用 Scott 的经验法则计算)。

示例:

from scipy.stats import gaussian_kde
sample = np.random.normal(0., 2., 100)
kde = gaussian_kde(sample)
f = kde.covariance_factor()
bw = f * sample.std()

你得到的pdf是这样的:

from pylab import plot
x_grid = np.linspace(-6, 6, 200)
plot(x_grid, kde.evaluate(x_grid))

enter image description here

你可以这样检查,如果你使用一个新的函数来创建一个 kde,比如 sklearn:

from sklearn.neighbors import KernelDensity
def kde_sklearn(x, x_grid, bandwidth):
kde_skl = KernelDensity(bandwidth=bandwidth)
kde_skl.fit(x[:, np.newaxis])
# score_samples() returns the log-likelihood of the samples
log_pdf = kde_skl.score_samples(x_grid[:, np.newaxis])
pdf = np.exp(log_pdf)
return pdf

现在使用上面的相同代码,您将获得:

plot(x_grid, kde_sklearn(sample, x_grid, f))

enter image description here

plot(x_grid, kde_sklearn(sample, x_grid, bw))

enter image description here

关于python - 获取 SciPy 的 gaussian_kde 函数使用的带宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630515/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com