Python의 부드러운 데이터

Shivam Arora 2023년1월30일
  1. scipy.signal.savgol_filter() 메서드를 사용하여 Python에서 데이터 평활화
  2. numpy.convolve 메서드를 사용하여 Python에서 데이터 평활화
  3. statsmodels.kernel_regression을 사용하여 Python에서 데이터 평활화
Python의 부드러운 데이터

Python은 데이터 분석 및 시각화에 광범위한 응용 프로그램을 가지고 있습니다. 많은 관측치가 포함된 방대한 데이터 세트를 분석할 때 최종 플롯을 더 주의 깊게 연구하기 위해 그래프의 곡선을 매끄럽게 해야 하는 상황이 발생할 수 있습니다. 우리는 다른 방법을 사용하여 파이썬에서 이것을 달성하는 방법을 논의할 것입니다.

scipy.signal.savgol_filter() 메서드를 사용하여 Python에서 데이터 평활화

Savitzky-Golay 필터는 그래프를 평활화하기 위해 데이터 포인트를 사용하는 디지털 필터입니다. 작은 창을 만들고 해당 창의 데이터에 다항식을 적용한 다음 해당 다항식을 사용하여 특정 창의 중심점을 가정하는 최소 자승법을 사용합니다. 다음으로, 윈도우는 하나의 데이터 포인트만큼 이동하고 모든 이웃이 서로 상대적으로 조정될 때까지 프로세스가 반복됩니다.

scipy.signal.savgol_filter() 함수를 사용하여 Python에서 이를 구현할 수 있습니다.

다음 예를 참조하십시오.

import numpy as np
from scipy.signal import savgol_filter
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.2
yhat = savgol_filter(y, 51, 3)

plt.plot(x, y)
plt.plot(x, yhat, color="green")
plt.show()

출력:

파이썬 부드러운 데이터 1

위의 예에서는 필터링 방법을 사용하여 y축에 표시할 데이터를 평활화했습니다. 차이를 관찰할 수 있도록 원본 데이터와 평활 데이터를 모두 표시했습니다.

numpy.convolve 메서드를 사용하여 Python에서 데이터 평활화

numpy.convolve() 두 1차원 시퀀스의 이산 선형 컨볼루션을 제공합니다. 이를 사용하여 데이터를 필터링하고 평활화할 수 있는 이동 평균을 생성합니다.

이것은 좋은 방법으로 간주되지 않습니다.

예를 들어,

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.8


def smooth(y, box_pts):
    box = np.ones(box_pts) / box_pts
    y_smooth = np.convolve(y, box, mode="same")
    return y_smooth


plt.plot(x, y)
plt.plot(x, smooth(y, 3))
plt.plot(x, smooth(y, 19))

출력:

파이썬 부드러운 데이터 2

위의 예에서 우리는 시간 델타가 3과 19인 두 이동 평균을 플로팅했습니다. 둘 다 그래프에 플로팅했습니다.

이동 평균을 계산하기 위해 다른 방법을 사용할 수도 있습니다.

statsmodels.kernel_regression을 사용하여 Python에서 데이터 평활화

커널 회귀는 y = g(X) + e인 조건부 평균 E[y|X]를 계산하고 모델에 맞습니다. 제어 변수를 기반으로 데이터를 평활화하는 데 사용할 수 있습니다.

이를 수행하려면 statsmodels 모듈의 KernelReg() 함수를 사용해야 합니다.

예를 들어,

from statsmodels.nonparametric.kernel_regression import KernelReg
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.random(100) * 0.2

kr = KernelReg(y, x, "c")
plt.plot(x, y, "+")
y_pred, y_std = kr.fit(x)

plt.plot(x, y_pred)
plt.show()

출력:

파이썬 부드러운 데이터 3

이 방법은 좋은 결과를 생성하지만 매우 느린 것으로 간주됩니다. 푸리에 변환을 사용할 수도 있지만 주기적 데이터에서만 작동합니다.

관련 문장 - Python Graph