[译]用R语言做挖掘数据《七》

article/2025/10/7 23:36:15

时间序列与数据挖掘

 一、实验说明

 1. 环境登录

无需密码自动登录,系统用户名shiyanlou,密码shiyanlou

 2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到:

1. LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令
2. GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器
3. R:在命令行输入‘R’进入交互式环境,下面的代码都是在交互式环境运行
4. 数据:在命令行终端输入以下命令:

# 下载数据
wget http://labfile.oss.aliyuncs.com/courses/360/synthetic_control.tar.gz 
# 解压数据到当前文件夹
tar zxvf synthetic_control.tar.gz

 3. 环境使用

使用R语言交互式环境输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。

完成实验后可以点击桌面上方的“实验截图”保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。

实验记录页面可以在“我的主页”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。

 二、课程介绍

1. R中的时间序列数据
2. 将时间序列分解为趋势型、季节型以及随机型
3. 在R中构建ARIMA模型,并用其预测未来数据
4. 介绍动态时间规整(DTW),然后使用DTW距离以及欧式距离处理时间序列从而实现层次聚类。
5. 关于时间序列分类的三个例子:一个是使用原始数据,一个是使用经过离散小波变换(DWT)后的数据,另外一个是KNN分类。

三、课程内容

1、R中的时间序列数据

使用ts这个类可以抽取等时间距离的样本,当参数frequency=7的时候说明选取样本的频率单位是周,以此类推,频率为12和4分别生成月度和季度数据。具体实现如下:

# 生成1-30的整数,频率是12也就是月度数据,从2011年3月开始
> a <- ts(1:30, frequency=12, start=c(2011,3))
> print(a)
# 转换为字符串型
> str(a)
# 输出该时间序列的属性
> attributes(a)

执行结果如下:

2、时间序列分解

时间序列分解就是将时间序列按趋势性、季节性、周期性和不规则性依次分解。其中,趋势部分代表的是长期趋势,季节性指的是时间序列数据呈现季节性波动,周期性指的是指数据呈现周期性波动,不规则部分就是残差。

下面讲解一个关于时间序列分解的例子,使用的数据AirPassengers由Box & Jenkins国际航班从1949年到1960年的乘客数据组成。里面有144个观测值。

> plot(AirPassengers)
# 将数据预处理成月度数据
> apts <- ts(AirPassengers, frequency=12)
# 使用函数decompose()分解时间序列
> f <- decompose(apts)
# 季度数据
> f$figure
> plot(f$figure, type="b", xaxt="n", xlab="")
# 使用当前的时间区域给月份赋予名称
> monthNames <- months(ISOdate(2011,1:12,1))
# 使用月份名称标记x轴
# side=1表示设置x轴,at指的是范围从10-12,las表示分割的单位刻度为2
> axis(1, at=1:12, labels=monthNames, las=2)
> plot(f)

结果如下:

上图中,'observed'标注的表表示原始的时间序列分布图,往下第二个图是显示数据的呈现上升趋势图,第三个季节图显示数据受一定的季节因素影响,最后一个是在移除趋势和季节影响因素后的图。

思考:R里面还有哪些包,哪些函数可以实现时间序列的分解,并试着使用那些函数实现分解,并将分解结果进行对比。

3、时间序列预测

时间序列预测就是基于历史数据预测未来事件。一个典型的例子就是基于股票的历史数据预测它的开盘价。在时间序列预测中有两个比较经典的模型分别是:自回归移动平均模型(ARMA)和差分整合移动平均自回归模型(ARIMA)。

下面使用单变量时间序列数据拟合ARIMA模型,并用该模型预测。

