如何在核密度估计中找到局部最大值?

我正在尝试使用内核密度估算器(KDE)制作过滤器(以消除异常值和噪声).我在我的3D(d = 3)数据点中应用了KDE,这给了我概率密度函数(PDF)f(x).现在我们知道密度估计的局部最大值f(x)定义了数据点簇的中心.所以我的想法是定义适当的f(x)来确定那些簇.

我的问题是如何以及什么方法更适合于在f(x)中找到局部最大值的目的.如果有人能提供一些示例代码/想法,我将非常感激.

以下是查找在3D数据中给出f(x)的KDE的代码.

import numpy as np
from scipy import stats

data = np.array([[1, 4, 3], [2, .6, 1.2], [2, 1, 1.2],
         [2, 0.5, 1.4], [5, .5, 0], [0, 0, 0],
         [1, 4, 3], [5, .5, 0], [2, .5, 1.2]])
data = data.T 
kde = stats.gaussian_kde(data)
minima = data.T.min(axis=0)
maxima = data.T.max(axis=0)
space = [np.linspace(mini,maxi,20) for mini, maxi in zip(minima,maxima)]
grid = np.meshgrid(*space)
coords = np.vstack(map(np.ravel, grid))
#Evaluate the KD estimated pdf at each coordinate
density = kde(coords)

最佳答案 您将需要使用名为
Mean Shift的算法.它是一种聚类算法,通过查找KDE的模式(也就是f(x)的最大值)来工作.请注意,为KDE设置的带宽将影响模式的数量及其位置.由于您使用的是python,因此在
scikit-learn中有一个实现.

点赞