初见Gnuplot——时间序列的描述

时间:2022-10-15 17:22:33

  研读一本书,《数据之魅:基于开源工具的数据分析》(Data Analysis with Open Source Tools),写的很好。这里,复述一下书中用Gnuplot分析时间序列数据的部分。

  Gnuplot安装很简单,直接到官网下载exe文件,安装运行即可(我是win7 32bit)。数据集来自这里,下载解压后,找到carbon.dioxide.txt文件,把内容复制到test.txt(方便而已),将test.txt文件放到Gnuplot的默认文件目录中(我的是在C:\Users\Administrator\Documents)。数据格式和书里面不太一样,只有一列,不过不影响分析。

  首先,看下数据的总体趋势。

plot 'test.txt' u 1 w l

  可以解释为,画出,'test.txt'的图像,用(u-->using)第 1 列的数据,用直线表示(w l --> with line).

  输出图形:

初见Gnuplot——时间序列的描述

  可以看出总体非线性的上升趋势和短期的周期性。

  为了模拟方便,将数据减去一个垂直偏移,是图像经过原点。

plot 'test.txt' u 0:($1-315) w l

  这里,$1表是引用用数据的第一列的数据。用行号作为x坐标(位于伪列0),第一列(数据列)减去315,作为对应的y的坐标.

  输出如下:

初见Gnuplot——时间序列的描述

  可以看到,曲线符合幂函数想x^k的特征,且曲线下凸,得出其k>1.

  为了固定图的右上角(这里不太懂。。。),我们需要调整两轴,因为x^k通过(1,1),那么b(x/a)^k将通过(a,b)。这样就找到一个待定的拟合函数。点(35,350)在其附近,故得到函数35*(x/350)^k,这里仅知道k>1,经过测试,k=1.35时,拟合得最好。

plot 'test.txt' u 0:($1-315) w l, 35*(x/350)**1.35

  拟合图如下:

初见Gnuplot——时间序列的描述

  这样,我们继续,如果上面的函数拟合的足够好,那么消除这个总体趋势后,剩余部分将不会表现自身的趋势,将仅仅关于y=0对称。

plot 'test.txt' u 0:($1-315-35*($0/350)**1.35) w l

  从下面输出可以看出,基本是符合的。

初见Gnuplot——时间序列的描述

  在数据中很难看到长期趋势,一次我们用一天平滑曲线去逼近它。这里利用Gnuplot里面的加权样条法。

 f(x) = 315 + 35*(x/350)**1.35
plot 'test.txt' u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出如下,这里的“0.001”越小,生成的曲线越平滑。

初见Gnuplot——时间序列的描述

  可以看到,整体剩余部分几乎是平坦的,横跨0的上下两端,也就是说,剩余部分几乎不存在系统偏差的迹象了。

完成对趋势的处理后,接下来要处理的特征就是周期性。

  观察上图,可以看出其接近于正弦曲线,且振幅接近3.由于数据是按照月份统计的,所以我们猜测周期是一年。这意味着,每隔12个数据点,数据就是相同的。

plot 'test.txt' u 0:($1-f($0)) w l, 3*sin(2*pi*x/12) w l

  初见Gnuplot——时间序列的描述

  可以看到,数据拟合得特别好!同样的,让我们看看,本次拟合的剩余部分。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12)
plot 'test.txt' u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出如下:

初见Gnuplot——时间序列的描述

  让我们放大一个具体的区间看一下。这里lp为线点类型,[60,120]自然是区间。

plot [60:120] 'test.txt' u 0:($1-f($0)) w lp, "" u 0:($1-f($0)):(0.001) s acs w l

  输出:

初见Gnuplot——时间序列的描述

  现在数出来两个主波谷间的数据点:12个!这是主要的季节性。但是,在两个主波谷之间还存在着一个次波谷,所以,图中含有更高次谐波(参考wiki解释,需*)。

图中看到,上升部分为7个月,下降部分为5个月,对于这种不对称性,我们试一下第一次高次谐波。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6)
plot 'test.txt' u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出:

初见Gnuplot——时间序列的描述

  现在,我们再来看下残差。

plot 'test.txt' u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l,0,1,-1

  输出:

初见Gnuplot——时间序列的描述

  观察到,残差偏向于正值,我们以0.1为单位调整垂直偏移。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6) + 0.1
plot 'test.txt' u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l,0,1,-1

  输出:

