hampel滤波,去除异常值

hampel滤波,去除异常值

本文源自(https://www.mathworks.com/help/signal/ref/hampel.html)

语法

y = hampel(x)

对输入向量x进行hampel滤波,检测和删除异常值。对于x的每个样本,该函数计算由样本及其周围六个样本组成的窗口的中值,每边三个。并利用中位数绝对值估计了各样本对中值的标准差。如果某个样本与中值相差超过三个标准差,则用中值替换该样本。如果x是一个矩阵,hampel将x的每一列都看成是独立的通道。

y = hampel(x,k)

可指定窗口中每个样本周围的样本数,每边k个。

y = hampel(x,k,nsigma)

可指定几倍的标准差,nsigma指一个样本的值与中值的差值

[y,j] = hampel(___)

返回一个逻辑矩阵,该矩阵在作为异常值标识的所有点的位置都为真。此语法接受来自以前语法的任何输入参数。

[y,j,xmedian,xsigma] = hampel(___)

返回x的每个元素的局部中值和估计标准差。

hampel(___)

没有输出参数的hampel()绘制经过过滤的信号,并标注被删除的异常值。

具体例子

1. 移除正弦波上的尖刺

生成100个正弦信号样本。用尖峰代替第6和第20个样品。

x = sin(2pi(0:99)/100); x(6) = 2; x(20) = -2;

使用hampel定位每个与局部中值相差超过三个标准差的样本。测量窗口由样品及其周围的六个样品组成,每边三个。

[y,i,xmedian,xsigma] = hampel(x);

绘制经过滤波的信号并标注异常值

n = 1:length(x);
plot(n,x)
hold on
plot(n,xmedian-3xsigma,n,xmedian+3xsigma)
plot(find(i),x(i),‘sk’)
hold off
legend(‘Original signal’,‘Lower limit’,‘Upper limit’,‘Outliers’)

在这里插入图片描述
重新计算,但现在在计算中值时,每边只取一个相邻的样本。该函数将极值视为异常值。

hampel(x,1)

在这里插入图片描述

2. 多通道信号的hampel滤波

生成由不同频率的正弦信号组成的双通道信号。在随机位置放置尖峰。使用NaNs随机添加缺失的样本。重置随机数生成器以获得可重复的结果。画出信号。

rng(‘default’)
n = 59;
x = sin(pi./[15 10]’(1:n)+pi/3)’;
spk = randi(2
n,9,1);
x(spk) = x(spk)2;
x(randi(2
n,6,1)) = NaN;
plot(x)

在这里插入图片描述
使用带有默认设置的hampel过滤信号。

y = hampel(x);
plot(y)

在这里插入图片描述
增加移动窗口的长度,并降低将样本视为异常值的阈值。

y = hampel(x,4,2); %每边4个样本,±2σ
plot(y)

在这里插入图片描述
输出每个通道的运行中位数。将中值覆盖在信号图上。

[y,j,xmd,xsd] = hampel(x,4,2);
plot(x)
hold on
plot(xmd,’–’)

在这里插入图片描述

3. 找出多通道信号中的异常值

在单位方差的高斯白噪声中产生由两个不同频率的正弦信号组成的多通道信号。

rng(‘default’)
t = 0:60;
x = sin(pi./[10;2]*t)’+randn(numel(t),2);

对信号用hampel滤波器。取那些与周围9个样本窗口的中值相差两个以上标准差的点作为异常值。输出一个逻辑矩阵,该矩阵在异常值的位置为真。

k = 4;
nsig = 2;
[y,h] = hampel(x,k,nsig);

把信号的每个通道画在它自己的一组坐标轴上。绘制原始信号、滤波信号和异常值。标注离群点位置。

for k = 1:2
hk = h(:,k);
ax = subplot(2,1,k);
plot(t,x(:,k))
hold on
plot(t,y(:,k))
plot(t(hk),x(hk,k),’*’)
hold off
ax.XTick = t(hk);
end

在这里插入图片描述

4. hampel滤波器返回的信号统计量

生成100个正弦信号样本。用尖峰代替第6和第20个样品。

n = 1:100;
x = sin(2pin/100);
x(6) = 2;
x(20) = -2;

使用hampel计算每个样本的局部中值和估计标准差。使用输入参数的默认值:

  • 窗口大小为2×3+1=7
  • 与窗口中值相差超过三个标准差的点被认为是异常值。

[y,i,xmedian,xsigma] = hampel(x);

plot(n,x)
hold on
plot(n,[1;1]xmedian+3[-1;1]*xsigma)
plot(find(i),x(i),‘sk’)
hold off
legend(‘Signal’,‘Lower’,‘Upper’,‘Outliers’)

在这里插入图片描述
重新计算,使用一个2×10+1=21的窗口和两个标准差作为识别异常值的标准。

sds = 2;
adj = 10;
[y,i,xmedian,xsigma] = hampel(x,adj,sds);
plot(n,x)
hold on
plot(n,[1;1]xmedian+sds[-1;1]*xsigma)
plot(find(i),x(i),‘sk’)
hold off
legend(‘Signal’,‘Lower’,‘Upper’,‘Outliers’)

在这里插入图片描述

输入参数

  1. x——输入信号,可以是向量或矩阵
  2. k——每边的相邻样本数,必须是整数,默认为3
    在这里插入图片描述
  3. nsigma——标准差的数量,必须是实标量,默认为3

输出参数

  1. y——滤波后的信号,返回一个和x大小一样的向量或矩阵
  2. j——离群值指数,返回一个和x大小一样的向量或矩阵,数据类型为逻辑运算符
  3. xmedian——样本中位数,返回一个和x大小一样的向量或矩阵
  4. xsigma——估计标准差,返回一个和x大小一样的向量或矩阵
### 回答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函数,可以有效地检测和替换异常值,从而提高数据的质量和精确性。这对于在信号处理、统计分析和图像处理等领域中处理不完美数据非常有用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值