我正在生成一个5000 *6数组,并使用来自scikit学习的KDE和来自statsmodel的MultivariateKDE来评估ln(概率密度)。由于两种方法都可以处理多维数据,所以我希望使用这两种方法都能得到相同的结果。但是,结果是不同的。当我查看带宽的价值时,我看到了scikit--学习KDE使用标量值来表示带宽,而多元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]发布于 2021-04-21 10:33:24
没有“正确”的带宽本身,您只是从两种不同的方法中获得两个带宽值,第一种是寻找唯一值(使用单变量网格搜索),第二种是查找多个值,使用斯科特经验法则估计,如GenericKDE所示。
带宽的值对应于带宽矩阵的对角线:它们都是与scikit-learn的估计相等的,并且可能与状态模型的估计不同。
https://stackoverflow.com/questions/67189978
复制相似问题