内核密度估计-使用Epanechnikov内核的多维带宽选择

时间:2018-06-19 17:48:58

标签: python scikit-learn statsmodels kernel-density

我的目标是使用Epanechnikov内核使用交叉验证为python中的多维数据选择合适的带宽。流行的工具是sklearn.model_selection中的GridSearchCV。例如,

import numpy as np
from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV

datax = np.random.normal(loc=0, scale=1, size=1000)
datay = np.concatenate((np.random.normal(loc=-4, scale=2, size=500),
                        np.random.normal(loc=4, scale=2, size=500)))
data = np.array([datax, datay]).T

params = {'bandwidth': np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(kernel = 'epanechnikov'), params)
grid.fit(data)
kde = grid.best_estimator_

>>> kde.bandwidth
2.9763514416313175

不幸的是,此方法返回的带宽是标量。这是一个问题,因为我们可能期望不同的尺寸需要不同的平滑量。

另一种解决方案是使用statsmodels.nonparametric.kernel_density中的KDEMultivariate。例如,

import numpy as np
from statsmodels.nonparametric.kernel_density import KDEMultivariate

datax = np.random.normal(loc=0, scale=1, size=1000)
datay = np.concatenate((np.random.normal(loc=-4, scale=2, size=500),
                        np.random.normal(loc=4, scale=2, size=500)))
data = np.array([datax, datay])

kde = KDEMultivariate(data, 'cc', bw = 'cv_ml')

>>> kde.bw
array([ 0.40711909,  0.80613661])

这具有返回带宽阵列的优点,这在不同尺寸需要不同程度的平滑时很有用。但是,KDEMultivariate的缺点是它仅支持高斯内核(据我所知)。

是否有一个可以使用Epanechnikov内核在不同维度上计算不同带宽的软件包/解决方法?

0 个答案:

没有答案