• 对数据去趋势处理方法


    目录

    去除数据的线性趋势

    简介

    从数据中去除线性趋势


    去除数据的线性趋势

    简介

            ​函数 detrend 从数据中减去均值或最佳拟合线(以最小二乘方式)。如果数据包含多个数据列,detrend 会分别处理每个数据列。

            通过从数据中去除线性趋势,能够将分析集中在趋势数据的波动上。线性趋势通常表示数据的系统性增加或减少。例如,传感器漂移可能导致系统性偏移。虽然趋势可能是有意义的,但在去除线性趋势后,某些类型的分析能展现更好的洞察力。

            视分析目的不同,可决定是否需要去除数据中的趋势效应。​

    从数据中去除线性趋势

            此示例说明如何从股票每日收盘价中去除线性趋势,以重点观察整体涨幅的价格波动。如果数据确实有趋势,则去除线性趋势会强制其均值为零并减少总体变化。该示例使用从gallery函数获取的分布来模拟股价波动。

            创建一个模拟数据集并计算其均值。sdata 表示股票的每日价格变动。

    1. rng(20)
    2. t = 0:300;
    3. dailyFluct = randn(size(t));
    4. sdata = cumsum(dailyFluct) + 20 + t/100;

            求出数据的平均值。

    1. mean(sdata)
    2. ans = 41.5155

            绘制和标记数据。可以看到,数据显示股价呈系统性增长。

    1. figure
    2. plot(t,sdata);
    3. legend('Original Data','Location','northwest');
    4. xlabel('Time (days)');
    5. ylabel('Stock Price (dollars)');

              如图所示:

            应用 detrend,它对 sdata 执行线性拟合,然后对其进行去除线性趋势处理。从输入中减去输出,得出计算所得的趋势线。

    1. detrend_sdata = detrend(sdata);
    2. trend = sdata - detrend_sdata;

            求出去除线性趋势后的数据的平均值。

    1. mean(detrend_sdata)
    2. ans = -8.0025e-15

               去除线性趋势后,数据均值非常接近 0,与预期相符。

            将趋势线、去除线性趋势后的数据及其均值添加到图中,以显示结果。

    1. hold on
    2. plot(t,trend,':r')
    3. plot(t,detrend_sdata,'m')
    4. plot(t,zeros(size(t)),':k')
    5. legend('Original Data','Trend','Detrended Data',...
    6. 'Mean of Detrended Data','Location','northwest')
    7. xlabel('Time (days)');
    8. ylabel('Stock Price (dollars)');

            如图所示:

            测量的信号可能显示数据中非固有的整体模式。这些趋势有时会妨碍数据分析,因此必须进行去趋势。

            以具有不同趋势的两种心电图 (ECG) 信号为例。ECG 信号对电源干扰等扰动很敏感。加载信号并绘制它们。

    1. load('ecgSignals.mat')
    2. t = (1:length(ecgl))';
    3. subplot(2,1,1)
    4. plot(t,ecgl), grid
    5. title 'ECG Signals with Trends', ylabel 'Voltage (mV)'
    6. subplot(2,1,2)
    7. plot(t,ecgnl), grid
    8. xlabel Sample, ylabel 'Voltage (mV)'

             如图所示:

            第一个绘图上的信号显示线性趋势。第二个信号的趋势是非线性的。要去线性趋势,请使用 MATLAB® 函数 detrend。

    dt_ecgl = detrend(ecgl);

            要去非线性趋势,请对信号进行低阶多项式拟合并减去它。在本例中,多项式为 6 阶。绘制两个新信号。

    1. opol = 6;
    2. [p,s,mu] = polyfit(t,ecgnl,opol);
    3. f_y = polyval(p,t,[],mu);
    4. dt_ecgnl = ecgnl - f_y;
    5. subplot(2,1,1)
    6. plot(t,dt_ecgl), grid
    7. title 'Detrended ECG Signals', ylabel 'Voltage (mV)'
    8. subplot(2,1,2)
    9. plot(t,dt_ecgnl), grid
    10. xlabel Sample, ylabel 'Voltage (mV)'

            如图所示:

            这些趋势已有效地去除。可以看到信号的基线已不再偏移。它们现在可用于进一步处理。

  • 相关阅读:
    async-await Rust: 200 多行代码实现一个极简 runtime
    GO 语言如何用好变长参数?
    图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】
    SCConv:用于特征冗余的空间和通道重构卷积
    MySQL的SQL预编译及防SQL注入
    协程是如何实现线程切换的
    大三学生HTML个人网页作业作品——电影动漫言叶之庭(4页)带音乐
    在树莓派上安装编译的vim——开启python3支持
    性能压测工具 —— wrk
    tomcat之高并发配置Server.xml
  • 原文地址:https://blog.csdn.net/jk_101/article/details/126342167