数据平滑和离群值检测

目录

移动窗口方法

常见的平滑方法

检测离群值

非均匀数据


        数据平滑指用于消除数据中不需要的噪声或行为的技术,而离群值检测用于标识与其余数据显著不同的数据点。

移动窗口方法

        移动窗口方法是分批处理数据的方式,通常是为了从统计角度表示数据中的相邻点。移动平均值是一种常见的数据平滑技术,它沿着数据滑动窗,同时计算每个窗内点的均值。这可以帮助消除从一个数据点到下一个数据点的非显著变化。

        例如,假设每分钟测量一次风速,持续约 3 小时。使用 movmean 函数和 5 分钟的窗口大小可去除高速阵风。

load windData.mat
mins = 1:length(speed);
window = 5;
meanspeed = movmean(speed,window);
plot(mins,speed,mins,meanspeed)
axis tight
legend("Measured Wind Speed","Average Wind Speed over 5 min Window")
xlabel("Time")
ylabel("Speed")

如图所示:

同样,可以使用 movmedian 函数计算滑动窗中的风速中位数。

medianspeed = movmedian(speed,window);
plot(mins,speed,mins,medianspeed)
axis tight
legend("Measured Wind Speed","Median Wind Speed over 5 min Window")
xlabel("Time")
ylabel("Speed")

如图所示:

        并非所有数据都适合用移动窗口方法进行平滑处理。例如,创建插入了随机噪声的正弦信号。

t = 1:0.2:15;
A = sin(2*pi*t) + cos(2*pi*0.5*t);
Anoise = A + 0.5*rand(1,length(t));
plot(t,A,t,Anoise)
axis tight
legend("Original Data","Noisy Data")

如图所示:

        使用移动均值和大小为 3 的窗口对含噪数据进行平滑处理。

window = 3;
Amean = movmean(Anoise,window);
plot(t,A,t,Amean)
axis tight
legend("Original Data","Moving Mean - Window Size 3")

如图所示:

        移动均值方法可获得数据的大致形状,但不能非常准确地捕获波谷(局部最小值)。由于波谷点在每个窗口中两个较大的邻点之间,因此均值不是那些点的理想近似值。如果使窗口大小变大,均值将完全消除较短的波峰。对于这种类型的数据,您可能需要考虑其他平滑技术。

Amean = movmean(Anoise,5);
plot(t,A,t,Amean)
axis tight
legend("Original Data","Moving Mean - Window Size 5")

如图所示:

常见的平滑方法

        smoothdata 函数提供几种平滑选项,如 Savitzky-Golay 方法,这是一种常用的信号处理平滑技术。默认情况下,smoothdata 根据数据为方法选择最佳估计窗口大小。

        使用 Savitzky-Golay 方法可对含噪信号 Anoise 进行平滑处理,并输出它使用的窗口大小。与 movmean 相比,该方法可提供更好的波谷近似值。

[Asgolay,window] = smoothdata(Anoise,"sgolay");
plot(t,A,t,Asgolay)
axis tight
legend("Original Data","Savitzky-Golay","location","best")

如图所示:

window

window = 3

        稳健的 Lowess 方法是另一种平滑方法,尤其适用于含噪数据还包含离群值的情形。在含噪数据中插入离群值,并使用稳健的 Lowess 方法对数据进行平滑处理,从而消除离群值。

Anoise(36) = 20;
Arlowess = smoothdata(Anoise,"rlowess",5);
plot(t,Anoise,t,Arlowess)
axis tight
legend("Noisy Data","Robust Lowess")

如图所示:

检测离群值

        数据中的离群值可能使数据处理结果和其他计算量严重失真。例如,如果您尝试用移动平均值方法对包含离群值的数据进行平滑处理,则可能得到误导性的波峰或波谷。

Amedian = smoothdata(Anoise,"movmedian");
plot(t,Anoise,t,Amedian)
axis tight
legend("Noisy Data","Moving Median")

如图所示:

        当检测到离群值时,isoutlier 函数返回逻辑值 1。验证 Anoise 中离群值的索引和值。

TF = isoutlier(Anoise);
ind = find(TF)

ind = 36

Aoutlier = Anoise(ind)

Aoutlier = 20

        可以使用 filloutliers 函数并指定填充方法来替换数据中的离群值。例如,用紧挨 Anoise 中离群值右侧的邻点值填充该离群值。

