是否有用于快速最近邻搜索圆形尺寸的算法?例如,对于基于“一天中的小时”的维度,KD-tree 会将 00:01 和 23:59 分开。但是适当的距离度量会产生最短的距离(2分钟)。角度是另一个这样的维度,或者季节,或者月份,或者......
我想知道球树是否符合要求?这样的问题是否仍然适合那里所需的三角不等式?
是否有用于快速最近邻搜索圆形尺寸的算法?例如,对于基于“一天中的小时”的维度,KD-tree 会将 00:01 和 23:59 分开。但是适当的距离度量会产生最短的距离(2分钟)。角度是另一个这样的维度,或者季节,或者月份,或者......
我想知道球树是否符合要求?这样的问题是否仍然适合那里所需的三角不等式?
有多少个圆形尺寸?下面描述的两个技巧为了表示方便而牺牲了资源,不幸的是,圆形维度的数量呈指数增长。
您至少可以使用三个技巧:
使用坐标补丁:创建许多小的 kd 树,重叠以使它们在局部连续。如果您的范围查询足够宽以超出补丁的边界,这将不起作用。
您可以通过跨边界进行额外查询并添加后处理通道来手动粘合空间的各个部分。这将在该点最接近的角的维度上呈指数增长,但不会使用额外的内存。
使用多重覆盖。换句话说,沿着每个边界展开空间,并使每个点具有许多表示,因此边界“不可见”。对于一个圆形维度, :01 将存储为三个点:
:-59, :01, :61
使用两个圆形尺寸,您将 00:01 存储为
-24:-59, 00:-59, 24:-59
-24:01、00:01、24:01
-24:61、00:61:24:61
您可以看到空间膨胀随着圆形维度的数量呈指数增长。优点是使用这种表示,查询与以前完全相同。(当然,这只是技巧 2 的具体化)。如果您知道范围查询的工作距离有多远,那么您可能能够防止某些点的相乘(如果它们在空间内部足够深)
尝试像 DBScan 这样的聚类算法。R 和 Weka 都有这个算法。它是基于密度的。因此,如果集群在本质上是连续的一天,它应该做好一天的集群。