首页 > 解决方案 > DBSCAN eps 和 min_samples

问题描述

我一直在尝试使用 DBSCAN 来检测异常值,据我了解 DBSCAN 输出 -1 作为异常值,1 作为内联,但是在我运行代码之后,我得到的数字不是 -1 或 1,有人可以请解释为什么?使用反复试验找到最佳 eps 值也是正常的,因为我无法找到找到最佳 eps 值的方法。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

from sklearn.cluster import DBSCAN



df = pd.read_csv('Final After Simple Filtering.csv',index_col=None,low_memory=True)


# Dropping columns with low feature importance
del df['AmbTemp_DegC']
del df['NacelleOrientation_Deg']
del df['MeasuredYawError']



#applying DBSCAN


DBSCAN = DBSCAN(eps = 1.8, min_samples =10,n_jobs=-1)

df['anomaly'] = DBSCAN.fit_predict(df)


np.unique(df['anomaly'],return_counts=True)

(array([  -1,    0,    1, ..., 8462, 8463, 8464]),
array([1737565, 3539278, 4455734, ...,      13,       8,       8]))

谢谢你。

标签: pythonmachine-learningcluster-analysis

解决方案


好吧,您实际上并没有真正了解 DBSCAN。

这是来自维基百科的副本:

如果至少 minPts 个点在它的距离 ε 内(包括 p),则点 p 是核心点。

如果点 q 在距核心点 p 的距离 ε 内,则点 q 可以从 p 直接到达。点只能从核心点直接到达。

如果存在路径 p1, ..., pn 且 p1 = p 和 pn = q,则点 q 可以从 p 到达,其中每个 pi+1 都可以从 pi 直接到达。请注意,这意味着路径上的所有点都必须是核心点,q 可能除外。

从任何其他点无法到达的所有点都是异常值或噪声点。

所以用更简单的话来说,这个想法是:

  • 任何以 epsilon 距离具有 min_samples 个邻居的样本都是核心样本。

  • 任何不是核心但至少有一个核心邻居(距离小于 eps)的数据样本都是可直接到达的样本,可以添加到集群中。

  • 任何不是直接可达也不是核心,但至少有一个直接可达邻居(距离小于 eps)的数据样本是可达样本,将被添加到集群中。

  • 任何其他示例都被认为是噪声、异常值或您想要命名的任何内容。(这些将被标记为 -1)

根据聚类的参数(eps 和 min_samples),您很可能拥有两个以上的聚类。您看,这就是您在聚类结果中看到 0 和 -1 以外的其他值的原因。

回答你的第二个问题

使用反复试验找到最佳 eps 值是否正常,

如果您的意思是进行交叉验证(在您知道集群标签的集合上,或者您可以近似正确的集群),是的,我认为这是正常的方法

PS:论文很好很全面。我强烈建议你看看。祝你好运。


推荐阅读