我有两个具有数百万个y值的数据集。 (它们按时间顺序排列,因此X值仅作为索引而已被省略。)
>>> print(f'{y_one[0:16]}...{y_one[-1]}')
[0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 5, 6, 5]...302
>>> print(f'{y_two[0:16]}...{y_two[-1]}')
[0, -1, 0, 1, 2, 1, 2, 1, 2, 3, 2, 1, 2, 3, 2, 1]...88
两个数据集都是随机生成的,应该假定它们仅应在机会允许的范围内相互关联。 (它们本质上都是随机游走,或者与先前的y值相加或相减)。
>>> plt.plot(y_one[:80000])
>>> plt.show()
>>> plt.plot(y_two[:80000])
>>> plt.show()
我的任务是分析这两行,并确定它们之间的相关性是否超出机会允许的范围。如果它们之间的关联性超过了随机硬币夹所暗示的程度,那么说明它们已经发生了关联,因此我需要触发一个事件作为响应。
问题是...我不知道从哪里开始。当然,当我阅读相关检测时,我已经了解了Pearson相关系数。我了解了它的弱点;要求我的数据必须是线性或单调的,以便准确地检测相关性。
如您所见,由于这两个数据集都是随机游走的,所以它们通常不是单调的。上面的图像仅显示了前80k个数据点,并且几乎全都覆盖了。
因此,皮尔逊还不够;尤其是因为它们可能在10k或某些其他x观测值之间具有一定的相关性,然后完全放弃它们的相关性。数百万个数据点内的10k关联相关性对Pearson毫无意义。它在噪音中迷失了。但是,如果这些关联“时刻”比我应该知道的更多,那就是我要寻找的。 p>
几乎就像我需要一个“皮尔逊相关演算”一样,我需要制作各种大小的滑动窗口以在数据集上滑动,并为每个可能的x观测数计算它们的皮尔森系数。行。如果我这样做并记录了我的发现,则可以通过窗口的大小对每个Pearson值进行加权,然后对它们进行平均以获得总分。但是对于数以百万计的观察,显式地执行此操作会占用大量计算资源:对于100万个观察,我将必须具有100万个-1滑动窗口,最小的为2个大小,最大的为100万个大小;这意味着我必须计算大约5000亿个Pearson相关系数。
我要处理的绝大多数是噪声,这使所有这些情况变得更加复杂。但是我知道必须有一种很好的方法来测量两个数据集之间的确切相关性,它足够复杂以应对这些约束,但是我不知道它是什么或在哪里看。我正在尝试测量与机会之间的最小偏差(当然,有一个细节阈值我不在乎,但是很接近机会)。
以前有没有人处理过这样的问题?你有什么建议?我看错地方了吗?也许不是直接相关,而是应该将这些数据点拟合到一个函数(多项式曲线)上,然后比较这两个函数。你怎么看?
任何建议将不胜感激,谢谢!
Ps。如果您不知道,我正在python中工作,但我很乐意以任何语言获得有关如何进行此计算的建议。