超級干貨 | 數(shù)據(jù)平滑9大妙招
作者:Peter 編輯:Peter
對數(shù)據(jù)進行平滑處理的方法有很多種,具體的選擇取決于數(shù)據(jù)的性質(zhì)和處理的目的。今天給大家分享9大常見數(shù)據(jù)平滑方法:
-
移動平均Moving Average -
指數(shù)平滑Exponential Smoothing -
低通濾波器 -
多項式擬合 -
貝塞爾曲線擬合 -
局部加權(quán)散點平滑Loess -
Kalman濾波 -
小波變換 -
Savitzky-Golay濾波
移動平均Moving Average
移動平均(Moving Average)是一種最簡單的數(shù)據(jù)平滑方法,用于平滑時間序列數(shù)據(jù)。它通過計算一定窗口內(nèi)數(shù)據(jù)點的平均值來減少噪音,同時保留數(shù)據(jù)的趨勢。移動平均可以是簡單移動平均(SMA)或指數(shù)加權(quán)移動平均(EMA)。
簡單移動平均(SMA): 簡單移動平均是一種通過計算數(shù)據(jù)點在一個固定窗口內(nèi)的平均值來平滑數(shù)據(jù)的方法。窗口的大小決定了平滑程度。較大的窗口將導致更平滑的曲線,但會減緩對趨勢的反應(yīng),而較小的窗口將更敏感地跟隨數(shù)據(jù)的波動。
import numpy as np
import matplotlib.pyplot as plt
# 生成示例數(shù)據(jù)
data = np.array([10, 15, 12, 18, 20, 14, 16, 22, 19, 25])
# 定義移動平均窗口大小
window_size = 3
# 計算簡單移動平均
sma = np.convolve(data, np.ones(window_size) / window_size, mode='valid')
# 繪制原始數(shù)據(jù)和移動平均曲線
plt.figure(figsize=(10, 6))
plt.plot(data, label="原始數(shù)據(jù)", marker='o', color='blue')
plt.plot(np.arange(window_size - 1, len(data)), sma, label="移動平均", color='red')
plt.legend()
plt.title("簡單移動平均示例")
plt.xlabel("數(shù)據(jù)點")
plt.ylabel("數(shù)值")
plt.grid(True)
plt.show()
指數(shù)加權(quán)移動平均-Exponential Weighted Moving Average,EWMA: 指數(shù)加權(quán)移動平均是一種通過對數(shù)據(jù)點應(yīng)用指數(shù)權(quán)重來平滑數(shù)據(jù)的方法。它對最近的數(shù)據(jù)點給予較高的權(quán)重,而對較早的數(shù)據(jù)點給予較低的權(quán)重。這使得EMA更適合用于追蹤快速變化的數(shù)據(jù)。
import numpy as np
import matplotlib.pyplot as plt
# 生成示例數(shù)據(jù)
data = np.array([10, 15, 12, 18, 20, 14, 16, 22, 19, 25])
# 定義平滑參數(shù)(通常稱為平滑因子)
alpha = 0.2
# 計算EMA
ema = [data[0]] # 初始EMA值等于第一個數(shù)據(jù)點
for i in range(1, len(data)):
ema.append(alpha * data[i] + (1 - alpha) * ema[-1])
# 繪制原始數(shù)據(jù)和EMA曲線
plt.figure(figsize=(10, 6))
plt.plot(data, label="原始數(shù)據(jù)", marker='o', color='blue')
plt.plot(ema, label="EMA", color='red')
plt.legend()
plt.title("指數(shù)加權(quán)移動平均(EMA)示例")
plt.xlabel("數(shù)據(jù)點")
plt.ylabel("數(shù)值")
plt.grid(True)
plt.show()
指數(shù)平滑Exponential Smoothing
指數(shù)平滑(Exponential Smoothing)是一種常用的時間序列數(shù)據(jù)平滑和預(yù)測方法,用于處理具有趨勢和季節(jié)性的數(shù)據(jù)。它通過分配不同權(quán)重給歷史數(shù)據(jù)點,將較高權(quán)重分配給較新的數(shù)據(jù),以捕獲數(shù)據(jù)的變化趨勢。指數(shù)平滑通常用于生成預(yù)測,特別是在需要對未來時間點進行預(yù)測的情況下。
指數(shù)平滑的主要特點包括:
-
加權(quán)平滑:指數(shù)平滑使用指數(shù)權(quán)重來平滑數(shù)據(jù)。較新的數(shù)據(jù)點獲得更高的權(quán)重,而較舊的數(shù)據(jù)點獲得較低的權(quán)重。這意味著它對最近的數(shù)據(jù)更為敏感,從而更好地捕獲了數(shù)據(jù)的最新趨勢。
-
三種主要形式:指數(shù)平滑有三種主要形式:簡單指數(shù)平滑、雙指數(shù)平滑和三重指數(shù)平滑。每種形式用于不同類型的數(shù)據(jù)和模式。
-
簡單指數(shù)平滑(Simple Exponential Smoothing)用于平滑具有趨勢和季節(jié)性的數(shù)據(jù)。
-
雙指數(shù)平滑(Double Exponential Smoothing)用于平滑具有趨勢但無季節(jié)性的數(shù)據(jù)。
-
三重指數(shù)平滑(Triple Exponential Smoothing)用于平滑同時具有趨勢和季節(jié)性的數(shù)據(jù)。
-
遞歸更新:指數(shù)平滑是一種遞歸方法,它將先前的平滑結(jié)果與新數(shù)據(jù)點相結(jié)合,以生成下一個時間點的平滑結(jié)果。
-
預(yù)測能力:指數(shù)平滑不僅用于平滑數(shù)據(jù),還可以用于生成未來時間點的預(yù)測。這使得它在需求預(yù)測、股票價格預(yù)測和銷售預(yù)測等領(lǐng)域非常有用。
-
適用性:指數(shù)平滑適用于平穩(wěn)或非平穩(wěn)的時間序列數(shù)據(jù),它能夠很好地處理趨勢、季節(jié)性和噪聲。
pip install statsmodels
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 生成示例時間序列數(shù)據(jù)
np.random.seed(0)
n = 100
index = pd.date_range(start="2022-01-01", periods=n, freq="D")
data = np.sin(np.linspace(0, 4 * np.pi, n)) + np.random.normal(0, 0.2, n)
time_series = pd.Series(data, index=index)
# 執(zhí)行指數(shù)平滑
model = ExponentialSmoothing(time_series, trend='add', seasonal='add', seasonal_periods=7)
results = model.fit()
# 生成平滑后的數(shù)據(jù)和預(yù)測
smoothed = results.fittedvalues
forecast = results.forecast(steps=30) # 預(yù)測未來30個時間點
# 繪制原始數(shù)據(jù)、平滑后的數(shù)據(jù)和預(yù)測
plt.figure(figsize=(10, 6))
plt.plot(time_series, label="原始數(shù)據(jù)", color='blue', alpha=0.6)
plt.plot(smoothed, label="指數(shù)平滑", color='red')
plt.plot(forecast, label="未來預(yù)測", color='green')
plt.legend()
plt.title("指數(shù)平滑示例")
plt.xlabel("時間")
plt.ylabel("數(shù)據(jù)值")
plt.grid(True)
plt.show()
低通濾波器
低通濾波器是一種信號處理工具,用于去除信號中高頻成分,從而保留低頻成分。在數(shù)據(jù)平滑的上下文中,低通濾波器用于減小或去除數(shù)據(jù)中的高頻噪聲或快速變化,以使數(shù)據(jù)趨于平滑,保留慢變化的趨勢或周期性特征。
低通濾波器的工作原理是將信號通過一個濾波器,該濾波器允許低頻成分通過,而抑制高頻成分。這通常通過濾波器的頻率響應(yīng)函數(shù)來實現(xiàn),頻率響應(yīng)函數(shù)定義了不同頻率上的濾波器的行為。低通濾波器通常用于以下應(yīng)用:
-
去除高頻噪聲:在測量、傳感器或通信中,信號通常會受到高頻噪聲的干擾,低通濾波器可用于去除這些噪聲。 -
數(shù)據(jù)平滑:在時間序列分析中,低通濾波器可以用來平滑數(shù)據(jù),去除短期波動,從而更好地識別趨勢和周期性特征。 -
圖像處理:在圖像處理中,低通濾波器可用于去除圖像中的高頻噪聲,使圖像更加平滑。 -
音頻處理:在音頻處理中,低通濾波器可用于去除音頻信號中的高頻噪聲,改善音質(zhì)。
提供一個Python案例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter
# 生成示例數(shù)據(jù)
fs = 1000 # 采樣頻率
t = np.linspace(0, 5, 5 * fs, endpoint=False)
data = 5 * np.sin(2 * np.pi * 3 * t) + 2 * np.sin(2 * np.pi * 50 * t)
# 設(shè)計巴特沃斯低通濾波器
cutoff_freq = 10 # 截止頻率(以Hz為單位)
nyquist_freq = 0.5 * fs
normal_cutoff = cutoff_freq / nyquist_freq
b, a = butter(4, normal_cutoff, btype='low', analog=False)
# 使用濾波器平滑數(shù)據(jù)
smoothed_data = lfilter(b, a, data)
# 繪制原始數(shù)據(jù)和平滑后的數(shù)據(jù)
plt.figure(figsize=(10, 6))
plt.plot(t, data, label="原始數(shù)據(jù)", color='blue')
plt.plot(t, smoothed_data, label="低通濾波后的數(shù)據(jù)", color='red')
plt.legend()
plt.title("巴特沃斯低通濾波器示例")
plt.xlabel("時間 (秒)")
plt.ylabel("數(shù)值")
plt.grid(True)
plt.show()
多項式擬合
多項式擬合(Polynomial Fitting)是一種數(shù)據(jù)平滑和曲線擬合的方法,它通過使用多項式函數(shù)來逼近或擬合原始數(shù)據(jù),以便更好地描述數(shù)據(jù)的趨勢或模式。多項式擬合的目標是找到一個多項式函數(shù),它在給定的數(shù)據(jù)點上經(jīng)過并能夠很好地擬合這些點。
多項式擬合的一般形式如下:
其中, 是自變量, 是依賴于 的因變量, 是多項式系數(shù)。通過調(diào)整這些系數(shù),可以使多項式函數(shù)更好地擬合數(shù)據(jù)。
多項式擬合常用于以下情況:
-
數(shù)據(jù)平滑:多項式擬合可以用來消除數(shù)據(jù)中的噪聲或波動,從而獲得平滑的曲線。
-
趨勢分析:多項式擬合可用于識別數(shù)據(jù)中的趨勢,例如線性趨勢(一階多項式)、二次趨勢(二階多項式)或更高階的趨勢。
-
曲線擬合:多項式擬合可用于擬合實驗數(shù)據(jù),以獲得與理論模型或理論曲線的最佳擬合。
-
數(shù)據(jù)插值:多項式插值是多項式擬合的特殊情況,它通過已知數(shù)據(jù)點之間的多項式來估計中間值。
多項式擬合的一般原則是選擇合適的多項式階數(shù)。階數(shù)過低可能無法很好地擬合數(shù)據(jù),而階數(shù)過高可能會導致過度擬合,對新數(shù)據(jù)的波動非常敏感。因此,選擇適當?shù)亩囗検诫A數(shù)是關(guān)鍵。
提供一個3階多項式擬合的案例:
import numpy as np
import matplotlib.pyplot as plt
# 示例數(shù)據(jù)
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([10, 8, 7, 6, 5, 4, 3, 2, 1])
# 三階多項式擬合
degree = 3
coefficients = np.polyfit(x, y, degree)
# 構(gòu)建多項式函數(shù)
poly = np.poly1d(coefficients)
# 生成用于繪圖的新X值
x_new = np.linspace(min(x), max(x), 100)
# 計算擬合后的Y值
y_new = poly(x_new)
# 繪制原始數(shù)據(jù)和三階多項式擬合曲線
plt.figure(figsize=(10, 6))
plt.scatter(x, y, label="原始數(shù)據(jù)", color='blue')
plt.plot(x_new, y_new, label="三階多項式擬合", color='red')
plt.legend()
plt.title("三階多項式擬合示例")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.grid(True)
plt.show()
貝塞爾曲線
貝塞爾曲線(Bézier Curve)是一種數(shù)學曲線,常用于計算機圖形和數(shù)據(jù)可視化領(lǐng)域。它的特點是平滑、連續(xù),由控制點(Control Points)定義,可以用于創(chuàng)建平滑曲線或路徑。貝塞爾曲線最常見的形式是二次貝塞爾曲線和三次貝塞爾曲線,分別由2個和3個控制點定義。
以下是二次和三次貝塞爾曲線的簡要介紹:
-
二次貝塞爾曲線:二次貝塞爾曲線由三個點定義,分別是起始點(P0)、控制點(P1),和結(jié)束點(P2)。曲線從起始點出發(fā),經(jīng)過控制點,最終到達結(jié)束點。曲線的形狀由控制點的位置決定,控制點引導了曲線的彎曲和走勢。 -
三次貝塞爾曲線:三次貝塞爾曲線由四個點定義,分別是起始點(P0)、兩個控制點(P1和P2),和結(jié)束點(P3)。曲線從起始點出發(fā),經(jīng)過兩個控制點,最終到達結(jié)束點。與二次貝塞爾曲線相比,三次貝塞爾曲線具有更高的靈活性,可以描述更復(fù)雜的曲線形狀。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
# 生成示例數(shù)據(jù)
x = np.linspace(0, 10, 20) # X坐標
y = np.random.rand(20) * 10 # 隨機生成Y坐標
# 創(chuàng)建貝塞爾曲線插值器
tck = make_interp_spline(x, y, k=3)
# 生成平滑后的數(shù)據(jù)點
x_new = np.linspace(min(x), max(x), 200) # 新的X坐標范圍
y_smooth = tck(x_new)
# 繪制原始數(shù)據(jù)和平滑后的貝塞爾曲線
plt.figure(figsize=(10, 6))
plt.scatter(x, y, label="原始數(shù)據(jù)", color='blue')
plt.plot(x_new, y_smooth, label="平滑后的貝塞爾曲線", color='red')
plt.legend()
plt.title("貝塞爾曲線數(shù)據(jù)平滑示例")
plt.xlabel("X坐標")
plt.ylabel("Y坐標")
plt.grid(True)
plt.show()
局部加權(quán)散點平滑(Loess平滑)
Loess(局部加權(quán)散點平滑,Locally Weighted Scatterplot Smoothing)是一種非參數(shù)的數(shù)據(jù)平滑方法,通常用于擬合或平滑散點數(shù)據(jù),以捕獲數(shù)據(jù)的局部趨勢和模式。Loess平滑是一種局部回歸方法,它對于不同區(qū)域的數(shù)據(jù)采用不同的權(quán)重,以確保在數(shù)據(jù)的每個局部區(qū)域上都能獲得較好的擬合。
Loess平滑的核心思想是在每個數(shù)據(jù)點附近擬合一個局部多項式模型,然后使用這些局部模型的加權(quán)平均來獲得平滑曲線。在每個局部區(qū)域,距離某個數(shù)據(jù)點越近的數(shù)據(jù)點將獲得更大的權(quán)重,而距離較遠的數(shù)據(jù)點將獲得較小的權(quán)重。這樣,Loess能夠更好地擬合數(shù)據(jù)的局部特性,同時降低了全局模型的過擬合風險。
Loess平滑的主要特點包括:
-
非參數(shù)性:Loess不需要假設(shè)數(shù)據(jù)的特定分布或形式,因此適用于各種類型的數(shù)據(jù)。 -
局部性:Loess平滑主要關(guān)注數(shù)據(jù)的局部趨勢,而不是全局趨勢,這使它特別適用于具有復(fù)雜、非線性趨勢的數(shù)據(jù)。 -
可調(diào)參數(shù):Loess允許用戶指定平滑窗口的大小或帶寬,以控制局部模型的擬合程度。較小的帶寬會導致更強的局部適應(yīng),而較大的帶寬會導致更平滑的曲線。
Loess平滑通常用于探索性數(shù)據(jù)分析、數(shù)據(jù)可視化、時間序列分析和回歸建模的預(yù)處理步驟。它可以幫助用戶識別數(shù)據(jù)中的局部特性、趨勢和周期性,從而更好地理解數(shù)據(jù)的結(jié)構(gòu)。在統(tǒng)計學和數(shù)據(jù)科學中,Loess平滑是一種有用的工具,用于減少噪聲并提取數(shù)據(jù)中的信號。
提供一個Python案例:
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 生成示例數(shù)據(jù)
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(0, 0.2, 100)
# 執(zhí)行Loess平滑
lowess = sm.nonparametric.lowess(y, x, frac=0.3) # frac參數(shù)控制平滑帶寬,可以調(diào)整以獲得不同的平滑度
# 獲取平滑后的數(shù)據(jù)
x_smooth, y_smooth = lowess.T
# 繪制原始數(shù)據(jù)和Loess平滑曲線
plt.figure(figsize=(10, 6))
plt.scatter(x, y, label="原始數(shù)據(jù)", color='blue', alpha=0.6)
plt.plot(x_smooth, y_smooth, label="Loess平滑", color='red')
plt.legend()
plt.title("Loess平滑示例")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.grid(True)
plt.show()
Kalman濾波
卡爾曼濾波(Kalman Filter)是一種用于狀態(tài)估計和數(shù)據(jù)融合的強大數(shù)學和統(tǒng)計工具,最初由R.E. Kalman于1960年開發(fā)。卡爾曼濾波是一種遞歸的、最優(yōu)的狀態(tài)估計方法,通常用于處理含有噪聲的時間序列數(shù)據(jù),以估計系統(tǒng)的狀態(tài),同時提供估計的不確定性。
卡爾曼濾波的主要用途包括:
-
狀態(tài)估計:卡爾曼濾波可以用于估計線性或非線性動態(tài)系統(tǒng)的狀態(tài)變量,尤其是在系統(tǒng)中存在不完全或噪聲觀測的情況下。這對于跟蹤運動物體、導航、定位以及環(huán)境感知等應(yīng)用非常有用。 -
數(shù)據(jù)融合:卡爾曼濾波可以將多個傳感器提供的信息融合在一起,以提供更準確的估計,降低估計誤差。 -
控制系統(tǒng):卡爾曼濾波還用于控制系統(tǒng),以估計系統(tǒng)狀態(tài)并制定控制策略,從而實現(xiàn)系統(tǒng)的自動控制。
卡爾曼濾波基于狀態(tài)空間模型,其中系統(tǒng)狀態(tài)通過線性或非線性動態(tài)模型演化,并且由觀測模型通過傳感器觀測進行測量??柭鼮V波使用貝葉斯估計方法來不斷更新系統(tǒng)狀態(tài)的估計,考慮了過去的狀態(tài)估計和新的觀測數(shù)據(jù),以提供最優(yōu)的狀態(tài)估計結(jié)果??柭鼮V波的主要目標是最小化估計誤差的方差,從而提供最優(yōu)的狀態(tài)估計結(jié)果。
卡爾曼濾波有多個變種,包括擴展卡爾曼濾波(Extended Kalman Filter,EKF)和無跡卡爾曼濾波(Unscented Kalman Filter,UKF),用于處理非線性系統(tǒng)。這些濾波器的應(yīng)用范圍廣泛,包括航空航天、自動駕駛汽車、機器人技術(shù)、金融建模和天氣預(yù)測等領(lǐng)域。它們在數(shù)據(jù)平滑和狀態(tài)估計方面提供了強大的工具。
先安裝:
pip install pykalman
import numpy as np
import matplotlib.pyplot as plt
from pykalman import KalmanFilter
# 生成示例數(shù)據(jù)
np.random.seed(0)
n = 100
x = np.linspace(0, 10, n)
y = 0.1 * x + np.random.normal(0, 0.5, n)
# 創(chuàng)建卡爾曼濾波器
kf = KalmanFilter(initial_state_mean=0, n_dim_obs=1)
kf = kf.em(y, n_iter=10)
# 獲取平滑后的數(shù)據(jù)
(filtered_state_means, _) = kf.filter(y)
# 繪制原始數(shù)據(jù)和卡爾曼濾波后的數(shù)據(jù)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label="原始數(shù)據(jù)", color='blue', alpha=0.6)
plt.plot(x, filtered_state_means, label="卡爾曼濾波", color='red')
plt.legend()
plt.title("卡爾曼濾波數(shù)據(jù)平滑示例")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.grid(True)
plt.show()
小波變換
小波變換(Wavelet Transform)是一種用于信號處理和數(shù)據(jù)分析的數(shù)學方法。它是一種多尺度分析技術(shù),可以將信號分解成不同尺度和頻率的分量,以便更好地理解信號的局部特征和結(jié)構(gòu)。小波變換在許多領(lǐng)域,包括信號處理、圖像處理、數(shù)據(jù)壓縮和模式識別等方面都有廣泛的應(yīng)用。
小波變換的主要特點包括:
-
多尺度分析:小波變換能夠在不同尺度上分解信號,因此可以檢測信號中的局部特征,從高頻細節(jié)到低頻整體。 -
時頻局部性:與傅立葉變換不同,小波變換具有時頻局部性,可以在時間和頻率上同時分析信號。這使得它在分析非平穩(wěn)信號和非線性信號時非常有用。 -
數(shù)據(jù)壓縮:小波變換可以用于數(shù)據(jù)壓縮,通過保留主要的小波系數(shù),可以減小數(shù)據(jù)的存儲空間和傳輸帶寬。 -
特征提取:小波變換可以用于從信號中提取特征,用于模式識別、分類和檢測任務(wù)。
小波變換有兩種主要類型:連續(xù)小波變換(Continuous Wavelet Transform,CWT)和離散小波變換(Discrete Wavelet Transform,DWT)。
-
連續(xù)小波變換(CWT)是一種在不同尺度上滑動小波函數(shù),對信號進行連續(xù)分解的方法。CWT的主要特點是它提供了連續(xù)的尺度信息,但計算成本較高。 -
離散小波變換(DWT)是一種通過濾波和下采樣操作將信號分解成不同尺度的方法。DWT通過將信號分解成高頻和低頻部分,然后繼續(xù)對低頻部分進行分解,從而實現(xiàn)多尺度分析。DWT的計算效率高,適用于實際工程應(yīng)用。
先安裝:
pip install PyWavelets
Python案例:
import numpy as np
import matplotlib.pyplot as plt
import pywt
# 生成示例數(shù)據(jù)
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x) + np.random.normal(0, 0.1, len(x))
# 執(zhí)行小波變換
wavelet = 'db4' # 選擇小波基函數(shù)
level = 3 # 分解的級數(shù)
coeffs = pywt.wavedec(y, wavelet, level=level)
# 將高頻部分系數(shù)置零,以實現(xiàn)平滑
coeffs_smoothed = [coeffs[0]] + [np.zeros_like(coeffs[i]) for i in range(1, len(coeffs))]
# 重構(gòu)平滑后的信號
y_smoothed = pywt.waverec(coeffs_smoothed, wavelet)
# 繪制原始數(shù)據(jù)和平滑后的數(shù)據(jù)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label="原始數(shù)據(jù)", color='blue', alpha=0.6)
plt.plot(x, y_smoothed, label="小波平滑", color='red')
plt.legend()
plt.title("小波變換數(shù)據(jù)平滑示例")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.grid(True)
plt.show()
Savitzky-Golay濾波器
Savitzky-Golay濾波是一種信號處理技術(shù),用于對離散數(shù)據(jù)序列進行平滑和去噪。它是一種線性平滑濾波器,通過擬合多項式來估計數(shù)據(jù)點的平均值,以減小噪聲和突發(fā)波動。Savitzky-Golay濾波器的主要思想是在局部窗口內(nèi)對數(shù)據(jù)進行多項式擬合,從而獲得平滑后的估計值。
Savitzky-Golay濾波的主要特點包括:
-
局部擬合:Savitzky-Golay濾波器使用一個固定大小的局部窗口來擬合多項式,通常窗口大小為奇數(shù)。對于每個數(shù)據(jù)點,它使用窗口內(nèi)的數(shù)據(jù)點來執(zhí)行多項式擬合,以獲得該點的平滑估計值。
-
多項式擬合:濾波器使用多項式來擬合窗口內(nèi)的數(shù)據(jù)點。常用的多項式階數(shù)是2(二次多項式)或4(四次多項式),但可以根據(jù)需要選擇不同的階數(shù)。
-
數(shù)據(jù)平滑:Savitzky-Golay濾波器旨在平滑數(shù)據(jù),減小數(shù)據(jù)中的高頻噪聲和突發(fā)波動。它保留了數(shù)據(jù)中的趨勢和主要特征,同時去除了噪聲。
-
適用性:Savitzky-Golay濾波器適用于各種領(lǐng)域,包括信號處理、光譜分析、化學分析、生物醫(yī)學數(shù)據(jù)處理和圖像處理等。它特別適用于光譜數(shù)據(jù),因為它可以去除儀器噪聲和光譜線的窄化。
-
平滑度可調(diào):通過調(diào)整窗口大小和多項式階數(shù),可以控制濾波器的平滑度。較大的窗口和較高的多項式階數(shù)可以提供更平滑的結(jié)果,而較小的窗口和較低的多項式階數(shù)可以更好地保留數(shù)據(jù)的細節(jié)。
Savitzky-Golay濾波器是一種有效的數(shù)據(jù)平滑和去噪技術(shù),它可以在許多領(lǐng)域用于處理具有噪聲的數(shù)據(jù),以提高數(shù)據(jù)的可解釋性和分析能力。在Python中,你可以使用scipy.signal.savgol_filter函數(shù)來執(zhí)行Savitzky-Golay濾波。
# pip install scipy
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter
# 生成示例數(shù)據(jù)
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.normal(0, 0.2, len(x))
# 執(zhí)行Savitzky-Golay濾波
window_length = 11 # 窗口長度(奇數(shù))
polyorder = 2 # 多項式階數(shù)
y_smoothed = savgol_filter(y, window_length, polyorder)
# 繪制原始數(shù)據(jù)和平滑后的數(shù)據(jù)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label="原始數(shù)據(jù)", color='blue', alpha=0.6)
plt.plot(x, y_smoothed, label="Savitzky-Golay濾波", color='red')
plt.legend()
plt.title("Savitzky-Golay濾波器數(shù)據(jù)平滑示例")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.grid(True)
plt.show()
往期精彩回顧
交流群
歡迎加入機器學習愛好者微信群一起和同行交流,目前有機器學習交流群、博士群、博士申報交流、CV、NLP等微信群,請掃描下面的微信號加群,備注:”昵稱-學校/公司-研究方向“,例如:”張小明-浙大-CV“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~(也可以加入機器學習交流qq群772479961)
