2011-11-05 117 views
1

我得到一個線圖,Y軸的值爲X軸,有X軸的時間。 X軸有5分鐘的分辨率。我正在尋找某種算法來幫助我教iPhone來了解線路將要去的地方。我從來沒有采取過算法類,所以任何幫助將不勝感激。我需要知道的是,如果這條生產線持續上漲一定數量的細分市場。以編程方式分析折線圖

現在我執行以下操作: 如果當前數據點的Y值大於上一個值,則將斜率計數器加1。如果相等,則將斜率計數器增加0.如果該值較小,則遞減斜率計數器。

if(current>previous) 
{ 
    counter++; 
} 
else if(current<previous) 
{ 
    counter--; 
} 

這產生了鋸齒狀的圖形,這更容易分析。但是由於窗口大小的問題,圖形可能會「反彈」。這是我期望我的邏輯有問題的地方。

我希望有某種CS算法可以幫助我完成這項任務,因爲我甚至不知道需要在這個問題中鍵入什麼樣的關鍵字。

+0

通過「反彈」,你的意思是線路撞到地板/天花板並反射回來了嗎?或者他們超出規模? – yosukesabai

+1

通過閱讀標題和Q的前半部分,我發現的關鍵詞是'時間系列','趨勢',http://en.wikipedia.org/wiki/Trend_estimation,就像那樣。基本上它讀取時間序列數據並嘗試猜測它要去的地方,或者試圖消除額外的不平衡。 – yosukesabai

回答

2

如果您只需要知道某線段是否持續上升了一定數量的線段,爲什麼不只有一個計數器遞增,直至達到特定數量的線段,或者如果線路斷線,這樣的:如果你想更好的預測

if (data[datasize - 1] > data[0]) { 
    println("Overall trend is up."); 
} else if (data[datasize - 1] < data[0]) { 
    println("Overall trend is down."); 
} else { 
    print("Overall trend is flat."); 
} 

- 樣,這裏的:

int counter = 0; 
for (int i = 1; i < datasize; i++) { 
    if (data[i] > data[i - 1]) { 
    ++counter; 
    if (counter == THRESHOLD) { 
     println("trending up at %d.", i); 
    } 
    } else if (data[i] < data[i - 1]) { 
    counter = 0; 
    } 
} 

如果你只是想看看如果線路或整體趨勢向上或向下,可能你只是這樣做到目前爲止的時間線,這是猜測它看起來會是什麼就像將來一樣,有兩種途徑可以探索。首先是「迴歸分析」或「迴歸線」。這對於隨着時間推移而增加或減少的數據來說效果最好,並且會得到這些增加或減少的速率(線的平均斜率)。

第二個是「快速傅里葉變換」 - 這對於像波一樣的線是有用的,因爲它們保持在最小和最大邊界之間並且具有一定的週期(或者一定數量的週期,這是什麼該方程將神聖)。

玩得開心。這是一個需要解決的令人愉快的問題。

+1

預測算法的另一個家族包括諸如http://en.wikipedia.org/wiki/Exponential_smoothing#Double_exponential_smoothing - 您可能只需要複製公式和http://en.wikipedia.org/wiki/Kalman_filter ,這需要更多的工作來實施。 – mcdowella

+0

雙指數平滑可能會有幫助,但在我的情況下,它可能會扭曲測量結果,因爲它「過沖」。我已經在其他地方使用卡爾曼濾波器了,我會看看如何將它應用於這個問題。 –

+0

自動遞增計數器代碼非常類似於我已有的代碼。我遇到的一個問題是,在視覺上,我可以看到圖形上升時有輕微的不規則性(1級下降,3級上升等)。這將重置上述算法。雙exp平滑將平滑它,但是我的信號峯值太不可預測,無法正確設置a和b值iirc。 –

1

您可能正在尋找的是Linear Regression,這是估計與您的數據(在一個最小二乘意義上)的良好的直線匹配。這條線的斜率可能會幫助您告訴「它要去哪裏」,具體取決於基礎模型的行爲。