KDE不为小值工作

2024-04-24 05:31:40 发布

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

我正在努力实现小输入范围的KDE的scikit-learn实现。下面的代码可以工作。将除数变量增加到100和KDE斗争:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
from sklearn.neighbors import KernelDensity

# make data:
np.random.seed(0)
divisor = 1
gaussian1 = (3 * np.random.randn(1700))/divisor
gaussian2 = (9 + 1.5 * np.random.randn(300)) / divisor
gaussian_mixture = np.hstack([gaussian1, gaussian2])

# illustrate proper KDE with seaborn:
sns.distplot(gaussian_mixture);

enter image description here

^{pr2}$

enter image description here

工作正常。但是,将'divisor'变量更改为100,scipy和seaborn可以处理较小的数据值。Sklearn的KDE不能用于我的实现:

enter image description here

我做错了什么?我该如何改正?我需要KDE的sklearns实现,所以不能使用其他算法。在


Tags: importasnprandomgaussianseabornscikitlearn
1条回答
网友
1楼 · 发布于 2024-04-24 05:31:40

核密度估计被称为一种非参数方法,但实际上它有一个参数叫做带宽。在

KDE的每个应用都需要这个参数集!在

当你在拍海伯恩的情节时:

sns.distplot(gaussian_mixture);

您没有提供任何带宽,seaborn使用默认的启发式方法(scott或silverman)。它们利用数据以一种依赖的方式选择一些带宽。在

你的sklearn代码看起来像:

^{pr2}$

带宽是固定的/恒定的!这可能给你带来麻烦,也可能是这里的原因。但这至少是值得一看的。一般来说,人们会将sklearn的KDE和GridSearchCV结合起来作为交叉验证工具来选择一个好的带宽。在许多情况下,这是比较慢的,但比上面的那些启发式更好。在

遗憾的是,你没有解释为什么要使用sklearn的KDE。我个人对这三位热门候选人的评价是statsmodels > sklearn > scipy。在

相关问题 更多 >