系列相似性的可靠衡量标准 - 相关性对我来说并不适用

机器算法验证 相关性
2022-03-07 01:48:23

我正在尝试确定一种方法,以编程方式将一个特定时间序列与大约 10,000 多个参考时间序列进行比较,并将那些可能感兴趣的参考时间序列列入候选名单。

我使用的方法是Pearson Correlation对于每个参考时间序列,我会计算它们的相关系数,然后根据相关系数按降序对整个参考时间序列列表进行排序。然后,我将直观地分析具有最高相关系数的前 N ​​个时间序列,这应该是给定时间序列的最佳匹配。

问题是我没有得到可靠的结果。很多时候,前 N 个范围内的序列在视觉上与给定的时间序列并不相似。最后,当我阅读下面的完整文章时,我明白了原因:不能单独使用相关性来确定两个时间序列是否相似。

安斯科姆四重奏

现在这是计算两个时间序列之间某种距离的所有匹配算法的问题。例如,下面的两组时间序列可以得出相同的距离,但显然其中一组比另一组更匹配。

A => [1, 2, 3, 4, 5, 6, 7, 8,  9]
B1 => [1, 2, 3, 4, 5, 6, 7, 8, 12]
distance = sqrt(0+0+0+0+0+0+0+0+9) = 3
B2 => [0, 3, 2, 5, 4, 7, 6, 9,  8]
distance = sqrt(1+1+1+1+1+1+1+1+1) = 3

所以我的问题是,在这种情况下,是否有一个数学公式(如相关性)更适合我?哪一种不受这里提到的问题困扰?

如果需要,请随时要求进一步澄清或改进问题文本。谢谢!=)

编辑:

相关结果

@woodchips,@krystian:

顶行显示在给定日期结束的 USDCHF-Daily 的最后十根柱线。第二行给出了用于关联的方法 A的前 3 个结果(解释将在后面)。最后一行显示方法 B的前 3 个结果. 我已经使用高-低-收盘价进行相关性分析。每行中的最后一张图片是我认为“很好的匹配”,原因是该系列的转折点对我来说更重要。巧合的是,最后几行的相关性最大。但是您可以在最后一行中看到第二张图像的相似性非常弱。尽管如此,它还是设法进入了前三名。这让我感到不安。由于这种行为,我不得不直观地访问每个相关性并接受/丢弃它。Anscombe 的四重奏也强调需要目视检查相关性。这就是为什么我想摆脱相关性并探索其他评估序列相似性的数学概念。

方法 A将 HLC 数据附加到一个长系列中,并将其与给定系列相关联。 方法 B将 H 数据与参考 H 数据、L 与 L、C 与 C 相关,然后将所有三个值相乘以计算净相关性显然它降低了整体相关性,但我觉得它倾向于细化产生的相关性。

我很抱歉这么晚才回复。我试图收集数据和代码相关性并为解释制作图形。这张图片显示了相关性非常准确时的罕见事件之一。即使相关值非常高,当结果匹配也具有高度误导性时,我也会制作和分享图形。

@adambowen:你在现场。实际上我已经实现了两种不同的算法:相关性和动态时间扭曲来访问系列相似性。对于DTW,我必须像你说的那样使用MSE。对于相关性,我可以同时使用 MSE(在这种情况下,它等于 DTW 对角线的成本,没有任何翘曲)和实际的 Pearson 相关公式。下面的图像是使用 Pearson 的相关公式得出的。我会查找您在帖子中提到的条款并尽快报告。实际上,我没有两个独立的时间序列。这只是一个时间序列,长度接近 10,000+ 点。我使用宽度为 N 的滑动窗口对时间序列进行自相关,以在序列表现与今天相似时定位事件。如果我能找到好的匹配,我也许能够根据识别出的每个匹配项后的移动方式来预测当前时间序列的移动。感谢您的洞察力。

2个回答

比较信号的两种最常用的方法(根据我的经验)是相关性和均方误差。非正式地,如果您将信号想象为某个 N 维空间中的一个点(如果您将它们想象为 3D 点,这往往会更容易),那么相关性测量这些点是否在同一方向(从“原点”)和均方误差衡量点是否在同一个地方(与原点无关,只要两个信号具有相同的原点)。哪个效果更好在某种程度上取决于系统中的信号和噪声类型。

MSE 似乎大致相当于您的示例:

mse = 0;
for( int i=0; i<N; ++i )
    mse += (x[i]-y[i])*(x[i]-y[i]);
mse /= N;

但是请注意,这并不是真正的皮尔逊相关性,更像是

xx = 0;
xy = 0;
yy = 0;

for( int i=0; i<N; ++i )
{
    xx += (x[i]-x_mean)*(x[i]-x_mean);
    xy += (x[i]-x_mean)*(y[i]-y_mean);
    yy += (y[i]-y_mean)*(y[i]-y_mean);
}

ppmcc = xy/std::sqrt(xx*yy);

给定信号均值 x_mean 和 y_mean。这非常接近纯相关性:

corr = 0;
for( int i=0; i<N; ++i )
    corr += x[i]*y[i];

但是,我认为当信号具有很强的 DC 分量(因为减去了平均值)并且被归一化时,皮尔逊相关性会更加稳健,因此其中一个信号的缩放不会导致相关性的成比例增加。

最后,如果您问题中的特定示例有问题,那么您还可以考虑平均绝对误差(L1 范数):

mae = 0;
for( int i=0; i<N; ++i )
    mae += std::abs(x[i]-y[i]);
mae /= N;

我知道所有三种方法都用于各种信号和图像处理应用程序,但不了解您的特定应用程序的更多信息,我无法说出哪种方法可能最有效。我会注意到 MAE 和 MSE 对数据呈现给他们的确切方式不太敏感,但如果平均误差不是你真正感兴趣的指标,那么他们不会给你你正在寻找的结果为了。如果您对信号的“方向”比所涉及的实际值更感兴趣,则相关方法可能会更好,但是它对数据的呈现方式更敏感,并且几乎可以肯定需要一些居中和归一化才能给出结果预计。

您可能需要查找Phase CorrelationCross CorrelationNormalized CorrelationMatched Filters其中大多数用于匹配具有未知时间延迟的较大信号中的某些子信号,但在您的情况下,如果您知道两个信号之间没有延迟,则可以只使用它们给出的零时间延迟值。

我不确定这是否是正确的方法。但是扩展您的数据会有帮助吗?尝试将值设置在 0 和 1 之间。我想这应该可行。