DBSCAN eps 和 min_samples

Ali*_*sef 3 python cluster-analysis machine-learning

我一直在尝试使用 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)

Run Code Online (Sandbox Code Playgroud)
(array([  -1,    0,    1, ..., 8462, 8463, 8464]),
array([1737565, 3539278, 4455734, ...,      13,       8,       8]))
Run Code Online (Sandbox Code Playgroud)

谢谢。

ali*_*ift 5

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

\n\n

这是维基百科的副本:

\n\n
\n

如果点 p 至少有 minPts 个点位于其距离 \xce\xb5 之内(包括 p),则该点是核心点。

\n\n

如果点 q 与核心点 p 的距离在 \xce\xb5\n 之内,则点 q 可以从 p 直接到达。点仅表示可从核心点直接到达。

\n\n

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

\n\n

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

\n
\n\n

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

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

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

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

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

  • \n
\n\n

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

\n\n

回答你的第二个问题

\n\n
\n

通过反复试验找到 eps 的最佳值也是正常的,

\n
\n\n

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

\n\n

PS:这篇论文很好,很全面。我强烈建议你看一下。祝你好运。

\n