我的目标是使用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内核在不同维度上计算不同带宽的软件包/解决方法?