系列相似性的可靠衡量標準 - 相關性對我來說並不適用
我正在嘗試確定一種方法,以編程方式將一個特定時間序列與大約 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 的滑動窗口對時間序列進行自相關,以在序列表現與今天相似時定位事件。如果我能找到好的匹配,我也許能夠根據識別出的每個匹配項後的移動方式來預測當前時間序列的移動。感謝您的洞察力。
比較信號的兩種最常用的方法(根據我的經驗)是相關性和均方誤差。非正式地,如果您將信號想像為某個 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 Correlation、Cross Correlation、Normalized Correlation和Matched Filters。其中大多數用於匹配具有未知時間延遲的較大信號中的某些子信號,但在您的情況下,如果您知道兩個信號之間沒有延遲,則可以只使用它們給出的零時間延遲值。