了解SCIKIT使用网格搜索学习kde带宽选择

2024-04-19 19:08:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据,我想拟合一个高斯模型

我使用一个内核密度估计来实现这一点,我想为它选择最佳带宽

我通过使用带有交叉验证的GridSearch来实现这一点:

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV

# kde function
def kde_sklearn(x, x_grid, bandwidth):
    kde = KernelDensity(bandwidth=bandwidth).fit(x)
    log_pdf = kde.score_samples(x_grid[:, np.newaxis])
    return np.exp(log_pdf)

# optimal bandwidth selection
grid = GridSearchCV(KernelDensity(kernel='gaussian'), {'bandwidth': np.logspace(-3, 1, 20)}, cv=10)
grid.fit(data.reshape(-1, 1))
bw = grid.best_params_

对于一组特定的500 ish数据,网格搜索建议带宽为0.001。此处,结果高斯拟合叠加到数据直方图上:

这有什么意义?0.001怎么可能比我得到的0.01带宽更好?

我的代码中有错误吗


注意:对于cv集的大小,结果实际上是不合理的


Tags: 数据fromimportlogpdfnpsklearncv