微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scikit-learn KDE 和 statsmodels 的多元 KDE 的带宽差异

如何解决scikit-learn KDE 和 statsmodels 的多元 KDE 的带宽差异

我正在生成一个 5000 * 6 的数组,并使用来自 scikit-learn 的 KDE 和来自 statsmodel 的 MultivariateKDE 来评估 ln(概率密度)。由于两者都可以处理多维数据,我希望使用这两种方法都能得到相同的结果。但是,结果是不同的。当我查看带宽值时,我看到 scikit-learn KDE 对带宽使用标量值,而 Multivariate KDE 对带宽使用一维数组。

那么,哪个带宽是正确的?

我附上了下面的代码片段,

# Generating random data
rng = np.random.RandomState(42)
X = rng.random_sample((5000,6))

# Using Grid search to get the best bandwidth
params = {'bandwidth': np.logspace(-1,1,20)}
grid = gridsearchcv(KernelDensity(),params)
grid.fit(X)
print("best bandwidth for scikit-learn: {0}".format(grid.best_estimator_.bandwidth))

# Using scikit-learn kde
kde = KernelDensity(kernel='gaussian',bandwidth=grid.best_estimator_.bandwidth).fit(X)
log_density = kde.score_samples(X)

# Using Multivariate KDE from statsmodels
kde = sm.nonparametric.KDEMultivariate(data=X,var_type='cccccc',bw='normal_reference')
log_density_stat = np.log(kde.pdf(X))
print("best bandwidth for statsmodels : ",kde.bw)

对应的输出如下,

best bandwidth for scikit-learn: 0.1
best bandwidth for statsmodels :  [0.12904    0.13105721 0.12936657 0.13071426 0.13008811 0.13102085]

解决方法

没有“正确”的带宽本身,您只是从两种不同的方法中获得了两个带宽值,第一个寻找唯一值(使用单变量网格搜索),第二个寻找多个值时,似乎使用 Scott's rule of thumb 进行估计,如 _normal_reference method of GenericKDE 中所示。

带宽的值对应于带宽矩阵的对角线:它们都与 scikit-learn 的估计相等,并且可以与 statsmodels 的估计不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。