变化检测

数据挖掘 Python 统计数据 异常检测
2021-10-05 02:40:11

我有一个与变更检测有关的问题。应用领域是机器人/规划。

背景/设置:

在环境中的特定位置有一个传感器检测与障碍物的距离(超声波/声纳传感器)(x, y, theta)

它会定期返回一些读数。可以说读数是R在一段时间内记录R+R-+/-表示由于传感器不准确而导致的变化)。

案例 1:我在传感器和障碍物之间引入了一个额外的物体DD < R),以便在下一个实例D中检测并返回

案例 2:我移除了原来的障碍,现在下一个障碍是D'( D' > R) 并且在下一个实例D'返回。

问题

有没有办法准确(或很有可能)说现在发生了变化(当我添加或移除障碍物时)?

大多数变化分析算法考虑变化点之前的游程长度和变化点之后的一些数据,并指示发生的位置变化。

但是到目前为止,我读过的没有一个说现在发生了变化;即使是“在线”算法似乎也需要一些数据。

编辑:

最终目标

我想实现一个方法,该方法采用数据向量并在最新数据点是变化点时返回。

一个可能的解决方案/黑客

由于我的工作涉及流数据,这是我目前正在采用的方法。

  1. 从流的末尾读取一个数据窗口(目前,我的窗口大小为 20 个值)。
  2. 在此窗口上运行 bcp(来自 R)。
  3. 检查位置 18 处更改的后验概率。(对于我刚刚进行的所有运行,最后一个值为 NA,因此忽略它,并且数据索引为零,(使用 rpy2 从 Python 调用 R),因此,对于 20 的窗口大小,位置结果为 18。
  4. 为后验概率设置一个 70% 的阈值(现在在我的实验设置中这工作正常,我以后可能需要努力获得一个合适的阈值)
  5. 如果位置 18 > 70% 的后验概率,我返回 TRUE,表示最近的数据点具有不同的均值,或“检测到变化”,否则返回 FALSE。

这可能不是最有效的方法,但它现在正在做它的工作。我正在使用这种方法来推进我的工作。

如果我找到更好的方法,我会更新线程。

谢谢大家的帮助!

3个回答

考虑算法如何检测变化。您正在观察一些随机变量的实例,X1,X2,,Xk1. 突然(你不知道)在Xk 关于分布的一些事情 X变化。现在你的观察Xk,,Xn在某些方面是不同的。你想知道什么k 仅基于您的观察。

为了检测到变化,您必须对“之前”的外观有所了解,这样您才能确信“之后”确实不同。所以,是的,所有的变化检测算法都会在真正的变化之前和之后使用一些运行长度来做出决定(编辑:实际上,你不需要前后的运行长度,你可以对数据生成有一个假设过程。也许你说它的正常均值 0 方差 1 并且你的第一个观察值是 5000,你不需要运行长度就知道你在某个地方错了)。其他任何事情都将是一种更加狂野的未来预测。

看起来真正的问题可能是信号检测的延迟。您希望传感器在真正的变化点之后的几个数据实例之后检测到它。

所以我的问题是,你现在真的需要它在我看来,您对数据点的数量不感兴趣,但对收集它们所需的时间不感兴趣,这似乎是合理的。如果您有一个每秒更新 100,000 次的传感器,那么 100 个数据点并不是什么大问题。

您可以基于滑动窗口方法计算当前距离 R 的置信区间,并在下一个读数 D 超出该区间时立即发出信号。

是关于时间序列变化/异常检测的相当广泛的指南:“时间序列的异常检测”,Deepthi Cheboli 的硕士论文。

您可以从前面提到的简单参数化方法开始,但我想让您知道,有一种专门用于解决这个确切问题的实际方法,它非常易于构建和使用。

您的问题的名称是新颖性检测,并且在没有任何老化数据的情况下处理它的完美工具称为一类支持向量机

它的作用是从单个类中学习,并根据学习到的单个组检查任何测试用例,看看它是否与过去看到的不同。

我想这就是你想要做的。您避免在更改发生后牺牲任何时间或数据点。如果您可以在更改后烧录一些数据并构建“分类”(滥用该术语)方法,那么您不必采用一类 SVM 方式。如果您认为您当前拥有的时间序列具有良好的行为,并且应该立即检测到任何看起来不像的东西,那么它就是一类 SVM。

这个模型是在 R、Python、Matlab 中实现的,我相信还有很多其他平台,所以根据您使用的程序,我建议您尝试一下。