# 参数order由(p,d,q)组成,p=1指的是自回归项数为1,list内容是季节seasonal参数
> fit <- arima(AirPassengers, order=c(1,0,0), list(order=c(2,1,0), period=12))
# 预测未来24个月的数据
> fore <- predict(fit, n.ahead=24)
# 95%的置信水平下的误差范围(U,L)
> U <- fore$pred + 2*fore$se
> L <- fore$pred - 2*fore$se
# col=c(1,2,4,4)表示线的颜色分别为黑色,红色,蓝色,蓝色
# lty=c(1,1,2,2)中的1,2指连接点的先分别为实线和虚线
> ts.plot(AirPassengers, fore$pred, U, L, col=c(1,2,4,4), lty = c(1,1,2,2))
> legend("topleft", c("Actual", "Forecast", "Error Bounds (95% Confidence)"),col=c(1,2,4), lty=c(1,1,2))

预测结果如下:

4、时间序列聚类

时间序列聚类就是基于密度和距离将时间序列数据聚类,因此同一个类里面的时间序列具有相似性。有很多衡量距离和密度的指标比如欧式距离、曼哈顿距离、最大模、汉明距离、两个向量之间的角度(内积)以及动态时间规划(DTW)距离。

4.1 动态时间规划距离

动态时间规划能够找出两个时间序列的最佳的对应关系,通过包'dtw'可以实现该算法。在包'dtw'中,函数dtw(x,y,...)计算动态时间规划并找出时间序列x与y之间最佳的对应关系。

代码实现:

> library(dtw)
# 平均生成100个在0-2*pi范围的序列idx
> idx <- seq(0, 2*pi, len=100)
> a <- sin(idx) + runif(100)/10
> b <- cos(idx)
> align <- dtw(a, b, step=asymmetricP1, keep=T)
> dtwPlotTwoWay(align)

a与b这两个序列的最佳对应关系如下图所示:

4.2 合成控制图的时间序列

合成控制图时间序列数据集‘synthetic_control.data’存放于当前工作目录'/home/shiyanlou'下,它包含600个合成控制图数据,每一个合成控制图都是由60个观测值组成的时间序列,那些合成控制图数据被分为6类:
- 1-100:正常型;
- 101-200:周期型;
- 201-300:上升趋;
- 301-400:下降趋势;
- 401-500:上移;
- 401-600:下移。

首先,对数据进行预处理:

> sc <- read.table("synthetic_control.data", header=F, sep="")
# 显示每一类数据的第一个样本观测值
> idx <- c(1,101,201,301,401,501)
> sample1 <- t(sc[idx,])

合成控制图时间序列样本数据分布如下:

4.3 使用欧式距离层次聚类

首先从上面的合成控制图每一类数据中随机选取10个样本进行处理:

> set.seed(6218)
> n <- 10
> s <- sample(1:100, n)
> idx <- c(s, 100+s, 200+s, 300+s, 400+s, 500+s)
> sample2 <- sc[idx,]
> observedLabels <- rep(1:6, each=n)
# 使用欧式距离层次聚类
> hc <- hclust(dist(sample2), method="average")
> plot(hc, labels=observedLabels, main="")
# 将聚类树划分为6类
> rect.hclust(hc, k=6)
> memb <- cutree(hc, k=6)
> table(observedLabels, memb)

聚类结果与实际分类对比:

                                                                                                   图4.1

图4.1中,第1类聚类正确,第2类聚类不是很好,有1个数据被划分到第1类,有2个数据划分到第3类,有1个数据划分到第4类,且上升趋势(第3类)和上移(第5类)并不能很好的被区分,同理,下降趋势(第4类)和下移(第6类)也没有被很好的被识别。

4.4 使用DTW距离实现层次聚类

实现代码如下:

> library(dtw)
> distMatrix <- dist(sample2, method="DTW")
> hc <- hclust(distMatrix, method="average")
> plot(hc, labels=observedLabels, main="")
> rect.hclust(hc, k=6)
> memb <- cutree(hc, k=6)
> table(observedLabels, memb)

聚类结果如下:

                                                                                                     图4.2

对比图4.1和4.2可以发现,由后者的聚类效果比较好可看出在测量时间序列的相似性方面,DTW距离比欧式距离要好点。

5、时间序列分类

