我正在尝试应用 [ Vovk et al., 2003 ] 的幂鞅框架来更改未标记数据流中的检测,就像在 [ Ho and Wechsler, 2007 ] 中一样。基本思想涉及使用形式的幂鞅
- 是一些输入序列的 p 值,它们均匀分布在当序列是可交换的;
- 当违反可交换性时,变小,并且开始成长;
- 什么时候已经增长到某个阈值或相邻之间的差异已经超过了某个阈值,我们敲响警报,表示发生了一些变化并重新开始。
看起来很简单,但我无法让它工作:在我的数据上,确实随机振荡了一段时间,但很快下降到零(到像 1e-100 这样的值)并停留在那里;数据发生实际变化时有一些很大的因素,但是从1e-100返回需要很多因素......
我尝试了一个简单的测试:生成均匀分布并计算为他们。这是我测试的完整python代码(是论文中的建议值,但我尝试过其他的结果相似):
epsilon = 0.92
pv_test = [random.random() for _ in xrange(5000)]
test_mult = [epsilon * (x ** (epsilon - 1)) for x in pv_test]
Mtest = [1]
for i in xrange(len(test_mult)):
Mtest.append(Mtest[i] * test_mult[i])
我观察到了同样的行为:总是降为零!有时更快,有时更慢,但总是如此。以下是一些示例图:
它看起来确实像随机游走,但即使对于完全一致的 p 值,它也总是最终下降到零。这显然不适用于变更检测,因为即使是相对较长的小 p 值序列也无法恢复从1e-100。
所以我的问题是:我做错了什么?