初见Gnuplot——时间序列的描述

  可以看到,残差已经很小了。现在,我们结合分析模型再来看一下原始数据。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6) + 0.1
plot 'test.txt' u 0:1 w l , f(x)

  输出:

初见Gnuplot——时间序列的描述

  Perfect!至此,我们已经得到一个解析式可以很好地描述数据。通过它,我们就可以相对准确地预测以后的数据。

plot [0:600] 'test.txt' u 0:1 w l , f(x)

  

初见Gnuplot——时间序列的描述

  书中有段话写的很好:

那么问题的关键在哪里呢?关键在于,我们开始时对数据一无所知,即我们根本不知道数据会是什么样子。然后,经过逐层处理,我们剔除了数据的各个组成部分,直到只剩下随机噪音。最后,我们得到了一个明确的解析式,它很好地描述了数据。

初见Gnuplot——时间序列的描述的更多相关文章

  1. SPSS数据分析-时间序列模型

    我们在分析数据时,经常会碰到一种数据,它是由时间累积起来的,并按照时间顺序排列的一系列观测值,我们称为时间序列,它有点类似于重复测量数据,但是区别在于重复测量数据的时间点不会很多,而时间序列的时间点非 ...

  2. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  3. 《BI那点儿事》浅析十三种常用的数据挖掘的技术

    一.前沿 数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多种 ...

  4. 浅析十三种常用的数据挖掘的技术&五个免费开源的数据挖掘软件

    一.前 沿 数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多 ...

  5. 关于sarima模型的描述,时间序列的理论与方法(第二版)(美 布洛克威尔)有一部分比较值得看

  6. MongoDB 初见指南

    技术若只如初见,那么还会踩坑么? 在系统引入 MongoDB 也有几年了,一开始是因为 MySQL 中有单表记录增长太快(每天几千万条吧)容易拖慢 MySQL 的主从复制.而这类数据增长迅速的流水表, ...

  7. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  8. 《微信小程序七日谈》- 第一天:人生若只如初见

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩 微信小 ...

  9. OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储

    原文链接:http://www.jianshu.com/p/0bafd0168647 OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...

随机推荐

  1. windows系统命令总结

    windows系统命令总结 IIS管理器:inetmgr SQL server数据库管理器:ssms windows服务:services.msc

  2. ARM&plus;LINUX 项目学习总结

    一.确定功能 二.系统移植 1. 根据具体板子修改u-boot (三星的开发板资料) 2. 根据具体板子和功能修改内核 (基本的驱动) 3. 移植busybox 三.驱动修改编写 四.应用编程 附1 ...

  3. 产品Backlog

    产品BACKLOG ID Name Imp Est How to demo Notes 1 界面(首页.订单.资料) 50 2 进入界面,选择需要的界面 使用分栏界面 2 首页里的功能按钮 40 6 ...

  4. 【jqGrid for ASP&period;NET MVC Documentation】&period;学习笔记&period;3&period;本地化语言包

    1 引用本地化语言包 在 js/i18n 文件夹中,提供了大量预定义的语言包.它包括为所有字符串定义的,包括消息,标题,分页信息,搜索/添加/删除 的对话框 文本等. 在jQuery库文件后,在jqG ...

  5. python编程基础知识—列表(二)

    3操作列表 3.1 遍历整个列表 使用for循环 cars = ['bmw','audi','toyota','Jeep'] for i in cars: print(i) bmw audi toyo ...

  6. 基于SpringBoot从零构建博客网站 - 确定需求和表结构

    要确定一个系统的需求,首先需要明确该系统的用户有哪些,然后针对每一类用户,确定其需求.对于博客网站来说,用户有3大类,分别是: 作者,也即是注册用户 游客,也即非注册用户 管理员,网站维护人员 那么从 ...

  7. The algorithm learning of sort which include Bubblesort&comma;Insertsort&comma;Quicksort and Mergesort&period;

    Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...

  8. jeecg的下拉列表

    jeecg里面下拉列表的使用 ①建立数据字典seo_id <t:dictSelect field="operationPromotionAccount" typeGroupC ...

  9. Python实战&lpar;6&rpar;单线程和多线程导入mysql数据对比测试

    单线程脚本 导入文件的行数 # wc -l /data/logs/testlog/20120219/testlog1/* 1510503 total # -*- coding: utf-8 -*- # ...

  10. &lbrack;UE4&rsqb;蒙太奇动画运行时不播放,预览是好的

    动画实例里面没有添加“DefaultSlot”就会出现这样的问题