使用 Hampel 进行离群点检测

a2f0b0fe76c99d7515aaabf58401fea7.png

来源:数据STUDIO‍‍‍‍
本文约1800字,建议阅读5分钟
本文我们将利用 hampel 库,探讨如何应用这种离群点检测技术。

在时间序列数据分析领域,识别和处理异常点是至关重要的任务。异常点或离群点是明显偏离预期模式的数据点,可能表明存在错误、欺诈或有价值的见解。

应对这一挑战的一种有效技术是汉普尔过滤器(Hampel Filter)。

解密汉普尔滤波法

汉普尔滤波法(Hampel filter)是检测和处理时间序列数据中离群值的一种稳健的方法。它依赖于中位数绝对偏差(MAD)[2] 并采用滚动窗口来识别离群值。MAD 是一种稳健的数据离散度量,以偏离中值的绝对偏差的中值计算。

配置汉普尔滤波器涉及两个参数:

  • 窗口大小:该参数决定用于评估每个数据点的移动窗口的大小。它基本上定义了我们查找异常值的范围。

  • 阈值:仔细选择阈值对于避免触发有价值数据的异常值检测至关重要。


Hampel与 Python 的结合

要在 Python 项目中使用 Hampel 过滤器,首先要通过 pip 安装软件包:

 
 
pip install hampel

然后在 Python 脚本中导入它:

 
 
from hampel import hampel

hampel函数有三个可用参数:

  • data 要过滤的输入一维数据(pandas.Series 或 numpy.ndarray)。

  • window_size(可选):用于离群点检测的移动窗口大小(默认为 5)。

  • n_sigma(可选):异常值检测的标准差个数(默认值为 3.0)。它与上一节讨论的阈值概念有关,即通过调整该参数,我们可以对可能的异常值有或多或少的容忍度。

现在,生成合成数据,在其中的 20、40、60、80 位置引入四个离群值(当然,在实际情况中问题不会这么简单,但这是一个很好的例子,可以了解 hampel 如何工作 )。

import matplotlib.pyplot as pltimport numpy as npfrom hampel import hampeloriginal_data = np.sin(np.linspace(0, 10, 100)) + np.random.normal(0, 0.1, 100)# Add outliers to the original datafor index, value in zip([20, 40, 60, 80], [2.0, -1.9, 2.1, -0.5]):    original_data[index] = valu

绘制 original_data 时,会看到如下内容:

48a316186b3f2de7972f01fcfd6df4e4.png

要直观地检测出我们引入的四个离群值非常容易,看看Hampel 是否也可以。

 
 
result = hampel(original_data, window_size=10)

函数 hampel 返回一个 Result 数据类型,它包含以下属性:

  • filtered_data:已替换异常值的数据。

  • outlier_indices: 检测到的异常值的指数。

  • medians:滑动窗口内的中值。

  • median_absolute_deviations:滑动窗口内的绝对偏差中值 (MAD)。

  • thresholds:异常值检测的阈值。

可以像这样简单地访问这些属性:

filtered_data = result.filtered_dataoutlier_indices = result.outlier_indicesmedians = result.mediansmad_values = result.median_absolute_deviationsthresholds = result.thresholds

例如,如果我们现在打印 filtered_data ,我们就会得到一个经过清理的 original_data 版本,即没有异常值的版本。

ec9aee62874a557dc6ea9728b98c2966.png

Hampel 设法删除了之前添加的异常值!

不过,可以利用 hampel提供的信息,设计出个更有趣的图表。在我的例子中,我会把个异常值画成红点,还会个灰色带,代表算法在每个点使用的阈值。此外,我还会在第一个图的下方创建另一个图,显示过滤后的数据。

使用 matplotlib 可以非常轻松地完成这项工作:

fig, axes = plt.subplots(2, 1, figsize=(8, 6))# Plot the original data with estimated standard deviations in the first subplotaxes[0].plot(original_data, label='Original Data', color='b')axes[0].fill_between(range(len(original_data)), medians + thresholds,                     medians - thresholds, color='gray', alpha=0.5, label='Median +- Threshold')axes[0].set_xlabel('Data Point')axes[0].set_ylabel('Value')axes[0].set_title('Original Data with Bands representing Upper and Lower limits')for i in outlier_indices:    axes[0].plot(i, original_data[i], 'ro', markersize=5)  # Mark as redaxes[0].legend()# Plot the filtered data in the second subplotaxes[1].plot(filtered_data, label='Filtered Data', color='g')axes[1].set_xlabel('Data Point')axes[1].set_ylabel('Value')axes[1].set_title('Filtered Data')axes[1].legend()# Adjust spacing between subplotsplt.tight_layout()# Show the plotsplt.show()

运行该代码段后,应该会看到这样一幅美丽的图画

793a1f6853a3e2123cc0783c103d975d.png

万一你想复制粘贴完整的 Python 脚本 …👇👇 👇