Afill = filloutliers(Anoise,"next");
plot(t,Anoise,t,Afill,"o-")
axis tight
legend("Noisy Data with Outlier","Noisy Data with Filled Outlier")

如图所示:

        也可以使用 rmoutliers 函数从数据中删除离群值。例如,删除 Anoise 中的离群值。

Aremove = rmoutliers(Anoise);
plot(t,Anoise,t(~TF),Aremove,"o-")
axis tight
legend("Noisy Data with Outlier","Noisy Data with Outlier Removed")

如图所示:

非均匀数据

        并非所有数据都由等间距点组成,这会影响数据处理的方法。创建一个 datetime 向量,其中包含 Airreg 中数据的不规则采样时间。time 向量表示了前 30 分钟内每分钟采集一次的样本和两天内每小时采集一次的样本。

t0 = datetime(2014,1,1,1,1,1);
timeminutes = sort(t0 + minutes(1:30));
timehours = t0 + hours(1:48);
time = [timeminutes timehours];
Airreg = rand(1,length(time));
plot(time,Airreg)
axis tight

如图所示:

        默认情况下,smoothdata 按照等间距整数进行平滑处理,在本例中为 1,2,...,78。由于整数时间戳与 Airreg 中各点的采样不协调,前半小时的数据在平滑后仍然出现噪声。

Adefault = smoothdata(Airreg,"movmean",3);
plot(time,Airreg,time,Adefault)
axis tight
legend("Original Data","Smoothed Data with Default Sample Points")

如图所示:

        MATLAB® 中的许多数据处理函数(包括 smoothdata、movmean 和 filloutliers)允许您提供样本点,从而确保相对于其采样单位和频率处理数据。要消除 Airreg 中前半小时数据的高频变化,请将 SamplePoints 名称-值参数和 time 中的时间戳结合使用。

Asamplepoints = smoothdata(Airreg,"movmean", ...
    hours(3),"SamplePoints",time);
plot(time,Airreg,time,Asamplepoints)
axis tight
legend("Original Data","Smoothed Data with Sample Points")

如图所示:

### 关于离群值检测在图像处理中的方法 #### 基础概念 离群值检测在图像处理中是一个复杂的问题,因为传统的统计方法(如 Z-Score 或 Boxplots)难以直接应用于高维数据的空间分布特性。因此,在解决此类问题时,需要考虑更合适的算法框架[^1]。 #### 方法概述 以下是几种常见的用于图像处理的离群值检测方法: 1. **基于直方图的离群值检测** 这一方法假设特征之间相互独立,并通过构建直方图来评估像素或区域是否属于异常情况。这种方法的优点在于其高效性简单性,但由于忽略了特征之间的相关性,可能会牺牲一定的准确性[^2]。 2. **中值滤波器 (Median Filtering)** 中值滤波是一种经典的图像预处理技术,特别适用于去除椒盐噪声等类型的离群值。通过对局部邻域内的像素取中间值,它可以有效平滑掉孤立的异常点,而不会显著影响整体结构信息[^3]。 下面展示了一个简单的 Python 实现示例: ```python import cv2 # 加载灰度图像 image = cv2.imread('image_with_noise.jpg', cv2.IMREAD_GRAYSCALE) # 应用中值滤波 filtered_image = cv2.medianBlur(image, 5) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Filtered Image', filtered_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. **视频处理与时域一致性优化** 对于动态场景下的离群值检测(例如视频流),除了空间维度外还需要关注时间维度的一致性。一些研究表明,虽然现有的图像级算法能够很好地单独作用于每一帧,但在连续序列上的应用可能导致闪烁或其他不连贯现象。为此,有学者提出了通用框架以增强这些算法的时间稳定性[^4]。 4. **高级模型与深度学习方法** 随着 deep learning 技术的发展,越来越多的研究者尝试利用神经网络自动提取复杂的模式并识别其中存在的异常部分。这类方案通常涉及训练自编码器(autoencoder),使其学会重建正常样本;当输入含有明显偏差的数据时,则会产生较大的重构误差从而被标记出来。 #### 结论 综上所述,针对不同应用场景可以选择相应的策略来进行高效的图像离群值探测工作。无论是采用传统信号处理手段还是现代机器学习工具,都需要充分理解具体需求以及目标对象的特点才能取得最佳成效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值