如何找到時序數據中線性的趨勢

2020-12-04 deephub

有時需要從時序數據中刪除趨勢,為下一步或數據清理過程的一部分做準備。如果您可以確定趨勢,那麼只需從數據中減去它,結果就是非趨勢數據。

如果趨勢是線性的,你可以通過線性回歸找到它。但如果趨勢不是線性的呢?我們一會兒就會看到我們能做些什麼。

但是在此之前,我們先看看什麼叫線性趨勢

線性趨勢

下面是帶有趨勢的時序數據:

raw.githubusercontent.com/FlorinAndrei/misc/master/qdata.csv

讓我們加載它,看看它是什麼樣子:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.metrics import mean_squared_error, r2_scoreser = pd.read_csv('qdata.csv', index_col=0, squeeze=True)serx0 473.9177641 75.3248252 -306.9694793 53.2714764 372.966686... 95 4650.55047396 4604.57334497 4891.70463898 5265.94816299 5618.909339Name: y, Length: 100, dtype: float64plt.plot(ser)plt.show()

好的,這裡有一個趨勢。我們假設它是線性的,我們來做線性回歸來找出答案。這是線性回歸的一個直接應用。上面導入的sklearn庫擁有我們進行回歸所需要的一切。

X = ser.indexX = np.reshape(X, (len(X), 1))y = ser.valuesmodel = LinearRegression()model.fit(X, y)trend = model.predict(X)plt.plot(y)plt.plot(trend)plt.legend(['data', 'trend'])plt.show()

看起來很合適,但可能不是很合適。讓我們從數據中減去趨勢,看看非趨勢數據是什麼樣的:

detr = [y[i] - trend[i] for i in range(0, len(y))]plt.plot(detr)plt.title('data detrended in a linear fashion')plt.show()

不是很令人信服。數據中仍有一個凹的趨勢。最初的趨勢可能不是線性的。

讓我們計算數據和我們提取的趨勢之間的RMSE和R。

r2 = r2_score(y, trend)rmse = np.sqrt(mean_squared_error(y, trend))print('r2:', r2)print('rmse', rmse)r2: 0.8782399672701933rmse 553.6078593008505

多項式趨勢

如果趨勢不是線性的,我們可以嘗試用多項式曲線來擬合它。但問題是:即使我們擬合的曲線是高次多項式,我們仍然可以用線性回歸來找到它。

考慮這個二次表達式:

y = a + bx + cx

我們要找的值是a, b, c,和他們都是線性的。忘記x的權重,我們看的是權重,b和c,所以線性回歸——它只是發生,我們將不得不在多個維度做線性回歸。

假設數據呈二次趨勢。然後我們需要把X變換成二次形式:

pf = PolynomialFeatures(degree=2)Xp = pf.fit_transform(X)Xp

array([[1.000e+00, 0.000e+00, 0.000e+00],[1.000e+00, 1.000e+00, 1.000e+00], [1.000e+00, 2.000e+00, 4.000e+00], [1.000e+00, 3.000e+00, 9.000e+00], [1.000e+00, 4.000e+00, 1.600e+01], [1.000e+00, 5.000e+00, 2.500e+01], [1.000e+00, 6.000e+00, 3.600e+01],... [1.000e+00, 9.600e+01, 9.216e+03], [1.000e+00, 9.700e+01, 9.409e+03], [1.000e+00, 9.800e+01, 9.604e+03], [1.000e+00, 9.900e+01, 9.801e+03]])

第一列是X的0次方。第二列是X,第三列是X的2次方。這就像上面顯示的二次表達式(y = a + bx + cx)

現在我們將使用二次形式來擬合數據並生成二次趨勢。用線性回歸方法求出二次表達式的參數。

md2 = LinearRegression()md2.fit(Xp, y)trendp = md2.predict(Xp)

趨勢是怎樣的?

plt.plot(X, y)plt.plot(X, trendp)plt.legend(['data', 'polynomial trend'])plt.show()

更接近了,不是嗎?現在讓我們看看非趨勢數據:

detrpoly = [y[i] - trendp[i] for i in range(0, len(y))]plt.plot(X, detrpoly)plt.title('polynomially detrended data')plt.show()

這顯然更好。沒有任何可以從視覺上看出的趨勢。但是讓我們看看數字是怎麼說的:

r2 = r2_score(y, trendp)rmse = np.sqrt(mean_squared_error(y, trendp))print('r2:', r2)print('rmse', rmse)r2: 0.9343217231542871rmse 406.5937924291518

與線性趨勢相比,隨著多項式趨勢,R曲線增大,RMSE減小。兩者都是好的改變。兩種均值多項式的擬合效果都優於線性擬合。

高階多項式

你可以選擇任意階的多項式只要在這裡給N賦不同的值:

pf = PolynomialFeatures(degree=N)

