在找到 - 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
包。
本质上,我在原始数据的子集上应用了具有欧氏距离的 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
包。