时间序列分类就是在一个已经标记好类别的时间序列的基础上建立一个分类模型,然后使用这个模系去预测没有被分类的时间序列。从时间序列中提取新的特征有助于提高分类模系的性能。提取特征的方法包括奇异值分解(SVD)、离散傅里叶变化(PFT)、离散小波变化(DWT)和分段聚集逼近(PAA)。

5.1 使用原始数据分类

我们使用包'party'中的函数ctree()来给原始时间序列数据分类。实现代码如下:

# 给原始的数据集加入分类标签classId
> classId <- rep(as.character(1:6), each=100)
> newSc <- data.frame(cbind(classId, sc))
> library(party)
> ct <- ctree(classId ~ ., data=newSc,controls = ctree_control(minsplit=30, minbucket=10, maxdepth=5))
> pClassId <- predict(ct)
> table(classId, pClassId)
# 计算分类的准确率
> (sum(classId==pClassId)) / nrow(sc)
> plot(ct, ip_args=list(pval=FALSE),ep_args=list(digits=0))

输出决策树:

5.2 提取特征分类

接下来,我们使用DWT(离散小波变化)的方法从时间序列中提取特征然后建立一个分类模型。小波变换能处理多样的频率数据,因此具有自适应性。

下面展示一个提取DWT系数的例子。离散小波变换在R中可以通过包'wavelets'实现。包里面的函数dwt()可以计算离散小波的系数,该函数中主要的3个参数X、filter和boundary分别是单变量或多变量的时间序列、使用的小波过滤方式以及分解的水平,函数返回的参数有W和V分别指离散小波系数以及尺度系数。原始时间序列可以通过函数idwt()逆离散小波重新获得。

> library(party)
> library(wavelets)
> wtData <- NULL
# 遍历所有时间序列
> for (i in 1:nrow(sc)) {
+ a <- t(sc[i,])
+ wt <- dwt(X=a, filter="haar", boundary="periodic")
+ wtData <- rbind(wtData, unlist(c(wt@W, wt@V[[wt@level]])))
+ }
> wtData <- as.data.frame(wtData)
> wtSc <- data.frame(cbind(classId, wtData))
# 使用DWT建立一个决策树,control参数是对决策树形状大小的限制
> ct <- ctree(classId ~ ., data=wtSc,controls = ctree_control(minsplit=30, minbucket=10, maxdepth=5))
> pClassId <- predict(ct)
# 将真实分类与聚类后的类别进行对比
> table(classId, pClassId)

5.3 K-NN分类

K-NN算法也可以用于时间序列的分类。算法流程如下:
- 找出一个新对象的k个最近邻居
- 然后观察该区域内拥有相同属性的数量最多的类代表该区域所属的类

但是,这种直接寻找k个最近邻居的算法时间复杂度为O(n**2),其中n是数据的大小。因此,当处理较大数据的时候就需要一个有效索引的方式。包'RANN'提供一个快速的最近邻搜索算法,能够将算法的时间复杂度缩短为O(n log n)。
下面是在没有索引的情况下实现K-NN算法:

> k <- 20
# 通过在第501个时间序列中添加噪声来创建一个新的数据集
> newTS <- sc[501,] + runif(100)*15
# 使用‘DTW’方法计算新数据集与原始数据集之间的距离
> distances <- dist(newTS, sc, method="DTW")
# 给距离升序排列
> s <- sort(as.vector(distances), index.return=TRUE)
# s$ix[1:k]是排行在前20的距离,表哥输出k个最近邻居所属的类
> table(classId[s$ix[1:k]])

输出结果如下:

由上图输出表格数据可知,20个邻居中有19个数据都属于第6类,因此将该类时间序列划分到第六类时间序列中。

**思考**:经过学习这么多时间序列分类,请思考以上时间序列分类方法的利与弊。

更多数据挖掘教材请来实验楼学习。

转载于:https://www.cnblogs.com/wing1995/p/4656701.html


http://chatgpt.dhexx.cn/article/a26oRhVD.shtml

