jqu*_*404 6 python cluster-analysis machine-learning 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 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)
Run Code Online (Sandbox Code Playgroud)
小智 6
这是一个简短的函数,演示了如何估计最大值。注意: no_samples的数量越多, 最大值就越准确。
from scipy.stats import gaussian_kde
import numpy as np
def estimate_maxima(data):
kde = gaussian_kde(data)
no_samples = 10
samples = np.linspace(min(data), max(data), no_samples)
probs = kde.evaluate(samples)
maxima_index = probs.argmax()
maxima = samples[maxima_index]
return maxima
Run Code Online (Sandbox Code Playgroud)
您将需要使用一种称为Mean Shift的算法。它是一种聚类算法,通过查找 KDE 的模式(也称为 f(x) 的最大值)来工作。请注意,KDE 的带宽设置将影响模式的数量及其位置。由于您使用的是 python,因此scikit-learn中有一个实现。
| 归档时间: |
|
| 查看次数: |
5360 次 |
| 最近记录: |