使用DBSCAN群集过程的结果很奇怪

我正在从事与集群任务有关的任务。 DBSCAN拟合过程产生奇怪的结果,我不知道我的错误在哪里。我简化了代码,只留下了重要的部分:

clusters = pd.read_csv('cl.csv')

def stb_metric(mac1,mac2):
    if mac1[0] == mac2[0]:
        return 0
    print(mac1[0],mac2[0])
    return 1

X = clusters.mac.unique().reshape(-1,1)
db = DBSCAN(eps = 1,min_samples = 1,metric = stb_metric).fit(X)

在“ stb_metric”输出中,我观察到不存在的mac1或mac2。我已附上csv档案进行测试。输出如下:

(8.354702571827299e+18,2.9454553327798374e+17)
(8.354702571827299e+18,6.197480706091255e+17)
(8.354702571827299e+18,2.2314854373712773e+18)
(8.354702571827299e+18,2.5842000416550815e+18)
(8.354702571827299e+18,3.525512049236994e+18)
(8.354702571827299e+18,3.678065423036415e+18)
(8.354702571827299e+18,5.232482030018176e+18)
(8.354702571827299e+18,9.212176082078934e+18)
(8.354702571827299e+18,1.0293104245975763e+19)
(8.354702571827299e+18,1.2339113289676194e+19)
(8.354702571827299e+18,1.2848720441363968e+19) etc

Data where reproduced the problem

wkao0705120104 回答:使用DBSCAN群集过程的结果很奇怪

首先,与离散量度和minpts = 1结合使用意味着您正在滥用DBSCAN来检测重复项。有很多更有效,更聪明的方法可以做到这一点...

现在您的问题可能是:sklearn。

它试图变得聪明,并且可能尝试使用球状树来加速这一过程。不幸的是,纯python速度很慢,因此这些部分内置于Cython中,最终迫使您将数据转换为浮点向量-因为那是这些子例程唯一支持的数据类型。

解决方法是使用algorithm="brute",但是运行时将为O(n²)。不幸的是,通常最好使用预先计算的距离矩阵(如果您可以负担O(n²)内存),而不是使用带sklearn的ufunc距离。

本文链接:https://www.f2er.com/3086011.html

大家都在问