亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何去除數據中的移動平均線?

如何去除數據中的移動平均線?

UYOU 2023-03-22 10:43:52
我有數據 y = [-10.5, -2.0, 5.0, -3.0, 4.0, 9.5, 18.0, 14.5, 11.0, 13.5, 25.0, 21.5, 7.5, 5.5, 3.5, 10.5, 7.0, 3.5, 1.5, 16.0, 20.0, 22.5, 20.5, 33.5, 27.0, 38.5, 29.0, 27.0, 28.0, 24.5, 24.0, 29.5, 39.5]我想擺脫垂直移動平均線趨勢(只獲得圍繞恒定平均值的差異)。在這種情況下,我應該得到類似的東西:[-7, -2, 2, -4, 0, 3, 8, 5, 2, 3, 10, 7, -3, -5, -7, -3, - 6, -9, -11, -2, 0, 1, -1, 7, 2, 9, 2, 0, 0, -3, -4, -1, 5]輸入 輸出我的想法是在Input上擬合一條線(線性回歸),得到類似 ax + b 的東西并僅刪除 ax 以近似所需的Output。有沒有更標準的數學方法來解決我的問題?(最好用 Python 實現)。另外,我認為Output和 mean( Output )的不同值之間的一些差異可能被錯誤地視為直線斜率的一部分,因此,線性回歸可能會給我一個 a'x + b',其中 a' 關閉但不同于 a. 我怎樣才能緩解這個問題?
查看完整描述

2 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

考慮到瘋狂的 FFT 優化,我認為 1D 卷積會很快完成你想要的事情:


import numpy as np

from scipy.signal import convolve


window_size = 10

y = np.array([-10.5, -2.0, 5.0, -3.0, 4.0, 9.5, 18.0, 14.5, 11.0, 13.5, 25.0, 21.5, 7.5, 5.5, 3.5, 10.5, 7.0, 3.5, 1.5, 16.0, 20.0, 22.5, 20.5, 33.5, 27.0, 38.5, 29.0, 27.0, 28.0, 24.5, 24.0, 29.5, 39.5])

# Pad with zeros for entries before/after the window size

y_rolling_mean = convolve(y, np.ones(window_size)/window_size, 'same')

y_without_mean = y - y_rolling_mean

請記住,這通常會為第一個和最后一個 window_size//2 條目產生不準確的值,因為它們的滾動平均值是使用零填充計算的,但是您可以通過在卷積之前填充您想要的值來更改此行為。


更新:添加了一個圖來與第二個答案進行比較

http://img1.sycdn.imooc.com//641a6b890001d4d506460479.jpg

卷積如何找到滾動平均值?

本質上,一維卷積可以被認為是兩個數組的點積,因為一個數組“滑動”到另一個數組(實際上,相關性在技術上對于這種情況是正確的,但我現在不會深入討論)。為了獲得更好的想法,請考慮以下場景:


y = 1 2 3 4 5 6

x = 1 1 1

c = <convolution of y and x>

卷積數組的每個輸出索引都是“x”與其相同長度窗口與 y 的點積。所以


c[0] = sum(y[0:3]*x)

c[1] = sum(y[1:4]*x)

c[2] = sum(y[2:5]*x)

...

現在,考慮 N 個數字的平均值就是 sum(numbers)/N 這一事實?;蛘撸?/p>


mean = sum(1/N * number)

結合我們在上面學到的關于卷積的知識,讓 x = 1/len(x) 的每個元素:


y =  1    2    3   4  5   6

x = 1/3  1/3  1/3

c[0] = 1/3*y[0] + 1/3*y[1] + 1/3*y[2] = mean(y[0:3])

c[1] = 1/3*y[1] + 1/3*y[2] + 1/3*y[3] = mean(y[1:4]

...

整潔的!與特殊形式的 x 向量卷積的副作用是該范圍的平均值!因此,通過將 x 選擇為 be,np.ones(window_size)/window_size您可以保證卷積將在 上產生滾動平均值y。


當圖像中存在大量不需要的高頻噪聲時,這在圖像處理中大量使用:

http://img1.sycdn.imooc.com//641a6ba30001584e15800397.jpg

請注意,與您的一維數據類似,噪聲圖像中的尖銳“峰”和斑點被“舍入”了。

為什么窗口大小為 10?

老實說,我隨機選擇了窗口大小。實際上,這在很大程度上取決于您期望數據的噪聲程度以及您希望輸出看起來有多“平滑”。窗口大小越大,輸出看起來越平坦。根據提供的玩具編號,似乎有一個 10 的窗口可以在y不破壞信號的情況下壓平足夠的尖峰。


查看完整回答
反對 回復 2023-03-22
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

正如您在問題中提到的線性擬合的想法,我會尋求簡單但相當穩健的解決方案,即擬合最佳線并簡單地從數據中減去它以獲得去趨勢跟蹤:


import numpy as np

import matplotlib.pyplot as plt


x = np.arange(len(y)) 

coefs = np.polyfit(x, y, 1)

line = coefs[1] + x*coefs[0]

detrended = y-line

fig, ax = plt.subplots(1)

ax.plot(y)

ax.plot(line)

ax.plot(detrended)

http://img1.sycdn.imooc.com//641a6bb500017a4f05630430.jpg

查看完整回答
反對 回復 2023-03-22
  • 2 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號