HANTS时间序列滤波算法的MATLAB实现

news2024/11/23 12:31:12

  本文介绍在MATLAB中,实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补的详细方法。

  HANTS(Harmonic Analysis of Time Series)是一种用于时间序列分析和插值的算法。它基于谐波分析原理,可以从观测数据中提取出周期性变化的信号成分,并进行数据插值和去噪处理。这一算法的主要思想是将时间序列数据分解为多个不同频率的谐波成分,并通过拟合这些成分来重构原始数据。该算法适用于具有任意周期性的时间序列,可以处理缺失值和异常值,并能够保留原始数据的整体趋势和周期性。

  那么在本文中,我们就介绍一下在MATLAB中,基于我们自己的数据,进行HANTS算法处理的方法。

  首先,由于HANTS算法整体非常精密、复杂,因此我们直接下载一位MATLAB用户撰写好的HANTS算法代码包即可,无需自己手动撰写这一部分的代码。下载方法也很简单,大家进入HANTS算法代码包在MATLAB的官方网站(https://www.mathworks.com/matlabcentral/fileexchange/38841-matlab-implementation-of-harmonic-analysis-of-time-series-hants)即可。进入网站后,如果大家是第一次使用MATLAB的官方网站,需要注册、登录一下自己的账号;随后,选择屏幕右上角的“Download”选项即可;如下图所示。

  下载完毕后,我们将压缩包解压,即可看到如下图所示的文件列表。

  其中,实现HANTS算法的程序其实就是上图中的前两个文件(也就是ApplyHants.m文件与HANTS.m文件),作者将HANTS算法写成了这两个函数,我们在使用时直接调用这两个函数中的一个即可。其中,第一个函数,也就是ApplyHants.m文件对应的函数,适用于输入数据为多维的情况;而如果我们的数据是一维的,例如常见的对NDVI时序数据、遥感反射率时序数据加以重建,那么就用上图中第二个函数,也就是HANTS.m文件对应的函数即可。

  接下来,我们就可以开始对自己的数据加以HANTS算法处理了。在本文中,我们的需求是这样的:在一个文件夹中,包含有大量的.csv文件,其中每一个文件都具有如下图所示的格式。

  其中,第一行为列名,第一列为时间,后面的列都是不同遥感影像波段反射率的时间序列数据。我们希望,对这一文件夹下所有的.csv文件进行遍历,对其中每一个.csv文件的每一列(除了第一列,因为第一列是表示时间的数据)加以HANTS算法处理。

  明确了具体需求,我们就可以开始撰写代码。前面已经提到了,HANTS算法的代码不用我们自己写,就用下载好函数即可;我们只需要将数据读取、数据预处理、结果保存等部分的代码写好,同时按照自己数据的实际情况,配置一下HANTS算法的各个参数即可。

  本文用到的代码如下。

clear;

ni = 414;
nb = 365 * 8 + 361;
nf = 9;
ts = 1 : 8 : (414 * 8 + 1);
HiLo = "none";
low = 0;
high = 1;
fet = 0.1;
dod = 1;
delta = 0.1;
all_file_path = "E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\16_8DaysSynthesis_After";
output_path = "E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\17_HANTS";

files = dir(fullfile(all_file_path, "*.csv"));
for i = 1:numel(files)
    file_path = fullfile(all_file_path, files(i).name);
    column_data = readtable(file_path, "ReadVariableNames",true);
    column_name = column_data.Properties.VariableNames;
    column_index = 2 : 8;
    for j = column_index
        one_column_name = column_name{j};
        one_column_data = column_data.(one_column_name);
        [amp, phi, yr] = HANTS(ni, nb, nf, one_column_data, ts, "none", low, high, fet, dod, delta);
%         [amp_Hi, phi_Hi, yr_Hi] = HANTS(ni, nb, nf, one_column_data, ts, "Hi", low, high, fet, dod, delta);
%         [amp_Lo, phi_Lo, yr_Lo] = HANTS(ni, nb, nf, one_column_data, ts, "Lo", low, high, fet, dod, delta);
        column_data.(one_column_name) = yr;
    end
    save_file_name = fullfile(output_path, files(i).name);
    writetable(column_data, save_file_name, "Delimiter", ",");
end

% plot(one_column_data, "b.-");
% hold on;
% plot(yr, "r.-");
% plot(yr_Hi, "k.-");
% plot(yr_Lo, "g.-");
% legend("Original", "none", "Hi", "Lo");

  其中,这段代码的作用是对每个.csv文件中的指定列数据应用HANTS算法进行处理,并将处理后的数据保存为新的.csv文件。具体流程如下:

  1. 定义了两个文件路径:
    • all_file_path:待处理的.csv文件所在文件夹路径;
    • output_path:保存处理后数据的文件夹路径。
  2. 使用dir函数获取指定文件夹中所有以.csv结尾的文件。
  3. 遍历每个文件:
    • 构建当前文件的完整路径。
    • 使用readtable函数读取.csv文件数据,并保留列名。
    • 获取需要处理的列索引(2到8列)。
    • 遍历这些列索引:
      • 获取当前列的名称和数据。
      • 调用HANTS函数对列数据进行处理,得到处理后的数据(存储在yr中)。
      • 将处理后的数据替换原来的列数据。
    • 构建保存处理后数据的文件名,并使用writetable函数将column_data保存为.csv文件。

  这里需要注意,HANTS算法的几个参数,大家就依据自己数据的实际情况来设置即可,具体每一个参数的含义在代码包中的HANTS.m文件内就有介绍。通过如上的代码,我们即可实现本文的需求。为了进一步验证HANTS算法是否执行正确,我们可以简单地绘制一个算法处理前后的时间序列数据对比图,如下图所示。

  可以看到,经过HANTS算法处理,我们的数据已经平滑了许多。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 常用命令awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法:awk pattern {action} files 1.RS, ORS, F…

CFS三层内网靶机渗透

目录 一、靶场框架 靶场搭建: 二、渗透过程 三、总结 靶场介绍: 三层内网靶场,共有三个网段,分别为75网段(公网网段)、22网段(内网)、33网段(内网) 靶…

ChatGPT+ “剪映 or 百度AIGC” 快速生成短视频

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 ChatGPT快速生成短视频 文章目录 🍐1.ChatGPT 剪映🍏2.ChatGPT 百度AIGC平台&#x…

【ThinkPHP6系列学习-2】多应用模式配置

上一篇:【ThinkPHP6系列学习-1】下载并部署ThinkPHP6 这里写一写TP6下配置多应用。因为TP6和TP5有所差异,TP6默认是单应用模式(单模块),而我们实际项目中往往是多应用的(多个模块)&#xff0c…

1.Buffer_Overflow-2.Stack_Overflow / 写入字符串

这道题虽然简单 但是却给我了另一个解题的看法 我们先进行运行 我们看看保护 发现只有NX保护 反汇编看看 发现有shellcode 但是我们没有办法执行shellcode 因为v5 不会等于后面的 这里我原本没有想法 后面进行看看他的汇编 这里其实就很清楚了 .text:00000000004011BB …

( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

题目一&#xff08;贪心&#xff09; ❓674. 最长连续递增序列 难度&#xff1a;简单 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定…

vcruntime140.dll如何修复?这个修复方法很简单,适合电脑小白

今天打开photoshop软件工作的时候&#xff0c;突然间就打不开&#xff0c;电脑报错由于找不到vcruntime140.dll&#xff0c;无法继续执行此代码&#xff0c;然后我就把photoshop卸载了&#xff0c;再重新安装&#xff0c;依然还是报错。这个可怎么办&#xff1f;vcruntime140.d…

CentOS 安装MongoDB 6.0

一、安装依赖 yum install libcurl openssl xz-libs 二、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 选择RedHat / CentOS 7.0平台的原因是我的操作系统使用的是CentOS 7.0的&#xff0c;需要下载与操作系统匹配的安装包 三、…

ChatGPT插件权限给Plus用户放开了

大家好&#xff0c;我是章北海mlpy ChatGPT插件权限给Plus用户放开了 我稍微测试了俩&#xff0c;感觉还行&#xff0c;后续我会对一些热门插件深入测测&#xff0c;敬请期待。 官方对插件的介绍如下&#xff1a; 1、插件由非由OpenAI控制的第三方应用程序提供动力。在安装…

Spring Cloud Alibaba-Sentinel熔断降级

Sentinel: 轻量级的流量控制、熔断降级Java库&#xff0c; 分布式系统的流量防卫兵。 文章目录 一、Sentinel 是什么&#xff1f;二、安装Sentinel控制台三、Sentinel 实战3.1、准备工作3.2、流控规则快速失败Warm Up匀速排队 3.3、热点key限流3.4、降级规则3.5、系统规则 四、…

自定义组件3-behaviors

1、behaviors是小程序中用于实现组件间代码共享的特性&#xff0c;类似于Vue.js中的mixins 2、behaviors的工作方式 每个behaviors可以包含一组属性、数据、生命周期函数和方法。组件引用它时&#xff0c;它的数据和属性和方法会被 合并到组件中。 每个组件可以引用多个behav…

Python采集知某专栏文章保存成pdf

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm wkhtmltopdf 软件 文末名片获取 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip install parsel 数据解析 re >>> 内置模块 不…

【年度最强超级Ai让你体验真正的人工智能】

年度最强超级Ai让你体验真正的人工智能&#xff08;破解版&#xff09; 登录就是永久会员&#xff08;先上链接&#xff0c;资源来源于网络&#xff0c;如有侵权&#xff0c;联系删除&#xff09; 网易邮箱&#xff1a; 23402001163163.com 我用蓝奏浏览器分享了[GPT-AI助手V1…

100 个 Go 错误以及如何避免:5~8

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 真相一旦入眼&#xff0c;你就再也无法视而不见。——《黑客帝国》 五、字符串 本章涵盖 理解GO中…

Oracle执行计划管理 - SPM

https://blog.51cto.com/lhrbest/3246884 目录 Oracle优化器辅助手段的发展 SPM需求背景 SPM重要构成 SQL计划基准捕获 如何创建SQL计划基准 如何查看SQL计划基准 SQL计划基准选择 执行计划的三个属性 如何选择SQL计划 SQL计划基准发展 SQL计划基准发展的三种选择 …

在外包干了三年,我废了……不吹不黑!

没错&#xff0c;我也干过外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我废了…… 虽说废的不是很彻底&#xff0c;但那三年我几乎是出差了三年、玩了三年、荒废了三年&#xff0c;那三年&#xff0c;我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…

CTFShow-电子取证篇Writeup

CTFShow-电子取证篇Writeup 套的签到题&#xff1a;JiaJia-CP-1&#xff1a;JiaJia-CP-2&#xff1a;JiaJia-CP-3&#xff1a; CTFShow 平台&#xff1a;https://ctf.show/ 套的签到题&#xff1a; JiaJia-CP-1&#xff1a; 这是部分人熟知的刘佳佳同学的电脑&#xff0c;她…

JavaWeb-Servlet的学习

Servlet 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门动态web资源开发技术。 使用Servlet就可以实现&#xff0c;根据不同的登录用户在页面上动态显示不同内容。 Servlet是JavaEE规范之一&#xff0c;其实就是一个接口&#xff0c;将来我们需要定义S…

SpringBoot 整合 ES 进行各种高级查询搜索

数据准备 因为本文都是数据的搜索&#xff0c;所以我们需要在我们的es服务器里先插入一些数据以供我们后面使用 esUserService public interface EsUserService extends ElasticsearchRepository<User, Integer> {}RestController public class EsController {Autowir…

HUSTOJ中添加初赛练习系统

文章目录 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ4705852261. 主界面2. 练习界面3. 模拟考试界面4. 查看试卷回放5. 后台操作界面6. 后台试题分类-列表7.后台试题-列表8. 后台试题-添加9. 后台试卷结构-设置 0. 基于hustoj二开的初赛练习系统&#xff0c;QQ470585226 …