相关文章

[学习笔记]黑马程序员-Hadoop入门视频教程

文章目录 参考资料第一章&#xff1a;大数据导论与Linux基础&#xff08;p1-p17&#xff09;1.1 大数据导论1.1.1 企业数据分析方向1.1.2 数据分析基本流程步骤明确分析的目的和思路数据收集数据处理数据分析数据展现报告攥写 1.1.3 大数据时代大数据定义大数据的5V特征应用场景…

[译]用R语言做挖掘数据《五》

介绍 一、实验说明 1. 环境登录 无需密码自动登录&#xff0c;系统用户名shiyanlou&#xff0c;密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境&#xff0c;实验中会用到程序&#xff1a; 1. LX终端&#xff08;LXTerminal&#xff09;: Linux命令行终端&a…

基于ROS的Most Stars开源代码汇总(自动驾驶汽车+RGBDSLAMv2+ROS2+人识别与跟踪等)

Star 200 https://github.com/CPFL/Autoware 用于城市自主驾驶的开源软件。 http://www.tier4.jp/ Autoware 用于城市自主驾驶的集成开源软件&#xff0c;由第四层维护。支持以下功能&#xff1a; 3D本地化3D映射路径规划路径跟随加速/制动/转向控制数据记录汽车/行人/物体检…

WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)

声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究。 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析,第三是关联挖掘。 3)本文由于过长,且实验报告内的评估观点有时不一定正确,希…

CUDA 初体验

CUDA Visual ProfilerCUDA编程指导 shared memoryPage locked out memory C CUDA 调用CUDA 编程介绍CUDA 数据同步 CUDA Visual Profiler 在上180645课程的时候&#xff0c;里面谈到使用CUDA来做矩阵乘法和k均值聚类的加速。在使用n卡的时候&#xff0c;有一个Visual Profile…

LogCluster算法

LogCluster - A Data Clustering and Pattern Mining Algorithm for Event Logs LogCluster - 事件日志的数据聚类和模式挖掘算法 Risto Vaarandi and Mauno Pihelgas TUT 数字取证和网络安全中心 塔林科技大学 爱沙尼亚塔林 0 概要 Abstract—Modern IT systems often pro…

机器学习,看这一篇就够了:回归算法,特征工程,分类算法,聚类算法,神经网络,深度学习入门

目录 前言 1机器学习概述 1.1机器学习简介 1.1.1机器学习背景 1.1.2机器学习简介 1.1.3机器学习简史 1.1.4机器学习主要流派 1.2机器学习、人工智能和数据挖掘 1.2.1什么是人工智能 1.2.2什么是数据挖掘 1.2.3机器学习、人工智能与数据挖掘的关系 1.3典型机器学习应…

Ubuntu18.04下Opencv的安装及使用实例

本文主要介绍了在Ubuntu18.04系统下练习编译、安装著名的C/C图像处理开源软件库Opencv 3.4.12&#xff08;过程多&#xff0c;耗时长&#xff0c;需要耐心和细心&#xff09; 目录 一、Opencv简介 二、Opencv安装 1.安装环境 2.下载Opencv3.4.12 3.解压安装包 4.使用cmak…

处理器架构分类

一 X86和X64 X86和X64分别代表Intel 32位和64位的处理器&#xff0c;这里有个前提是指Intel X86架构的处理器吧。而具体点应该是&#xff1a; 1. x86-32&#xff1a; 32位的X86处理器&#xff0c;平常会简写成x86 2. x86-64&#xff1a; 64位的X86处理器。平常会简写成x64 …

ARM 处理器架构简介

ARM 架构是构建每个 ARM 处理器的基础。ARM 架构随着时间的推移不断发展&#xff0c;其中包含的架构功能可满足不断增长的新功能、高性能需求以及新兴市场的需要。有关最新公布版本的信息&#xff0c;请参阅 ARMv8 架构。 ARM 架构支持跨跃多个性能点的实现&#xff0c;并已在许…

