在高维空间中找到最密集的点邻域

数据挖掘 聚类 降维 数据分析 k-nn
2022-02-28 22:54:08

我正在做一个项目,我有很多高维点,我想找到它们中最密集的邻域。理想情况下,在我的 ~500 个点中,每个点都是一个 4x300 矩阵(四个变量的 300 ms 时间序列),我想找到最相似的 ~30 个点。我研究了 k 最近邻方法,但这些方法都在寻找某个点的最小邻域,我希望能够指定邻域的大小 N(有多少数据点)并获得子集 N 个点最接近。

我认为(?)这是一个聚类问题,所以我研究了使用更相关维度进行聚类的软子空间聚类,并且我研究了专门为时间序列数据开发的双聚类。

任何帮助将不胜感激!我有一个问题,我确定其他人已经想到了,但我认为我不知道确切的措辞,到目前为止我所看到的一切都很接近,但不完全是我需要的。因此,任何能给我有关如何解决此问题的信息的论文/代码/教程/等都很棒:D

更新:我已经研究过使用Frechet 距离作为时间序列之间的距离。这是否是用于此类数据的合适指标?

2个回答

研究异常检测算法。Scikit-learn 在其异常值检测模块中有多种内置的在 500 个中找到 30 个最相似的点与找到 470 个异常值相同。这些算法中的大多数都有一个参数,该参数contamination指定您通常希望将数据集的哪一部分分类为异常值,因此操纵此参数的值可能会给您想要实现的目标。

如果您正在寻找用于确定一组点中的某些点有多接近(或不接近)的指标,我认为有一些明显的需要考虑:

  1. 直径,来自点集拓扑:查看集合中的所有点对并取最大距离ϵ任意两个之间。称之为集合的“直径”。换句话说,在任何方向上最宽的集合是ϵ. 这很容易计算,可能会得到你想要的。

  2. 找到最小的数字ϵ所以在半径的某处有一个球ϵ包含你的整个集合。在现实生活中如何计算这一点并不明显,但这是一种等效的方法:选择一个非常小的数字ϵ并画一个小半径球ϵ围绕集合中的每个点。什么时候ϵ足够小,这些小球根本不重叠;当你增加ϵ,不过,它们开始有点重叠,最终,所有的球都会在某个点重叠。把它冻结在那里并抓住它ϵ并将其称为您的集合的大小。这有点难以计算,但它是持久同源原始定义中使用的集合距离的版本,因此它肯定已经在大数据分析中使用;请参阅此处以获得良好的可视化效果。

  3. #2 的变体,更容易计算,现在用作持久同源性的标准简化之一:选择你的ϵ非常小,所以球根本不会重叠并逐渐将它们撞起来;当球开始重叠时,计算重叠在一起的数量,即形成连续区域的数量。这样做直到你所有的球在集合中重叠,冻结它,然后拿走ϵ作为你的集合的大小。

就您的实际问题而言,我认为所有这些都需要您花一点时间ϵ并开始增加它并寻找最多 n 元素的大小集ϵ; #1 可能是最容易计算的,并且可能会给出您正在寻找的结果,尽管您当然可以看到为什么#3 也用于此目的。