一般來說,對N使用較低的值。如果增加了N,發生的情況不太嚴重,則返回較小的值。

只有一個彎曲的曲線可以用二次函數來描述。有兩個彎的曲線可以用三次函數來描述。等等。N-1彎需要一個N次冪的表達式。

如果N增加很多,最終你的「最佳擬合」曲線將開始跟隨數據中的雜音,而不是擬合趨勢。你已經超擬合了曲線,現在沒有意義了。或者減少N,或者增加更多數據點。

這樣我們將這個線性模型的數據去除(差值),使用剩餘的數據進行時間序列的訓練,可以得到更精確的結果

相關焦點

  • 金融時序預測:狀態空間模型和卡爾曼濾波
    該系列是由不同的組成部分,如趨勢、季節、周期、變化以及解釋變量和幹預分別建模,然後放在狀態空間模型中。 數據基於1986年以來的Schlumberger Limited歷史數據。 我們可以對數據進行差分或對數變換來消除趨勢和季節性。在許多統計和計量經濟學應用的背景下,這些成分的知識具有潛在的重要性。趨勢和季節的估計可以通過最大化殘差均方差從差分序列中恢復,但是這並不像直接對分量建模那樣吸引人。我們要記住,真實的時序從來都不是靜止的。 在這裡,我們將使用簡單的時間序列移動平均平滑法來估計趨勢分量。
  • 日吞吐萬億,騰訊雲時序資料庫CTSDB解密
    ,工廠中設備傳感器採集的指標數據,傳統網際網路公司的監控數據等。實際上,這些按照時間順序記錄系統、設備狀態變化的數據都是時序數據(Time Series),它普遍存在於網際網路、物聯網、IT基礎設施中。得益於軟硬體技術的快速發展,處理如此龐大的時序數據集的成本在持續降低,更多公司開始持續收集、分析數據,用於異常處理、趨勢預測、精準營銷、風險控制等場景,希望利用數據的潛在價值,提高公司盈利能力和競爭力。
  • 如何看懂時序圖(經典)
    所以只需要看兩個寫時序:  ① 當我們要寫指令字,設置LCD1602的工作方式時:需要把RS置為低電平,RW置為低電平,然後將數據送到數據口D0~D7,最後E引腳一個高脈衝將數據寫入。  ② 當我們要寫入數據字,在1602上實現顯示時:需要把RS置為高電平,RW置為低電平,然後將數據送到數據口D0~D7,最後E引腳一個高脈衝將數據寫入。
  • 金融時序預測:狀態空間模型和卡爾曼濾波(附代碼)
    4 時間序列分解對時間序列進行分解意味著將其分解為組成成分,這些成分通常是趨勢成分和隨機成分,如果數據是季節性的,則是季節性成分。分解涉及到將時間序列分離到這些單獨的成分中。我們可以對數據進行差分或對數變換來消除趨勢和季節性。
  • 來自開放數據的閃電新聞:如何從數據中找到新聞線索
    談及「數據新聞」,我們通常有兩種操作思路:一是通過「數據挖掘」(data mining),找到新聞點;二是在已有的新聞中,添加呈現數據的元素。其中,「數據挖掘」指從資料庫中尋找到有價值新聞點。這些從資料庫中爬取的信息可能會給新聞調查帶來新的調查思路。
  • 如何用線性回歸模型做數據分析?
    編輯導語:在日常工作中,很多時候都會用到數據分析的方法,線性回歸模型看起來非常簡單,但實際上它的十分重要;本文作者分享了關於如何用線性回歸模型做數據分析的方法,我們一起來學習一下。
  • 大數據分析為什麼要學習R中的線性建模
    對於大數據分析師來說,能夠建立線性模型是絕對必要的,但是數據分析人員甚至業餘愛好者也可以從線性建模的功能中受益匪淺。R中的線性建模,這是大數據分析師中的新課程,它將從頭開始教你此技能。你準備好動手開始建模嗎?
  • 如何用EXCEL線性回歸分析法快速做數據分析預測
    令我吃驚的是,本人以完整的數據推算做依據,做出的報告結果居然與僅入職數周,數據不齊全的Edwin制定的報告結果吻合度達到99%以上。仍清楚記得,筆者曾用得是標準的周轉天數計算公式反推法,而Edwin用的正是本文重點介紹的二元一次線性回歸分析法。二元一次線性回歸分析法是一種數據分析模型。
  • 你了解機器學習中的線性回歸嗎
    它們對輸入和輸出之間的線性關係進行編碼,從而更加重視重要的數據特徵,並降低不重要的數據特徵的權重。注意,我們向X值為1的每一行添加了一個「隱藏組件」。這讓我們能夠計算w的點積,其偏置項為 。偏置項允許模型將其計算的線性超平面移開原點,從而允許模型對非零中心數據中的關係進行建模。簡化後的模型可以表示為。 這是大多數線性回歸實現的基礎模型。
  • FPGA設計中的時序問題的詳細分析與解決方案
    然而,試圖正確地對設計進行約束以保證滿足時序要求的過程幾乎同樣令人費神。找到並確定時序約束本身通常也是非常令人頭痛的問題。 時序問題的惱人之處在於沒有哪種方法能夠解決所有類型的問題。由於客戶對於和現場應用工程師共享原始碼通常非常敏感,因此我們通常都是通過將工具的潛力發揮到極致來幫助客戶解決其時序問題。當然好消息就是通過這種方法以及優化RTL代碼,可以解決大多數時序問題。
  • 簡單線性回歸(一)
    回歸分析(regression analysis )是研究一個變量如何隨另一些變量變化的方法。例如,學習成績會受努力的時間,方法,個人的智慧,教育資源等因素影響;疾病的發生與生活環境,方式,遺傳因素,自身體質等影響。常見的回歸分析有 線性回歸、非線性回歸、多重線性回歸、Logistic回歸等等。
  • 正點原子FPGA靜態時序分析與時序約束教程
    靜態時序分析是檢查晶片時序特性的一種方法,可以用來檢查信號在晶片中的傳播是否符合時序約束的要求。相比於動態時序分析,靜態時序分析不需要測試矢量,而是直接對晶片的時序進行約束,然後通過時序分析工具給出時序分析結果,並根據設計者的修復使設計完全滿足時序約束的要求。
  • 教你在真實圖像數據上應用線性濾波器
    由於網絡應該學習到的特點已經被提前知道,即產生數據的過程和參數是被完全定義並且完全在我們的掌控之中,學習任務可以很容易的被確定。我們可以通過構建一個非常簡單的單層卷積網絡並訓練它利用多種核進行線性濾波來實現上述過程。在接下來的實驗中,我們在數據集上運用一種圖像處理和計算機視覺中常用的傳統邊緣檢測方式——Sobel 邊緣濾波,並訓練我們的模型進行類似的線性映射。
  • SPSS如何使用一般線性模型中的單變量進行分析?
    s p s s 線性模型中的單變量主要是用來檢測數據的,下面讓我們來看一下如何檢測吧。1.首先打開s p s s 軟體,要檢測年齡性別與睡眠關係的這個數據有效性。2.點擊分析選項卡,彈出下拉菜單中找到單變量選項。3.我們將因變量設置為睡眠時間。
  • 示波器和I2C時序波形圖的關係分析
    I2C簡介 I2C總線只需要兩條線,一條SDA數據線,一條SCL時鐘線;根據這兩條線的高低電平、上升沿、下降沿就可以實現主機與I2C設備的通訊 I2C與示波器 對於I2C總線的數據,我們要用到示波器,這樣我們才能抓取到信號,而且必須同時採集SDA和SCL的數據;該如何抓取呢?
  • 從靜態時序分析到SDRAM時序收斂(上篇)
    小墨在做SDRAM時序約束的時候深有體會,即使我們老老實實的按照時序計算公式將延時計算出來添加到工程中去,時序報告也顯示時序收斂並且也幾乎達到了建立保持時間的平衡狀態,前後仿真也沒什麼問題,以為一切就緒了,但是下板後就是跑不起來,最後我還是改動了一下約束參數,有時候甚至改動幅度與計算幅度相比較大,當然還是在保證時序收斂的情況下,下板之後竟然跑起來了,可能是我第一次接觸時序這個高大上的概念
  • SPSS-線性相關與多重線性回歸
    本期:相關與回歸日常工作中,我們不僅關心2變量之間的差異,也關注2變量之間的聯繫,比如年齡與血壓
  • ZETA技術通過數蛙科技百億級物流標籤軌跡時序數據壓測
    濤思時序資料庫TDengine是目前針對時序資料庫的性能最優的開源資料庫平臺,廣泛運用於工業、電力、車聯網、大數據領域。數蛙科技結合縱行科技的ZETag雲標籤與濤思數據的高容量時序資料庫,為物流領域未來高增長、高並發的物流標籤場景,進行了1000萬接入、百億級時序數據的運營級全業務模擬壓力測試。
  • 如何比較兩組數據的變化趨勢是不是有顯著性差異?
    這裡面其實是兩個問題:1)這兩組數的變化趨勢是否一致?2)這兩組數是否有差異?我們把數據先丟進Excel,再細講怎麼分析:1)首先回答第一個問題:這兩組數的變化趨勢是否一致?分析兩組數的變化趨勢是否一致,應當選用相關性分析。
  • 如何找到正確的超平面
    在機器學習中,支持向量機是在分類與回歸分析中分析數據的監督式學習模型與相關的學習算法。給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練算法創建一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器。