昇腾 (Ascend) AI 处理器:达芬奇架构

参考&#xff1a;《昇腾AI处理器架构与编程——深入理解CANN技术原理及应用》 目录 昇腾 AI 处理器背景主要的架构组成部件可扩展性 达芬奇架构 (DaVinci Architecture)计算单元矩阵计算单元CPU vs. GPU vs. Ascend改变矩阵的存储方式来提升矩阵计算的效率矩阵计算单元 (矩阵乘…

傻白入门芯片设计,指令集架构、微架构、处理器内核(十一)

早期计算机出现时&#xff0c;软件的编写都是直接面向硬件系统的&#xff0c;即使是同一计算机公司的不同计算机产品&#xff0c;它们的软件都是不能通用的,这个时代的软件和硬件紧密的耦合在一起&#xff0c;不可分离。 IBM为了让自己的一系列计算机能使用相同的软件,免去重复…

VS2012 处理器架构“x86”不匹配 通过配置管理器更改您的项目的目标处理器架构...

在VS2012中新建一个项目。然后引用之前VS2010写的一个基础类库。 VS2012编译通过但是出现警告。 所生成项目的处理器架构“MSIL”与引用“E:\work\C#\Dt.Utility\bin\Debug\Dt.Utility.exe”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更…

《嵌入式 - 嵌入式大杂烩》 处理器架构与指令集

大家天天都在使用手机,你知道你的手机使用的什么处理器?处理器又是何种架构呢?今天笔者就来谈谈处理器的架构和指令集。 我们知道一台手机最重要的就是处理器,也就是处理器,那么什么是处理器呢? 处理器就是一堆数字电路(架构)以高低电平的各种组合实现了各种基本的运…

『已解决』.NET报错:所生成项目的处理器框架“MSIL”与引用“wdapi_dotnet1021”的处理器架构“AMD64”不匹配

&#x1f4e3;读完这篇文章里你能收获到 处理器架构“AMD64”不匹配问题的处理方案&#xff0c;只需要鼠标点几下就解决这篇文章强烈建议收藏&#xff01;&#xff01;&#xff01;免得下次找不到 文章目录 一、现象二、解决方案 一、现象 .NET C#错误&#xff1a;所生成项目…

处理器架构——多发射处理器技术

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 多发射处理器总结数据冒险动态调度-Tomasulo算法GPU与CPU的多发射技术对比&#xff08;待考究&#xff09; 多发射处理器总结 无论是动态多发射还是静态多发射&…

认识多处理器架构

常见的多处理器架构有哪些&#xff1f; SMP(Symmetric Multi-Processor) 对称多处理器结构NUMA(Non-Uniform Memory Access) 非统一内存访问架构MPP(Massive Parallel Processing) 大规模并行处理结构 他们都是如何工作的&#xff1f; SMP 所谓对称多处理器结构&#xff0c…

.NET报错:所生成项目的处理器框架“MSIL”与引用“xxx”的处理器架构“AMD64”不匹配

一、现象 所生成项目的处理器架构“MSIL”与引用“System.Data.SQLite, Version1.0.60.0, Cultureneutral, PublicKeyTokendb937bc2d44ff139, processorArchitecturex86”的处理器架构“AMD64”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改您的项目的目…

Linux 系统查询处理器架构

注意 给出的命令大多需要 root 权限才能运行&#xff0c;请确保您现在已经处于有 root 权限的环境下。 如果您现在没有切换到 root 账户下&#xff0c;那么请使用 su 或者 sudo -s 命令来进行切换。 确认处理器架构 执行下面的命令&#xff0c;根据输出结果查表&#xff1a…

自己编写自动同步脚本

Step1: 运行脚本&#xff0c;将结果保存到sync_date.log下; 执行的时候&#xff0c;将地址修改为slave ip --databases 指定为需要同步的db_name user 和password修改为对应的账号密码&#xff1b; /* #!/bin/bash #define sync function sync(){ apt-table-sync --execut…