一、数据平滑
- 数据平滑是一项重要的预处理步骤。平滑处理能够减少数据中的噪声和波动,使数据更加平滑,从而更易于分析和可视化。
3种方法
- 移动平均法
- 高斯滤波
- 样条插值
二、移动平均法
- 移动平均是一种简单而有效的平滑技术,它通过计算数据点周围窗口内的平均值来减少数据的波动。这种方法对于减少随机噪声特别有效。
import numpy as np
import matplotlib.pyplot as plt
# 示例高程数据(类阶梯数据)
elevation_data = np.array([10, 10, 11, 11, 10, 10, 20, 20, 20, 10, 10, 15, 15, 15, 10, 10])
# 移动平均平滑
def moving_average(data, window_size):
return np.convolve(data, np.ones(window_size)/window_size, mode='valid')
window_size = 3
smoothed_data = moving_average(elevation_data, window_size)
# 绘制原始数据和平滑数据
plt.figure(figsize=(10, 5))
plt.plot(elevation_data, label='Original Data')
plt.plot(np.arange(window_size//2, len(elevation_data)-window_size//2), smoothed_data, label='Smoothed Data (Moving Average)', color='red')
plt.legend()
plt.xlabel('Index')
plt.ylabel('Elevation')
plt.title('Elevation Profile with Moving Average Smoothing')
plt.show()
三、高斯滤波
- 高斯滤波是一种通过卷积高斯核来平滑数据的方法。这种方法能够根据不同数据点的权重(由高斯函数确定)来平滑数据,从而在保持数据整体趋势的同时减少噪声。
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter
# 示例高程数据(类阶梯数据)
elevation_data = np.array([10, 10, 11, 11, 10, 10, 20, 20, 20, 10, 10, 15, 15, 15, 10, 10])
# 高斯滤波平滑
sigma = 1 # 标准差
smoothed_data_gaussian = gaussian_filter(elevation_data, sigma=sigma)
# 绘制原始数据和平滑数据
plt.figure(figsize=(10, 5))
plt.plot(elevation_data, label='Original Data')
plt.plot(smoothed_data_gaussian, label='Smoothed Data (Gaussian Filter)', color='green')
plt.legend()
plt.xlabel('Index')
plt.ylabel('Elevation')
plt.title('Elevation Profile with Gaussian Filter Smoothing')
plt.show()
四、样条插值
- 样条插值通过拟合一个平滑的样条函数来平滑数据。这种方法适用于需要高度平滑且保留数据局部特征的情况。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
# 示例高程数据(类阶梯数据)
elevation_data = np.array([10, 10, 11, 11, 10, 10, 20, 20, 20, 10, 10, 15, 15, 15, 10, 10])
# 样条插值平滑
x = np.arange(len(elevation_data))
spl = UnivariateSpline(x, elevation_data, s=1)
smoothed_data_spline = spl(x)
# 绘制原始数据和平滑数据
plt.figure(figsize=(10, 5))
plt.plot(elevation_data, label='Original Data')
plt.plot(smoothed_data_spline, label='Smoothed Data (Spline)', color='purple')
plt.legend()
plt.xlabel('Index')
plt.ylabel('Elevation')
plt.title('Elevation Profile with Spline Smoothing')
plt.show()
五、优缺点
- 移动平均法:简单快速,但平滑效果有限,容易导致数据丢失。
- 高斯滤波:提供平滑且可调节的平滑度(通过 sigma 参数),但可能引入偏移。
- 样条插值:可以精确拟合数据,平滑效果好,但可能会产生过拟合,尤其是在噪声数据较多时。
可根据数据特性和具体需求,选择合适的平滑方法。
可以尝试不同的方法并比较结果,以找到最佳方案。
六、资料
[北海yy]的博客:
https://blog.csdn.net/weixin_44217158/article/details/140947987