python - 为核密度估计选择带宽和空间。(为什么我的带宽不起作用?)
问题描述
我已经按照这个链接来应用核密度估计。我的目标是为一个数组组创建两个不同的组/集群或更多。以下代码适用于除此数组之外的数组组的每个成员:
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
解决方案
您可以考虑尝试网格搜索:
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_
推荐阅读
- python - 已安装 webkit_server 但在脚本中找不到
- mono - Mono 5 关于 Solaris 构建问题
- node.js - Node Express 和 SQLite3:将相关的多对多数据作为一个对象返回
- vba - 根据列中的日期隐藏行
- java - Android 不能在其他活动中使用 PrintWriter
- python - 尝试解析 div 类但无法获得正确的结果
- oracle - 为什么在这个过程中没有满足我的条件?
- swift - NSPopover 改变高度时改变原点
- python-3.x - Python 3 - 面向对象编程 - 类和函数
- javascript - React - React 类中的函数