为核密度估计选择带宽和空间。 (为啥我的带宽不起作用?)

Posted

技术标签:

【中文标题】为核密度估计选择带宽和空间。 (为啥我的带宽不起作用?)【英文标题】:choosing bandwidth&linspace for kernel density estimation. (why my bandwidth doesn't work?)为核密度估计选择带宽和空间。 (为什么我的带宽不起作用?) 【发布时间】:2020-06-06 21:04:03 【问题描述】:

我已关注this link 用于核密度估计的应用。我的目标是为一个数组组创建两个不同的组/集群或更多。以下代码适用于除此数组之外的数组组的每个成员:

X = np.array([[77788], [77793],[77798], [77803], [92886], [92891], [92896], [92901]])

所以我的期望是看到两个不同的集群,例如:

first_group = ([[77788], [77793],[77798], [77803]])

second_group = ([[92886], [92891], [92896], [92901]])

我有一个动态列表,所以我无法修复 linspace 的值。因为这个数组可能是 0 到 10 或 100000 到 2000000。这就是为什么我将数组的最大和最小点放在 linspace 中。

毕竟,即使尝试了各种带宽,我也无法获得不同的集群。我的代码如下:

a = X.reshape(-1,1)
kde = KernelDensity(kernel='gaussian', bandwidth=8).fit(a)
s = linspace(min(a),max(a))
e = kde.score_samples(s.reshape(-1,1))
plot(s, e)

mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0]
print("Minima:", s[mi])  # output: []
print("Maxima:", s[ma])  # output: []

s[mi] 和 s[ma] 值为空,这意味着该数组没有两个不同的簇。在可视化中可以看出我们至少有一个最小点。为什么看不到 s[mi] 输出的这个值?

我为不同的带宽应用了相同的代码,如下所示,但是,这个集群没有最小值或最大值。所以知道我做错了什么吗?

bandwidth=0.008

bandwidth = 0.00002

【问题讨论】:

【参考方案1】:

尝试 10000 的带宽,或尝试依靠启发式方法来选择带宽。

为了使您的代码更加健壮,还可以在连续最小值处拆分集群。因为你的问题是这里没有唯一的最小值,而是一个区间。

【讨论】:

抱歉,我不明白我应该怎么做才能使我的代码更健壮?你能给我举个例子吗? @Has QUIT--Anony-Mousse【参考方案2】:

您可以考虑尝试网格搜索:

params = 'bandwidth': np.logspace(-1, 1, 20)
grid   = GridSearchCV(KernelDensity(), params)
grid.fit(a)

print("best bandwidth: 0".format(grid.best_estimator_.bandwidth))

kde = grid.best_estimator_

【讨论】:

以上是关于为核密度估计选择带宽和空间。 (为啥我的带宽不起作用?)的主要内容,如果未能解决你的问题,请参考以下文章

核密度估计:带宽宽度选择——原理阐述

核密度估计:带宽宽度选择——原理阐述

核密度估计:带宽宽度选择——ROT 原则

核密度估计:带宽宽度选择——ROT 原则

核密度估计:带宽宽度选择——ROT 原则

自适应带宽核密度估计