基本上我在原始数据的子集上应用了一个DBSCAN
算法(sklearn
)和欧氏距离。我找到了我的集群,一切都很好:除了我想保留的值远远超过我没有进行分析的值。我有一个新的距离来测试这些新东西,我想了解如何做到没有多个嵌套循环。
在图片中:
我发现的星团是蓝色的,而红色的是我不想靠近的点。十字架是属于簇的点,它们在我指定的新距离内被雕刻出来。
现在,我可以做同样的事情:
for i in red_points:
for j in blu_points:
if dist(i,j) < given_dist:
original_dataframe.remove(j)
我拒绝相信没有矢量化方法。另外,我不能仅仅因为我将拥有巨大的表格来操作,我想避免我的CPU蒸发掉。
欢迎任何和所有建议
答案 0 :(得分:1)
如果您需要确切的答案,最快的实施应该是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
答案 1 :(得分:1)
当然你可以对此进行矢量化,但它仍然是O(n * m)。更好的邻居搜索算法不是矢量化的。例如kd-tree和ball-tree。
两者都可以在sklearn中使用,并由DBSCAN模块使用。请参阅sklearn.neighbors
包。