python - 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]))
谢谢你。
解决方案
好吧,您实际上并没有真正了解 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:论文很好很全面。我强烈建议你看看。祝你好运。