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

Python 如何在核密度估计中找到局部极大值?,python,machine-learning,cluster-analysis,kernel-density,Python,Machine Learning,Cluster Analysis,Kernel Density,我正在尝试使用核密度估计器(KDE)制作一个过滤器(去除离群值和噪声)。我在我的3D(d=3)数据点中应用了KDE,这给了我概率密度函数(PDF)f(x)。现在我们知道密度估计的局部极大值f(x)定义了数据点簇的中心。所以我的想法是定义合适的f(x),它将决定这些簇 我的问题是,如何以及什么方法更适合于寻找f(x)中的局部极大值。如果有人能给我提供一些示例代码/想法,我将不胜感激 下面是查找在3D数据中给出f(x)的KDE的代码 import numpy as np from scipy imp

我正在尝试使用核密度估计器(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)

您将需要使用名为的算法。它是一种聚类算法,通过查找KDE的模式(又称f(x)的最大值)来工作。请注意,为KDE设置的带宽将影响模式的数量及其位置。由于您使用的是python,因此中有一个实现

这里有一个简短的函数,演示如何估计最大值。注:no_样本数越高,最大值越准确

from scipy.stats import gaussian_kde
import numpy as np

    def estimate_maxima(data):

      kde = gaussian_kde(data)

      no_samples = 10

      samples = np.linspace(0, 10, no_samples)

      probs = kde.evaluate(samples)

      maxima_index = probs.argmax()

      maxima = samples[maxima_index]

      return maxima

谢谢你的主意。我听从了你的建议,将meanshift应用于我的密度值。但我不知道如何获得本地最大值。它给了我6个簇:(.这是,我做得对吗?簇中心应该包含最大值,因为“中心”没有多大意义,因为簇形状可能非常不规则。