我正在努力实现小输入范围的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);
^{pr2}$
工作正常。但是,将'divisor'变量更改为100,scipy和seaborn可以处理较小的数据值。Sklearn的KDE不能用于我的实现:
我做错了什么?我该如何改正?我需要KDE的sklearns实现,所以不能使用其他算法。在
核密度估计被称为一种非参数方法,但实际上它有一个参数叫做带宽。在
KDE的每个应用都需要这个参数集!在
当你在拍海伯恩的情节时:
您没有提供任何带宽,seaborn使用默认的启发式方法(scott或silverman)。它们利用数据以一种依赖的方式选择一些带宽。在
你的sklearn代码看起来像:
^{pr2}$带宽是固定的/恒定的!这可能给你带来麻烦,也可能是这里的原因。但这至少是值得一看的。一般来说,人们会将sklearn的KDE和GridSearchCV结合起来作为交叉验证工具来选择一个好的带宽。在许多情况下,这是比较慢的,但比上面的那些启发式更好。在
遗憾的是,你没有解释为什么要使用sklearn的KDE。我个人对这三位热门候选人的评价是
statsmodels > sklearn > scipy
。在相关问题 更多 >
编程相关推荐