在找到 - python 后高效过滤 near/inside 个集群

efficient filtering near/inside clusters after they found - python

本质上,我在原始数据的子集上应用了具有欧氏距离的 DBSCAN 算法 (sklearn)。我找到了我的集群,一切都很好:除了我只想保留与我没有 运行 分析的那些值足够远的值。我有一个新的距离来测试这些新东西,我想了解如何做到这一点 WITHOUT 无数嵌套循环。

图片中:

我发现的簇是蓝色的,而红色的是我不想靠近的点。十字是属于集群的点,因为它们在我指定的新距离内。

现在,我能做的就是:

for i in red_points:
    for j in blu_points:
        if dist(i,j) < given_dist:
            original_dataframe.remove(j)

我不相信没有矢量化方法。另外,我不能像上面那样做只是因为我有巨大的桌子可以操作,我想避免我的 CPU 蒸发掉。

欢迎提出任何建议

如果你需要准确的答案,最快的实现应该是 sklearn 的成对距离计算器: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html

如果你能接受一个大概的答案,你可以用kd树的queryradius()做的更好:http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KDTree.html

当然你可以向量化它,但它仍然是 O(n*m)。更好的邻居搜索算法未矢量化。例如kd-tree 和 ball-tree.

两者都在 sklearn 中可用,并由 DBSCAN 模块使用。请参阅 sklearn.neighbors 包。