我有一组2D坐标集(在每组100K-500K点的范围内),我正在寻找最有效的方法来测量1套到另一套的相似性。我知道常见的事情:Cosine,Jaccard / Tanimoto等。但我希望对任何快速/有效的测量相似性的建议,特别是那些可以按相似性聚类的建议。
编辑1:图像显示了我需要做的事情。我需要通过它们的形状/ orientatoin等聚集所有的红色,蓝色和绿色。
答案 0 :(得分:0)
尝试K-means算法。它动态计算每个聚类的质心,并计算到所有指针的距离,并将它们与最近的聚类相关联。
答案 1 :(得分:0)
似乎任何解决方案的第一步都是找到每个形状的质心或其他参考点,以便无论绝对位置如何都可以进行比较。
想到的一种算法是从距离质心最近的点开始并走到最近的邻居。比较被比较的集合之间的那些邻居(来自质心)的偏移。继续步行到质心的下一个最近邻居,或者之前比较的那些最近的尚未比较的邻居,并跟踪两个形状之间的总差异(可能是RMS?)。此外,在此过程的每个步骤计算旋转偏移,这将使两个形状最接近对齐[以及镜像是否也影响它?]。完成后,每对集合将有三个值,包括它们的直接相似性,它们的相对旋转偏移(通常仅在旋转后它们是紧密匹配时才有用),以及它们在旋转后的相似性。
答案 2 :(得分:0)
由于您的群集基于接近形状的度量标准,因此您可能需要某种形式的连接组件标记。 UNION-FIND可以为您提供快速的基本集原语。
对于仅联合,启动不同组中的每个点,如果它们符合某种接近标准,则会合并它们,受当地共线性的影响,因为这对您来说很重要。然后继续合并,直到你通过一些超阈值条件,你的合并有多困难。如果你把它视为行增长(只在它们的末端加入东西),那么一些数据结构变得更简单。你的所有星团都是开放的线条和曲线吗?没有封闭的曲线,比如圆圈?
交叉线很难做到正确,你要么必须找到某种方式合并然后拆分,要么你将合并标准设置为非常有利于colinearity,你就可以在交叉线上运气了。