import matplotlib.pyplot as pltimport numpy as npfrom hampel import hampel# 推荐关注@公众号:数据STUDIO 更多优质推文定期推送original_data = np.sin(np.linspace(0, 10, 100)) + np.random.normal(0, 0.1, 100)# Add outliers to the original datafor index, value in zip([20, 40, 60, 80], [2.0, -1.9, 2.1, -0.5]):    original_data[index] = valueresult = hampel(original_data, window_size=10)filtered_data = result.filtered_dataoutlier_indices = result.outlier_indicesmedians = result.mediansthresholds = result.thresholdsfig, axes = plt.subplots(2, 1, figsize=(8, 6))# Plot the original data with estimated standard deviations in the first subplotaxes[0].plot(original_data, label='Original Data', color='b')axes[0].fill_between(range(len(original_data)), medians + thresholds,                     medians - thresholds, color='gray', alpha=0.5, label='Median +- Threshold')axes[0].set_xlabel('Data Point')axes[0].set_ylabel('Value')axes[0].set_title('Original Data with Bands representing Upper and Lower limits')for i in outlier_indices:    axes[0].plot(i, original_data[i], 'ro', markersize=5)  # Mark as redaxes[0].legend()# Plot the filtered data in the second subplotaxes[1].plot(filtered_data, label='Filtered Data', color='g')axes[1].set_xlabel('Data Point')axes[1].set_ylabel('Value')axes[1].set_title('Filtered Data')axes[1].legend()# Adjust spacing between subplotsplt.tight_layout()# Show the plotsplt.show()

参考资料:

[1]hampel 库: https://github.com/MichaelisTrofficus/hampel_filter

[2]中位数绝对偏差

(MAD): https://en.wikipedia.org/wiki/Median_absolute_deviation

编辑:王菁

校对:林亦霖

0e361b1dc671f87bd7bad0be3643d58c.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab的hampel函数是一种用于极值检测和异常值处理的函数。它基于Hampel滤波器算法,可以用来处理时间序列数据中的离群值。 Hampel滤波器是一种基于中位数的滤波器,它通过计算中位数与数据点的偏差来判断是否为离群值。hampel函数接受输入参数data,其中包含要处理的时间序列数据。该函数还可以通过输入参数window和threshold来调整中位数与数据点之间的偏差阈值,以便更好地检测离群值。 使用hampel函数进行离群值处理的步骤如下:首先,数据会被分段,每个段的大小由窗口参数决定。然后,对于每个段,hampel函数会计算该段内数据点与中位数的偏差,并将偏差大于阈值的数据点标记为离群值。最后,可以选择性地使用线性插值来填充或删除这些离群值。 hampel函数在时间序列分析、信号处理和数据预处理等领域具有广泛的应用。它可以有效地检测和处理异常值,有助于提高数据的准确性和可靠性。在Matlab中使用hampel函数非常简单,只需提供要处理的数据和相应的参数即可,而函数会自动执行滤波和异常值处理的过程。 总之,Matlab的hampel函数是一种用于极值检测和异常值处理的强大工具,它基于Hampel滤波器算法,可用于时间序列数据中的离群值处理。 ### 回答2: Hampel算法是一种基于统计学原理的异常值检测方法,在MATLAB软件中也有相应的实现。Hampel算法通过计算数据点与周围数据的偏离程度,来判断是否为异常值。该算法主要包括以下几个步骤: 1. 定义数据点的周围窗口范围:通常通过定义一个窗口大小来确定数据点周围的数据范围。 2. 计算数据点与周围数据的偏离程度:对于窗口内的每个数据点,计算其与周围数据点的差异程度。可以使用中位数绝对偏差(MAD)或标准差等统计指标来度量。 3. 利用阈值确定是否为异常值:根据预先设定的阈值,判断数据点的偏离程度是否超过了阈值。如果超过了阈值,则将其视为异常值。 4. 替换异常值或标记异常值:可以通过替换异常值为周围数据的中位数或者将异常值标记为NaN等方法进行处理。 MATLAB中的hampel函数可以用来实现Hampel算法。该函数接受输入数据和窗口大小等参数,并返回处理后的数据。可以根据具体需求选择合适的输入参数。使用该函数可以方便地进行异常值检测和处理。另外,MATLAB中还提供了其他异常值处理方法和工具,如箱线图、局部离群因子等,用户可以根据具体要求选择合适的方法进行数据处理。 ### 回答3: MATLAB中的Hampel函数是用于对数据集进行Hampel滤波处理的函数。Hampel滤波是一种基于中位数绝对偏差(MAD)的异常值检测与替换方法。 该函数的基本使用方法如下: 1. 为了使用Hampel函数,需首先在MATLAB环境中加载相应的工具包。例如:Netlab、Signal Processing Toolbox等。 2. 使用Hampel函数,需要输入三个参数:输入数据集、窗口大小和阈值。 - 输入数据集是待处理的数据,可以是一维数组或矩阵。 - 窗口大小是指用于计算中位数和MAD的数据点的数量。 - 阈值是用于判断异常值的临界点,超过该阈值即被认为是异常值。 3. 通过调用Hampel函数,对输入的数据集进行滤波处理。 - 首先,根据窗口大小选择数据集的一个子集。 - 然后,计算该子集的中位数M和MAD。 - 最后,将数据集中任何偏离M的值大于阈值的数据点替换为中位数M。 通过使用Hampel函数,可以有效地检测和替换异常值,从而提高数据的质量和精确性。这对于在信号处理、统计分析和图像处理等领域中处理不完美数据非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值