精华内容
下载资源
问答
  • 容易产生序列相关问题的数据
    2022-04-25 20:07:04

    序列信号产生器

    顾名思义,就是周期性的产生某段序列信号,这里介绍几种方法。

    **第一种方法,**最容易想到的方法,设置一个长度和序列长度一样长的信号,在复位时,赋值为该段序列,接下来循环移位即可。
    例 :设计一个序列信号发生器电路,能在CLK信号作用下周期性输出“1010110111”的序列信号。

    
    module sequence_generator(
          input clk ,
          input rst_n ,
          output out_sequence //可以根据题目要求加输出使能,读者自行扩展
      );
    
      reg [9:0] sequence  ; 
      always@(posedge clk or negedge rst_n) begin
          if(!rst_n) begin
              sequence <= 10'b1010110111 ;//可以替换成其他序列
          end 
          else begin
              sequence <= {sequence[8:0],sequence[9]} ;//循环移位,先输出高位
          end
      end
    
      assign out_sequence = sequence[9] ; 
    
      endmodule
    
    

    在这种方法中,**优点是代码简洁,通熟易懂,但是也有个缺陷,就是需要花费的寄存器数量较多。
    **
    下面介绍第二种方法。
    注意到这里序列为10’b1010110111 ,长度为10,也就是共10种状态,需要至少4个寄存器(2^4=16),

    假如这里我们只使用四个寄存器,我们观察一下移位状态。
    注意 移位方向为左移,移入的数据为多少是怎么判断的呢?
    以这个为例,首先第一个状态的数据为从高位取寄存器数量的长度,假如这里使用五个触发器,则第一个状态为10101,则下一个数据移入为什么呢?答案是移入的为10101后面一个数据,依次移入后面五个数据,当后面五个数据移入完后在回到高位继续依次移入五个数据完成闭环。
    具体也可参考我画的状态转移表

    1010–0101–1011–0110–1101–1011·····状态有重复,不可以,因为寄存器的输入和当前状态有关,不允许相同的状态出现两个不同的输出。
    再看五个寄存器;
    10101—01011–10110–01101–11011-10111–01111–11110—11101–11010 ··· 10101,没有重复,再回到了10101的循环。
    因此我们列出状态转移表

    在这里插入图片描述
    卡诺图及其化简都已写出,具体的rtl代码大家就自己写啦。

    下面还有两种方法,一种为状态机,另一种为计数器,给出一篇文章:序列信号发生器

    更多相关内容
  • Java序列化与数据传输

    千次阅读 2021-03-06 16:31:59
    序列化:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据有关对象的类型的信息和存储在对象中数据的类型。 堆内存中的java对象数据,通过某种方式...

    1)什么是序列化

    ① 序列化:Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

    堆内存中的java对象数据,通过某种方式把该对象存储到磁盘文件中,或者传递给其他网络节点(网络传输)。

    对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。

    ② 反序列化:将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

    把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。

    客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

    整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

    ③ 什么场景下会使用到序列化:

    暂存大对象;

    Java对象需要持久化的时候;

    需要在网络,例如socket中传输Java对象。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象;

    跨虚拟机通信;

    2)实现Java序列化

    ObjectInputStreamObjectOutputStream 是高层次的数据流,包含了序列化和反序列化的方法。

    ObjectOutputStream 类包含很多写方法来写各种数据类型,但是一个特别的方法例外:

    public final void writeObject(Object x) throws IOException

    上面的方法序列化一个对象,并将它发送到输出流。相似的 ObjectInputStream 类包含如下反序列化一个对象的方法:

    public final Object readObject() throws IOException, ClassNotFoundException                 

    该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

    ObjectOutputStream - writeObject - 序列化一个对象,并将它发送到输出流。

    ObjectInputStream  - readObject - 从输入流中取出下一个对象,并将对象反序列化。

    ① 实现Serializable接口;

    public class Employee implements java.io.Serializable
    {
       private static final long serialVersionUID = 1L;
       private String name;
       private String address;
       public transient int SSN;
       private int number;
       public void mailCheck()
       {
          System.out.println("Mailing a check to " + name + " " + address);
       }
    }

    一个类的对象要想序列化成功,必须满足两个条件:

    该类必须实现 java.io.Serializable 接口。

    该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

    ② 进行序列化;

    public class SerializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = new Employee();
          e.name = "Reyan Ali";
          e.address = "Phokka Kuan, Ambehta Peer";
          e.SSN = 11122333;
          e.number = 101;
          try
          {
             FileOutputStream fileOut =
             new FileOutputStream("/tmp/employee.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut);
             out.writeObject(e);
             out.close();
             fileOut.close();
             System.out.printf("Serialized data is saved in /tmp/employee.ser");
          }catch(IOException i)
          {
              i.printStackTrace();
          }
       }
    }

    ③ 进行反序列化;

    public class DeserializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = null;
          try
          {
             FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
        }
    }

    readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常。

    序列化流程:

     1)定义一个类,实现Serializable接口;

     2)在程序代码中创建对象后,创建对象输出流ObjectOutputStream对象并在构造参数中指定流的输出目标(比如一个文件),通过objectOutputStream.writeObject(obj)把对象序列化并输出到流目标处;

     3)在需要提取对象处:创建对象输入流ObjectInputStream对象并在构造参数中指定流的来源,然后通过readObject()方法获取对象,并通过强制类型转换赋值给类对象引用。

    3)序列化过程中几个需要注意的点

    ① 序列化ID,我们在进行序列化时,加了一个serialVersionUID字段,这便是序列化ID;

     private static final long serialVersionUID = 1L;

    虚拟机是否允许对象反序列化,不是取决于该对象所属类路径和功能代码是否与虚拟机加载的类一致,而是主要取决于对象所属类与虚拟机加载的该类的序列化 ID 是否一致

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

    ② 静态变量和transient关键字修饰的变量不能被序列化;

    序列化时并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。transient作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient变量的值设为初始值,如int型的是0。比如上面例子中SSN属性值反序列化后为0.

    ③ 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

    4)序列化原理

    ① 序列化算法会按步骤执行以下事情:

      1)当前类描述的元数据输出为字节序列;【类定义描述、类中属性定义描述】

      2)超类描述输出为字节序列;【如果超类还有超类,则依次递归,直至没有超类】

      3)从最顶层超类往下,依次输出各类属性值描述,直至当前类对象属性值。

      即:从下到上描述类定义,从上往下输出属性值。

    ② 为什么Java序列化要实现Serializable接口:

    package java.io;
    public interface Serializable {
    }
    

    这是一个空接口,为什么要设计为空?总的就是说安全性问题,假如没有一个接口(即没有Serializable来标记是否可以序列化),让所有对象都可以序列化。那么所有对象通过序列化存储到硬盘上后,都可以在序列化得到的文件中看到属性对应的值(后面将会通过代码展示)。所以最后为了安全性(即不让一些对象中私有属性的值被外露),不能让所有对象都可以序列化。要让用户自己来选择是否可以序列化,因此需要一个接口来标记该类是否可序列化。

    5)Serializable和Parcelable的区别和使用

    Java 提供了 Serializable 接口,而 Android 提供特有的 Parcelable 接口。

    Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class执行就可以,不需要手动去处理序列化和反序列化的过程,但是Serializable 在序列化和反序列化过程中大量使用了反射,效率较低,也因此其过程会产生的大量的内存碎片

    Parcelable是Android特有的序列化API,它的出现是为了解决Serializable在序列化的过程中消耗资源严重的问题,但是因为本身使用需要手动处理序列化和反序列化过程,会与具体的代码绑定,使用较为繁琐,一般只获取内存数据的时候使用。

    二者效率及选择

    Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为Android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

    6)常见的序列化技术

    ① Java 序列化

    优点:java语言本省提供,使用比较方面和简单; 

    缺点:不支持跨语言处理、性能相对不是很好,序列化以后产生的数据相对较大;

    ② XML序列化

    XML序列化的好处在于可读性好,方便阅读和调试。但是序列化以后的字节码文件比较大,而且效率不高,适应于对性能不高,而且QPS较低的企业级内部系统之间的数据交换的场景,同时XML又具有语言无关性,所以还可以用于异构系统之间的数据交换和协议。

    解析方式:Pull解析和SAX解析;笔者之前的文章《SVG解析》这里面就使用了Pull解析的方式,去解析一份SVG(XML)文件,效率可以保证。

    ③ JSON序列化

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相对于XML来说,JSON的字节流较小,在网络传输上更省流量,而且可读性也尚可。现在JSON数据格式的运用是最普遍的。

    解析方式:官方提供了JSONObject,也可以使用谷歌的GSON,阿里的FastJSON,美团的MSON等更加优秀的转码工具。

     

    参考文章:

    序列化原理(一):从源码理解Serializable

    java序列化详解

    Java序列化,看这篇就够了

    Parcelable 和 Serializable的区别和使用

     

    借着博文记录近期一个Cmake的编译问题::一个项目有段时间没有运行,后续忽然出现下面的问题,

    java.io.FileNotFoundException: D:\Work_project\Series_X\Artist Cam Editor\libraries\PixaToon-master\app\.externalNativeBuild\cmake\release\arm64-v8a\android_gradle_build.json

    这个文件用来被Android Gradle Plugin中的externalNativeBuild任务解析,将构建命令解析出来,然后编译C/C++代码,最后产生目标so文件。

    解决方法:"Build->Refresh linked C++ projects

     

     

     

     

     

    展开全文
  • 上篇文章介绍了人类活动识别常用...会在之后的文章中介绍),本文详细介绍了UCI-HAR数据集,并通过该数据集来探索加载数据集方法、数据可视化流程、问题建模分析以及模型评估思路,为以后的建模实现分类任务打好基础。

    【时间序列预测/分类】 全系列60篇由浅入深的博文汇总:传送门


    上篇文章介绍了人类活动识别常用的方法、最新进展和面临的挑战。UCI人类活动识别数据集是人类活动识别领域的benchmark数据集(还有一个常用的特征维数和活动种类更多的OPPORTUNITY数据集,会在之后的文章中介绍),本文详细介绍了UCI-HAR数据集,并通过该数据集来探索加载数据集方法、数据可视化流程、问题建模分析以及模型评估思路,为以后的建模实现分类任务打好基础。



    前言

    人类活动识别是将专用硬件设备或智能手机记录的加速度计数据序列分类为已知的明确运动的问题。考虑到每秒产生的大量观测数据、观测数据的时间性质以及缺乏将加速度计数据与已知运动联系起来的明确方法,这是一个具有挑战性的问题。经典的方法包括基于固定大小窗口的时间序列数据和训练机器学习模型(如决策树集合)的人工提取特征的方法。困难在于,特征工程需要有信号处理、数理统计、机器学习等领域的专业知识。近年来,诸如递归神经网络(RNN)和一维卷积神经网络(CNN)等深度学习方法被证明能够在很少或没有数据特征工程的情况下,为具有挑战性的活动识别任务提供最好的表现。本文主要内容如下:

    • UCI-HAR 数据集详细介绍。
    • 如何加载数据集和处理数据。
    • 如何使用折线图、直方图和方框图来更好地理解数据。
    • 如何对问题建模,包括框架、数据准备、建模和评估。

    1. UCI-HAR 数据集介绍

    1.1 简介

    UCI 人类活动识别数据集是以智能手机采集的传感器数据为基础的活动识别,创建于2012年,实验团队来自意大利热那亚大学。在2012年的论文《Human Activity Recognition on Smartphones using a Multiclass Hardware-Friendly Support Vector Machine》中,采用机器学习算法建模,提供了该数据集分类性能的baseline。在2013年的论文《A Public Domain Dataset for Human Activity Recognition Using Smartphones》中,对数据集进行了全面描述。数据集可以从UCI机器学习存储库免费下载:👉传送门

    这些数据是从30名年龄在19岁到48岁之间的志愿者身上收集的,这些志愿者将智能手机绑在腰间,进行6项标准活动中的一项,通过开发的手机软件记录运动数据。同时记录每个执行活动的志愿者的视频,后期根据这些视频和传感器数据进行手动标记所属运动类别(类似剪辑视频中的音画同步)。执行的六项活动如下:

    1. Walking
    2. Walking Upstairs
    3. Walking Downstairs
    4. Sitting
    5. Standing
    6. Laying
    

    选择30名年龄在19-48岁之间的志愿者作为研究对象。记录的运动数据是来自智能手机(特别是三星Galaxy S II)的x、y和z加速度计数据(线性加速度)和陀螺仪数据(角速度),采样频率为 50Hz(每秒50个数据点)。每名志愿者进行两次活动序列,第一次在设备位于腰间左侧,第二次测试时,智能手机由用户自己按喜好放置。


    1.2 数据收集、处理流程

    原始数据不可用。数据集,提供了数据集的预处理版本。预处理步骤包括:

    • 使用噪声滤波器对加速度计和陀螺仪进行预处理
    • 将数据分割成2.56秒(128个数据点)的固定窗口,重叠50%
    • 将加速度计数据分为重力(总)和人体运动分量

    我们使用手机加速度计和陀螺仪以50Hz 的采样率收集了三轴线性加速度和角速度信号。使用中值滤波器和截止频率为 20Hz的三阶低通Butter-worth滤波器对这些信号进行了预处理,以降低噪声。 该速率足以捕获人体运动,因为其能量的99%包含在15Hz以下[3]。 使用另一个巴特沃斯低通滤波器将具有重力和人体运动成分的加速度信号分离为人体加速度和重力。 假定重力仅具有低频分量,因此从实验中我们发现,对于恒定重力信号,0.3Hz是最佳转折频率。

    将特征工程应用于窗口数据,并提供具有这些经过特征工程的数据。从每个窗口中提取了人类活动识别领域中常用的一些时间和频率特征。结果是一个561元素的特征向量。数据集根据受试者的数据分为训练集(70%)和测试集(30%),例如,训练21名受试者,测试9名受试者。

    更多详细信息请查看上文提到的两篇论文。


    1.3 难点解惑

    论文提出一个问题的框架,通过有分类标签的数据样本进行建模训练,以预测预测新对象上的运动活动。乍一看比较难理解的几个数据:

    • 561 :特征工程之后的特征数,关于这些特征的说明,在数据集中的 features.txt和features_info.txt 作了详细说明,因为我们都是使用处理好的九轴传感器数据来建立深度学习模型,此处不再赘述。
    • 128:数据集shape的第二个维度 128,看论文就很清楚了,在 2.56 秒的固定宽度滑动窗口中对时间信号进行采样,有 50% 的重叠。(2.56sec×50Hz = 128cycles)
    • 73522947:数据集中将训练集和测试集中的传感器数据按照一个特征一个txt的格式各分成了9个文件,如下图所示。73522947 是测试集和训练集中每个txt文件shape的第一个维度,表示重采样之后的样本个数。一定要理解好数据集的shape!
      在这里插入图片描述
    训练集数据

    1.4 训练集和测试集文件下的文件介绍

    训练集和测试集文件下的文件,文件格式相同、数量相同。我们以训练集文件夹下的文件为例说明:
    一级目录:
    在这里插入图片描述
    test:测试集数据;
    train:训练集数据;
    activity_labels.txt:活动的真实标签(6个);
    features.txt:特征工程的特征;
    features_info.txt:特征工程处理说明;


    二级目录:
    在这里插入图片描述

    • X_train.txt:未经处理的原始数据,这个不用,可以不关心;
    • y_train.txt:活动类别标签(数字1-6表示),shape为(7352,1)说明:注意这里的标签是从1开始表示第一类,而one-hot编码是从0开始,注意编码的时候要减去1!这个在以后的建模过程中会遇到,先说明一下。
    • subject train.txt:将训练集的每一个样本与志愿者编号(1-30)对应,即给每条样本记录属于哪位志愿者做标识,shape为(7352,1)

    三级目录:
    在这里插入图片描述

    • body_acc_x_train.txtbody_acc_y_train.txtbody_acc_z_train.txt:三轴的加速度数据;
    • body_gyro_x_train.txtbody_gyro_y_train.txtbody_gyro_z_train.txt:三轴的陀螺仪数据(角速度);
    • total_acc_x_train.txttotal_acc_y_train.txttotal_acc_z_train.txt:三轴的重力加速度数据;

    test 文件夹下的文件结构跟 train 文件夹下是相同的,只是shape不一样。本文和以后的几篇文章中,使用的都是这两个文件夹下的数据作为训练数据和测试数据,不使用原始数据和经过特征工程的数据。


    2. 加载数据

    使用panda中的read_csv()方法将单个文件加载为DataFrame格式,然后通过自定义的函数实现批量加载,通过numpy的不同维度的stack方法,将所有数据集重塑成为训练样本和测试样本的三维数组。

    2.1 加载单个文件

    def load_file(filepath):
        dataframe = pd.read_csv(filepath, header=None, delim_whitespace=True)
        return dataframe.values
    

    2.2 加载所有文件

    有之前有关时间序列预测任务的经验之后,我们知道对于CNN和LSTM来说,对多变量的训练数据的shape有严格的规定,因此自定义了这个函数,来将原训练数据进行加载,并重塑成CNN和LSTM等网络架构期望的输入shape:[样本、时间步长、特征]

    下文的 load_dataset() 函数实现了此功能。没有使用参考文章中的加载数据方法,那种方法在我第一次阅读代码的时候比较难懂,有些地方写死了,换成自己的数据集就不适用了;因此重写了该函数,简化代码的同时易于理解,方便扩展。下文的代码也是如此,为了简化代码,提高可读性和可扩展性,减少修改源代码,做了许多重写。代码中各函数的功能都做了说明,难理解的地方做了注释。保姆用心良苦a ~

    先导入必要的模块:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    

    代码实现:

    def load_dataset(data_rootdir, dirname, group):
        '''
        该函数实现将训练数据或测试数据文件列表堆叠为三维数组
        '''
        filename_list = []
        filepath_list = []
        X = []
        
        # os.walk() 方法是一个简单易用的文件、目录遍历器,可以高效的处理文件、目录。
        for rootdir, dirnames, filenames in os.walk(data_rootdir + dirname):
            for filename in filenames:
                filename_list.append(filename)
                filepath_list.append(os.path.join(rootdir, filename))
            #print(filename_list)
            #print(filepath_list)
        
        # 遍历根目录下的文件,并读取为DataFrame格式;
        for filepath in filepath_list:
            X.append(load_file(filepath))
        
        X = np.dstack(X) # dstack沿第三个维度叠加,两个二维数组叠加后,前两个维度尺寸不变,第三个维度增加;
        y = load_file(data_rootdir+'/y_'+group+'.txt')
        print('{}_X.shape:{},{}_y.shape:{}\n'.format(group,X.shape,group,y.shape))
        return X, y
    

    查看训练集测试集shape

    train_rootdir = 'D:/GraduationCode/01 Datasets/UCI HAR Dataset/train/'
    test_rootdir = 'D:/GraduationCode/01 Datasets/UCI HAR Dataset/test/'
    data_dirname = '/Inertial Signals/'
    trainX, trainy = load_dataset(train_rootdir, data_dirname, 'train')
    testX, testy = load_dataset(test_rootdir, data_dirname, 'test')
    

    输出:

    train_X.shape:(7352, 128, 9),train_y.shape:(7352, 1)
    
    test_X.shape:(2947, 128, 9),test_y.shape:(2947, 1)
    

    3. 活动类别平衡性分析

    可视化数据集第一步是查看活动分类的分布情况。30位志愿者每一位都完成了6项活动。我们需要检查数据是否平衡,使建模更容易,可以自定义一个函数来查看各类别的情况,例如标签文件 train_y.txttest_y.txt。代码实现:

    def class_distribution(data):
        '''
        该函数实现各分类数据的数量和百分比统计
        '''
        df = pd.DataFrame(data) # 转化为DataFrame格式
        counts = df.groupby(0).size() # axis=0沿行分组;size()方法统计每个组的大小
        print(counts)
        counts = counts.values
        print(counts)
        
        for i in range(len(counts)):
            percent = counts[i] / len(df) * 100
            print('Class=%d, total=%d, percentage=%.3f%%' % (i+1, counts[i], percent))
    
    print('Train Dataset Class Distribution')
    class_distribution(trainy)
            
    print('Test Dataset Class Distribution')
    class_distribution(testy)
    
    print('Total Class Distribution')
    combined = np.vstack((trainy, testy))
    class_distribution(combined)
    

    输出:

    Train Dataset Class Distribution
    0
    1    1226
    2    1073
    3     986
    4    1286
    5    1374
    6    1407
    dtype: int64
    [1226 1073  986 1286 1374 1407]
    Class=1, total=1226, percentage=16.676%
    Class=2, total=1073, percentage=14.595%
    Class=3, total=986, percentage=13.411%
    Class=4, total=1286, percentage=17.492%
    Class=5, total=1374, percentage=18.689%
    Class=6, total=1407, percentage=19.138%
    Test Dataset Class Distribution
    0
    1    496
    2    471
    3    420
    4    491
    5    532
    6    537
    dtype: int64
    [496 471 420 491 532 537]
    Class=1, total=496, percentage=16.831%
    Class=2, total=471, percentage=15.982%
    Class=3, total=420, percentage=14.252%
    Class=4, total=491, percentage=16.661%
    Class=5, total=532, percentage=18.052%
    Class=6, total=537, percentage=18.222%
    Total Class Distribution
    0
    1    1722
    2    1544
    3    1406
    4    1777
    5    1906
    6    1944
    dtype: int64
    [1722 1544 1406 1777 1906 1944]
    Class=1, total=1722, percentage=16.720%
    Class=2, total=1544, percentage=14.992%
    Class=3, total=1406, percentage=13.652%
    Class=4, total=1777, percentage=17.254%
    Class=5, total=1906, percentage=18.507%
    Class=6, total=1944, percentage=18.876%
    

    可以看到每个类的分布非常相似,基本上占数据集的13%到19%之间。测试集和两个数据集的结果看起来非常相似。假设训练集和测试集以及每个主题的类分布是平衡的,那么使用数据集很可能是安全的。


    4. 绘制各特征数据折线图

    我们正在处理时间序列数据,因此需要查看训练数据的折线图。数据由每个变量的时间序列的窗口窗口宽度为128的滑动窗口截取,窗口有50%的重叠。这意味着,除非消除重叠,否则绘图中会包含一些重复的线图。

    4.1 获取训练集/测试集中的志愿者编号

    加载train目录中的 subject train.txt 文件,该文件包含训练集中是哪些志愿者的数据,包含志愿者的编号(1-30中的数字)。先使用上文自定义的 load file() 函数加载此文件,然后使用numpy的unique函数来获取这些这些志愿者的唯一索引列表。代码实现:

    sub_map = load_file('D:/GraduationCode/01 Datasets/UCI HAR Dataset/train/subject_train.txt')
    train_subjects = np.unique(sub_map) # 找到训练集中包含哪些志愿者(返回唯一索引列表)的数据(数据集由30位志愿者收集)
    print('sub_map.shape:{}\ntrain_subjects:{}'.format(sub_map.shape,train_subjects))
    

    输出:

    sub_map.shape:(7352, 1)
    train_subjects:[ 1  3  5  6  7  8 11 14 15 16 17 19 21 22 23 25 26 27 28 29 30]
    

    4.2 截取指定志愿者所属的数据样本

    接下来,我们需要一种方法来检索单个志愿者的所有数据样本,例如编号为1的志愿者。通过查找属于给定志愿者的所有行号来完成此操作,并使用这些行号从训练数据集中切分X和y。 这里说明一点,subject train.txty_train.txt 以及 body_acc_x_train.txtbody_acc_y_train.txtbody_acc_z_train.txt 等9个文件,这些文件的第一个维度是相同的,都为(7352,)。所以索引也是一一对应的,因此可以根据志愿者文件中的索引来截取训练样本和测试样本的数据。代码实现:

    def data_for_subject(X, y, sub_map, sub_id):
        '''
        该函数实现根据志愿者编号来从数据X和标签y中截取相应的行数据
        '''
        ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id]
        return X[ix, :, :], y[ix]
    

    4.3 数据样本去重叠

    获取某一个志愿者的样本之后,为避免原样本对绘图有影响,需要先消除这种重叠,并将给定变量的窗口压缩成一个可以直接绘制为折线图的序列片段。代码实现:

    def to_series(windows):
        '''
        该函数实现将窗口序列数据转换为列表
        '''
        series = list()
        
        for window in windows:
            # 消除重叠窗口部分
            half = int(len(window) / 2) - 1 # 窗口一半的宽度;原数据重叠率为50%
            # 切片截取每一行的后半部分数据,正好避开重叠部分(上一行的后半部分和下一行的前半部分是重叠的)
            for value in window[-half:]:    
                series.append(value)
        return series
    

    4.4 绘制指定志愿者的训练样本/测试样本折线图

    重写获取志愿者编号的方法:

    def get_sub_map(sub_filepath):
        '''
        该函数实现获取训练集或测试集中包含志愿者编号的唯一索引列表
        sub_filepath:subject_train.txt/subject_test.txt文件路径;
        filename:'train'/'test';
        '''
        sub_map = load_file('D:/GraduationCode/01 Datasets/UCI HAR Dataset/train/subject_train.txt')
        subjects_list = np.unique(sub_map) # 找到训练集中包含哪些志愿者(返回唯一索引列表)的数据(数据集由30位志愿者收集)
        return sub_map, subjects_list
    

    查看编号为1的志愿者的数据情况:

    subject_train_path = 'D:/GraduationCode/01 Datasets/UCI HAR Dataset/train/subject_train.txt'
    train_sub_map, train_subjects = get_sub_map(subject_train_path)
    train_sub_id = train_subjects[0] # 志愿者列表中编号为1的志愿者
    train_subX, train_suby = data_for_subject(trainX, trainy, train_sub_map, train_sub_id)
    print('train_subX.shape:{}\ntrain_suby.shape:{}'.format(train_subX.shape, train_suby.shape))
    

    输出:

    train_subX.shape:(347, 128, 9)
    train_suby.shape:(347, 1)
    

    可以看到编号为1的志愿者的训练样本shape和训练标签的shape。


    绘图函数完整代码:

    def plot_subject(X, y):
        '''
        该函数实现根据志愿者标号绘制其9轴传感器数据和活动变化图
        共十个子图
        '''
        plt.figure(figsize=(12,20), dpi=150)
        n, off = X.shape[2] + 1, 0 # X的第三个维度为特征数9(9轴传感器数据)
    
        name_list = ['total acc ', 'body acc ', 'body gyro ']
        axis_list = ['x', 'y', 'z']
        for name in name_list:
            for i, axis in enumerate(axis_list, start=0):
                plt.subplot(n, 1, off+1) # 创建n行1列的画布,在off+1位置绘图;
                # X[:,:,off] 三维数组切片中,off通过for循环实现递增,
                # 一次截取一个特征的所有数据(二维数组),输入到to_series函数进行处理,实现去除重叠部分。
                plt.plot(to_series(X[:,:,off]))
                plt.title(name + axis, y=0, loc='left', size=18)
                plt.ylabel(r'$Value$', size=16)
                plt.xlabel(r'$timesteps$', size=16)
                off += 1
        
        plt.subplot(n, 1, n)
        plt.plot(y)
        plt.title('activity', y=0, loc='left', size=18)
        plt.ylabel(r'$Class$', size=16)
        plt.xlabel(r'$Nums$', size=16)
        plt.tight_layout()
        plt.show()
    

    绘制编号为1的志愿者数据情况:

    plot_subject(train_subX, train_suby)
    

    输出:
    在这里插入图片描述
    从图中可以看出活动1、2、3(与步行活动相关)相对应的曲线比较密集,活动4、5和6(坐着,站着和躺着)的虚线相对比较平缓,基本上为直线。这很好地证实了已正确加载的数据集的解释。

    还可以看出,这个主体执行了两次相同的一般活动序列(回忆前文,两次执行,一次将手机绑在腰间,一次任意放置。),并且某些活动执行了两次以上。这表明,对于给定的主题,我们不应假设可能已经执行了哪些活动或其顺序。我们还可以看到一些固定活动(例如躺下)的曲线的波动相对较大,这些可能是异常值或与活动转换有关。最后,我们看到这九个变量之间有很多共性。很可能只需要这些迹线的一个子集就可以建立预测模型。


    查看志愿者编号为11的数据情况

    train_sub_id = train_subjects[6] # 列表中的第7位志愿者编号为11
    train_subX, train_suby = data_for_subject(trainX, trainy, train_sub_map, train_sub_id)
    print('train_subX.shape:{}\ntrain_suby.shape:{}'.format(train_subX.shape, train_suby.shape))
    plot_subject(train_subX, train_suby)
    

    输出:
    在这里插入图片描述


    5. 查看每位志愿者的数据分布情况(直方图)

    由于问题已经解决,我们对使用某些受试者的运动数据来预测其他受试者的运动感兴趣。这表明跨对象的运动数据必须具有规律性。我们知道数据大概在-1和1之间缩放,每个对象的运动幅度是相似的。我们还希望,假设运动对象执行相同的动作,他们之间的运动数据分布也会相似。可以通过绘制并比较跨对象的运动数据的直方图来进行检查。

    一种有用的方法是为每个对象创建一个图并绘制给定数据的所有三个轴(例如,总加速度),然后对多个对象重复此操作。可以将图修改为使用相同的轴并水平对齐,以便可以比较对象之间每个变量的分布。代码实现:

    def plot_subject_histograms(X, y, sub_map, sensor_type_id, n_subs=10):
        '''
        该函数实现绘制指定数量志愿者的三轴传感数据直方图;
        sensor_type_id:指定绘制哪三轴,可选取值0,3,6;
        n_subs=10:表示默认绘制前十名志愿者的数据;
        '''
        plt.figure(figsize=(12,20), dpi=150)
        subject_ids = np.unique(sub_map[:, 0]) # 获取训练集或者测试集中所有志愿者的编号
    
        for i in range(n_subs):
            sub_id = subject_ids[i]
            subX, _ = data_for_subject(X, y, sub_map, sub_id) # 根据志愿者编号截取相应的数据
    
            for j in range(3):
                ax = plt.subplot(n_subs, 1, i+1)
                ax.set_xlim(-1, 1)
                ax.hist(to_series(subX[:, :, sensor_type_id+j]), bins=100, density=True, histtype='bar', stacked=True)
            plt.title(f'sub_id:{sub_id}', y=0, loc='left', size=18)
        
        plt.tight_layout()         
        plt.show()
        
    plot_subject_histograms(trainX, trainy, train_sub_map, sensor_type_id=0) #10位志愿者总的加速度数据分布图
    plot_subject_histograms(trainX, trainy, train_sub_map, sensor_type_id=3) #...身体加速度
    plot_subject_histograms(trainX, trainy, train_sub_map, sensor_type_id=6) #...重力加速度
    

    运行该示例将创建三个图形,每个图形都有10个带有三个轴直方图的图。给定图上的三个轴均具有不同的颜色,x,y、z轴的传感器数据分别是蓝色,橙色和绿色。


    5.1 加速度直方图

    第一张图显示了前10位志愿者的人体加速度直方图。可以看到所有数据在整个轴上聚集在0附近。这表明数据可能居中(均值为零)。志愿者之间的这种强一致性可能有助于建模,并且可能表明志愿者在总加速度数据中的差异可能没有那么大的帮助。
    在这里插入图片描述


    5.2 角速度分布直方图

    第二张图显示了前10位志愿者的的陀螺仪数据(三轴角速度)的分布直方图。可以看出以0为中心,并且高斯分布(正态分布)的可能性很高。分布向两侧逐渐变宽,并显示出较宽的尾巴,这对于跨对象的运动数据建模是合适的数据分布情况。
    在这里插入图片描述


    5.3 总的重力加速度直方图

    最后一张图显示了前10位志愿者的总加速度。可以看到给定轴的分布确实出现了具有大量单独数据组的高斯分布。有一些分布是对齐的(例如,中间的主要组位于0附近),这表明跨对象的运动数据可能存在某些连续性,至少对于该数据而言是这样的。
    在这里插入图片描述


    6. 每一类(共6类)的分布情况

    如果要查看每一类活动的分布情况,一种简单的方式是查看指定志愿者的数据分布情况。希望看到单个志愿者的不同活动的运动数据之间的分布有所不同,可以通过为每个活动创建直方图来查看此情况,并在每个图上使用给定数据类型的三个轴。同样,这些图可以竖直,以按活动比较每个数据轴的分布。首先,将数据按活动类型分组,然后为每个活动创建一个子图,并将数据的每个轴添加到直方图。代码实现:

    # 将数据按活动类别分组
    def data_by_activity(X, y, activities):
        return {a:X[y[:,0]==a, :, :] for a in activities}
    

    绘图:

    def plot_activity_histograms(X, y, sensor_type_id):
        activity_ids = np.unique(y[:, 0]) # 获取训练集或测试集标签中的类别编号(1-6)
        grouped = data_by_activity(X, y, activity_ids)
        plt.figure(figsize=(12,20), dpi=150)
        
        activity_list = ['Walking','Walking-upstairs','Walking-downstairs','Sitting','Standing','Laying']
        print(activity_ids)
        for i, activity in enumerate(activity_list, start=0):
            act_id = activity_ids[i]
            
            for j in range(3): # 总的加速度
                ax = plt.subplot(len(activity_ids), 1, i+1)
                ax.set_xlim(-1,1)
                plt.hist(to_series(grouped[act_id][:, :, sensor_type_id + j]), bins=100)
                
            plt.title(activity, y=0, loc='left', size=18)
        plt.tight_layout()
        plt.show()
        
    plot_activity_histograms(train_subX, train_suby, sensor_type_id=0) # 身体加速度
    plot_activity_histograms(train_subX, train_suby, sensor_type_id=3) # 身体角速度
    plot_activity_histograms(train_subX, train_suby, sensor_type_id=6) # 重力加速度
    

    运行示例将创建三个图形,其中每个图形都有六个子图,一个对应于训练数据集中第一位志愿者的每个活动的分布情况。总加速度x、y、z轴数据分别是蓝色,橙色和绿色直方图。


    第一张图显示了每个活动的身体加速度分布。可以看到,运动中的活动,静止的活动之间的活动分布更为相似。在运动活动中,数据看起来是双峰的;在静止活动中,数据看起来是高斯的或指数的。活动的总加速度与身体加速度分布所看到的模式反映了在上一部分中针对相同的数据类型所看到的结果。总加速度数据也许是区分活动的关键。
    在这里插入图片描述
    第二张图显示了第7位志愿者的每项活动的陀螺仪数据。可以看到与人体加速度数据具有相似模式的图,尽管对于运动中的活动,可能显示出类似高尾的分布,而不是双峰分布。
    在这里插入图片描述
    最后一张图中,可以看到每个活动具有不同的数据分布,运动的活动(前三个活动)与静止活动(后三个活动)之间存在明显差异。前三个活动的数据分布看起来是高斯分布,其均值和标准差可能有所不同;后一种活动的分布看起来是多峰的。
    在这里插入图片描述


    7. 活动持续时间的分布

    最后要考虑的领域是受试者在每项活动上花费的时间,这与分类的平衡紧密相关。如果活动(类)总体上在数据集中是平衡的,那么我们期望给定志愿者在不同活动上也是平衡的。 可以通过计算每个受试者在每个活动上花费多长时间(以样本或行为单位)并查看每个活动的持续时间分布来确认这一点。查看此数据的一种简便方法是将分布汇总为箱型图,以中位数(线),中间50%(方框),数据的一般范围(四分位数范围(晶须))和异常值(点)。代码实现:

    import random
    def random_color(nums):
        '''
        该函数实现生成指定数量的随机颜色列表
        '''
        colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
        color = ''
        color_list = []
        for i in range(nums):
            for i in range(6):
                color += colorArr[random.randint(0,14)]
            color_list.append('#'+color)
            color = ''
        return color_list
    
    def get_act_dura_by_sub(X, y, sub_map):
        '''
        该函数实现找到训练集或者测试集中各类活动的数量
        '''
        subject_ids = np.unique(sub_map[:,0])
        activity_ids = np.unique(y[:,0])
    
        activity_windows = {a:list() for a in activity_ids} # 为每个活动建一个列表
        
        plt.figure(figsize=(12,8), dpi=150)
    
        for sub_id in subject_ids:
            _, subj_y = data_for_subject(X, y, sub_map, sub_id)
    
            for a in activity_ids:
                activity_windows[a].append(len(subj_y[subj_y[:,0]==a]))
                
        durations = [activity_windows[a] for a in activity_ids] # 将持续时间整理到列表列表中
        
        return durations
    
    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    def plot_box_act(train_sub_fp, test_sub_fp, labels, 
                     show_colors=True, show_hori_lines=True):
        '''
        该函数实现绘制训练集和测试集数据的箱型图
    	'''
        sub_map_train = load_file(train_sub_fp)
        train_dura = get_act_dura_by_sub(trainX, trainy, sub_map_train)
        
        sub_map_test = load_file(test_sub_fp)
        test_dura = get_act_dura_by_sub(testX, testy, sub_map_test)
        
        fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12, 6), dpi=150)
            
        # vert=True:水平; patch_artist=True:填充颜色;showmeans=True:显示均值;notch=True:以凹口形式绘制箱形图;sym= :异常点的形状;
        bplot1 = ax1.boxplot(train_dura, vert=True,  patch_artist=True, showmeans=True, notch=True, sym='o', labels=labels) 
        ax1.set_title('训练集数据箱型图', size=18)
    
        bplot2 = ax2.boxplot(test_dura, vert=True,  patch_artist=True, showmeans=True, labels=labels)
        ax2.set_title('测试集数据箱型图', size=18)
        
        # 填充颜色
        if show_colors == True:
            colors = random_color(len(labels))
            for bplot in (bplot1, bplot2):
                for patch, color in zip(bplot['boxes'], colors):
                    patch.set_facecolor(color)
    
        # 增加水平线
        if show_hori_lines == True:
            for ax in [ax1, ax2]:
                ax.yaxis.grid(True)
                ax.set_xlabel('$Activitys$', size=16)
                ax.set_ylabel('$Observed values$', size=16)
        
        plt.tight_layout()
        plt.show()
    

    调用函数绘图:

    train_sub_fp = 'D:/GraduationCode/01 Datasets/UCI HAR Dataset/train/subject_train.txt'
    test_sub_fp = 'D:/GraduationCode/01 Datasets/UCI HAR Dataset/test/subject_test.txt'
    labels = ['Walking','W-upstairs','W-downstairs','Sitting','Standing','Laying']
    plot_box_act(train_sub_fp, test_sub_fp, labels, show_colors=True, show_hori_lines=True)
    

    运行示例将创建六个箱形图,每个活动类别一个。每个箱形图总结了训练数据集中的每个活动花费了多长时间(以行或窗口数为单位)。可以看到,志愿者在固定活动(4、5和6)上花费的时间更多,而在运动活动(1、2和3)上花费的时间少,其中活动3花费时间最少。这些活动之间的差异不大,表明不需要删减时间较长的活动或运动中活动的过度采样。但是,如果活动分类模型表现较差,则需要考虑重采样的方法。
    在这里插入图片描述


    8. 建模分析

    8.1 问题框架

    第一个重要的考虑因素是预测问题的框架。原始工作的问题框架是根据已知受试者的运动数据和活动类别进行训练,然后再根据给定的运动数据来预测其他志愿者的活动类别。可以总结为:

    • 根据运动数据的时间步预测活动类别。
    • 根据多个运动数据窗口预测活动类别。
    • 预测给定多个运动数据窗口的活动序列。
    • 根据预先分段活动的长序列数据预测活动。
    • 根据运动数据的时间步预测活动停止或过渡。
    • 在给定运动数据窗口的情况下,预测平稳(活动4,5,6)或非平稳活动(活动1,2,3)。

    以上思路难易程度不同,针对的任务也不同,提供了探索和理解数据集的多种方法,可以根据自己的业务需求选择合适的问题框架。


    8.2 数据准备

    在使用原始数据训练模型之前,需要进行一些数据准备。UCI-HAR数据集已经将数据缩放到[-1,1]的取件了。当我们使用自己的数据集的时候,可以尝试以下数据转换:

    • 对每一个志愿者(被采集对象)的数据进行归一化(Normalization);
    • 对总体数据进行归一化(Normalization);
    • 对每一个志愿者(被采集对象)的数据进行标准化(Standardization);
    • 对总体数据进行标准化(Standardization);
    • 选取不同轴作为特征(有些轴的数据对整体结果影响不大,可以剔除某些轴);
    • 数据类型特征选择(int、float32、float64);
    • 采样异常点检测与去除;
    • 移除过多活动的窗口;
    • 对代表性不足的活动窗口进行过采样;
    • 将信号数据下采样至 1 4 、 1 2 、 1 、 2 \frac14、\frac12、1、2 412112 或其他比例。

    8.3 预测建模

    人类活动识别是一个时间序列多分类问题。它也可以被构造为二元分类问题和多步时间序列分类问题。论文在数据集上使用经典的机器学习算法(一种改进的支持向量机)进行多分类,从每个数据窗口设计特征。

    支持向量机在数据集的特征工程版本上的结果可以提供问题性能的 baseline(基线)。从这一点出发,在这个版本的数据集上对多个线性、非线性和机器学习算法的评估可以提供一个改进的基准。问题的焦点可能是是否使用未经处理的数据集。这里,可以探索模型复杂性以确定最适合该问题的模型;可供探索的一些模型包括:

    • 常见的线性、非线性和集成机器学习算法;
    • MLP;
    • 1D CNN;
    • LSTM;
    • CNN-LSTM、ConvLSTM;
    • DeepConvLSTM;
    • LSTM-FCN

    9. 模型评估

    UCI-HAR 数据集的论文中,将训练集和测试集按照7:3的比例划分。上文我们这种数据分割方法的探索表明,这两组数据都合理地代表了整个数据集。可以尝试对每个志愿的数据采用留一法交叉验证或者k折交叉验证的方法。

    使用分类精度和混淆矩阵来评估模型性能,这两种方法都适用于多分类预测问题。具体地说,混淆矩阵有助于确定某些类是否比其他类更容易预测或更具挑战性,例如对于静止活动还是涉及运动的活动。


    10. 扩展

    之后的文章会介绍经典的机器学习算法、CNN、CNN-LSTM、ConvLSTM、DeepConvLSTM、LSTM-FCN实现时间序列分类任务。


    参考:
    https://machinelearningmastery.com/how-to-model-human-activity-from-smartphone-data/
    python os.walk():https://www.runoob.com/python/os-walk.html
    python os.path():https://www.runoob.com/python/python-os-path.html
    numpy stack()/vstack()/hstack()/dstack()函数详解:https://blog.csdn.net/weixin_39653948/article/details/104829112
    pandas groupby() :https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html?highlight=groupby#pandas.DataFrame.groupby
    numpy unique:https://numpy.org/devdocs/reference/generated/numpy.unique.html?highlight=unique#numpy.unique
    numpy dstack:https://numpy.org/devdocs/reference/generated/numpy.dstack.html
    Axis hist:https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.hist.html?highlight=hist#matplotlib.axes.Axes.hist
    Axis boxplot:https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.boxplot.html?highlight=boxplot#matplotlib.axes.Axes.boxplot
    随机生成颜色:https://blog.csdn.net/u014662865/article/details/82016609

    展开全文
  • 测试时间序列的40个问题

    千次阅读 2020-09-21 19:34:23
    时间序列预测与建模在数据分析中起着重要的作用。时间序列分析是统计学的一个分支,广泛应用于计量经济学和运筹学等领域。这篇技能测试文章是为了测试你对时间序列概念的了解程度。 共有1094人报名参加了这次技能...

    作者|SAURABH JAJU 编译|Flin 来源|analyticsvidhya

    介绍

    时间序列预测与建模在数据分析中起着重要的作用。时间序列分析是统计学的一个分支,广泛应用于计量经济学和运筹学等领域。这篇技能测试文章是为了测试你对时间序列概念的了解程度。

    共有1094人报名参加了这次技能测试。这个测试是为了测试你对时间序列的了解的水平。如果你错过了这次技能测试,这里有一些问题和对应的解决方案。如果你错过了实时测试,也可以通过阅读本文以了解你有多少题目是可以正确回答的。

    这是所有参赛者的排行榜

    所有的得分

    下面是分布得分,它们将帮助你评估你的表现。

    你可以在下方链接查看分数。

    300多人参加了技能测试,获得的最高分数为38分。以下是一些关于分布的统计数据。

    • 平均分:17.13
    • 中位数:19
    • 众数:19

    1) 下面哪一个是时间序列问题的例子?

    1. 估计未来6个月酒店客房预订数量。
    2. 估计保险公司未来三年的总销售额。
    3. 估计下一周的通话次数。

    A) 只有 3 B) 1 和 2 C) 2 和 3 D) 1 和 3 E) 1,2 和 3

    解决方案:(E)

    以上所有选项都与时间序列有关。

    2) 以下哪项不是时间序列模型的示例?

    A) 朴素法

    B) 指数平滑

    C) 移动平均

    D) 以上都不是

    解决方案:(D)

    朴素法:一种估计技术,在这种技术中,最后一个时期的实际情况被用作这一时期的预测,而不加以调整或试图确定因果因素,适用于比较稳定的序列。它仅用于与更复杂的技术生成的预测进行比较。

    在指数平滑中,旧数据的相对重要性逐渐降低,而新数据的相对重要性逐渐提高。

    在时间序列分析中,移动平均(MA)模型是一种常用的单变量时间序列建模方法。移动平均模型指定输出变量线性依赖于随机项(不完全可预测)的当前值和各种过去值。

    3) 下列哪项不能作为时间序列图的组成部分?

    A) 季节性

    B) 趋势

    C) 周期性

    D) 噪声

    E) 以上都不是

    解决方案:(E)

    当一系列因素受到季节因素(例如,一年中的一个季度、一个月或一周中的一天)的影响时,就存在一种季节模式。季节性总是一个固定且已知的时期。因此,季节性时间序列有时被称为周期性时间序列

    季节总是一个固定且已知的时期。当数据呈现非固定周期的涨跌时,它就存在一种循环模式。

    趋势被定义为时间序列中跟日历无关且无规律影响的“长期”运动,是底层的反映。它是人口增长、物价上涨和一般经济变化等影响的结果。下图描绘了一个随时间有明显上升趋势的系列。

    噪声:在离散时间内,白噪声是一种离散信号,其样本被视为一系列均值为零、方差有限的不相关随机变量。

    因此,上述所有内容都是时间序列的组成部分。

    4) 在时间序列建模中,下列哪项比较容易估计?

    A) 季节性

    B) 周期性

    C) 季节性和周期性没有区别

    解决方案:(A)

    正如我们在前面的解中所看到的,由于季节性呈现平稳的结构,所以更容易估计。

    5) 下面的时间序列图包含周期性和季节性成分

    A)真 B)假

    解决方案: (B)

    上面的图中以固定的时间间隔重复出现差不多的趋势,因此实际上只是季节性的。

    6)时间序列数据(不包括白噪声)中的相邻观测值是独立且均匀分布的(IID)

    A)真 B)假

    解决方案:(B)

    随着观测值之间的时间间隔变短,它们往往与时间强相关。因为时间序列预测是基于以前的观察数据而不是当前的观察数据,不像分类或回归那样数据与数据之间关联性不高。

    7) 接近1的平滑参数会给预测中的最新观测值带来更大的权重或影响

    A) 真

    B) 假

    解决方案:(A)

    将较大的权重应用于较新的观测结果中,比应用到历史数据的观测结果中更为明智。这正是简单指数平滑背后的概念。预测是使用加权平均值计算的,加权平均值随着过去观测值的增加呈指数递减——最小的权重将与最早的观测值相关。

    8)指数平滑的权重之和是_____

    A)<1 B)1 C)> 1 D)以上都不是

    解决方案: (B)

    表7.1显示了使用简单指数平滑法进行预测时,对四个不同α值的观测值的权重。请注意,对于任何合理的样本量,即使对于较小的α,权重的总和也将约为1。

    Observationα=0.2α=0.4α=0.6α=0.8
    yT0.20.40.60.8
    yT−10.160.240.240.16
    yT−20.1280.1440.0960.032
    yT−30.1020.08640.03840.0064
    yT−4(0.2)(0.8)(0.4)(0.6)(0.6)(0.4)(0.8)(0.2)
    yT−5(0.2)(0.8)(0.4)(0.6)(0.6)(0.4)(0.8)(0.2)

    9)上一阶段的预测是70,而需求是60。什么是简单的指数平滑?当Alpha = 0.4时,预测下一个周期。

    A) 63.8 B) 65 C) 62 D) 66

    解决方案:(D) Yt-1 = 70 St-1 = 60 Alpha = 0.4

    代入,得:

    0.4 * 60 + 0.6 * 70 = 24 + 42 = 66

    10)自协方差测量什么?

    A) 不同时间观测到的不同序列上多个点之间的线性相关性

    B) 不同时间观测到的同一序列上两点之间的二次相关性

    C) 同时观测到的不同序列两点之间的线性关系

    D) 在不同时间观测到的同一序列上两点之间的线性关系

    解决方案:(D)

    选项D是自协方差的定义。

    11) 下列哪项不是弱平稳时间序列的必要条件?

    A) 平均值是恒定的,不依赖于时间

    B) 自协方差函数仅通过其差|s-t|依赖于s和t(其中t和s为时刻)

    C) 所考虑的时间序列是一个有限方差过程

    D) 时间序列是高斯的

    解决方案:(D)

    高斯时间序列意味着平稳性是严平稳性。

    12) 下列哪项不是平滑时间序列的技术?

    A) 最近邻回归

    B) 局部加权散点图平滑

    C) 基于树的模型,如(CART)

    D) 平滑样条曲线

    解决方案:(C)

    时间序列平滑和滤波可以用局部回归模型来表示。多项式和回归样条也提供了平滑的重要技术。基于CART的模型不提供要叠加在时间序列上的方程,因此不能用于平滑。所有其他技术都是有据可查的平滑技术。

    13)如果2016年10月需求为100,2016年11月需求为200,2016年12月需求为300,2017年1月需求为400。2017年2月的3个月移动平均线是多少?

    A)300

    B) 350

    C) 400

    D)需要更多的信息

    解决方案:(A)

    X' = (xt-3 + xt-2 + xt-1) /3

    (200+300+400)/ 3 = 900/3 =300

    14)查看下面的ACF图,你是否建议将AR或MA用于ARIMA建模技术?

    A)AR B)MA C)不能判断

    解决方案:(A)

    在以下情况下考虑使用MA模型:如果差分序列的自相关函数(ACF)表现出明显的截尾或偏相关系数表现出拖尾,则考虑添加一个模型的MA项。ACF截止的滞后时间就是MA项数。

    但是,由于没有表现出明显的截尾,因此必须采用AR模型。

    15)假设你是Analytics Vidhya的一名数据科学家。你注意到1 - 3月对文章的评论增加了。而11月- 12月期间的浏览量有所下降。

    以上陈述是否代表数据具有季节性?

    A)真 B)假 C)不能判断

    解决方案:(A)

    是的,这是一个明确的季节性趋势,因为在特定时间视图会发生变化。

    请记住,“季节性”是指在特定的周期性时间间隔内出现的变化。

    16)以下哪个图形可用于检测时间序列数据中的季节性?

    1.多个盒图 2.自相关

    A)仅1 B)仅2 C)1和2 D)这些都不是

    解决方案:(C)

    季节性是在特定的周期间隔内变化的存在。

    分布的变化可以在多个盒图中观察到。因此,可以很容易地发现季节性。自相关图应在等于周期的滞后处显示峰值。

    17)平稳性是时间序列过程的理想属性。

    A)是 B)假

    解决方案:(A)

    当满足以下条件时,时间序列是平稳的。

    1. 平均值是恒定的,不依赖于时间
    2. 自协方差函数仅取决于s和t的差| s-t |。(其中t和s是时间点)
    3. 考虑的时间序列是一个有限方差过程

    这些条件是数学上表示要用于分析和预测的时间序列的必要先决条件。因此,平稳性是理想的属性。

    18)假设你获得的时间序列数据集只有4列(id,Time,X,Target)

    如果给定窗口大小2,特征X的滑动平均值是多少?

    注意:X栏代表滑动平均值。

    A)

    B)

    C)

    D)以上都不是

    解决方案: (B)

    X` = Xt-2 + Xt-1 / 2

    根据以上公式:(100 +200)/ 2 = 150; (200 + 300)/ 2 = 250,依此类推。

    19)想象一下,你正在处理时间序列数据集。你的经理要求你建立一个高度准确的模型。你开始构建以下两种类型的模型。

    模型1:决策树模型

    模型2:时间序列回归模型

    在对这两个模型进行评估的最后,你发现模型2比模型1更好。

    A)模型1不能像模型2那样映射线性关系 B)模型1总是比模型2更好 C)你不能将决策树与时间序列回归进行比较 D)这些都不是

    解决方案: (A)

    时间序列模型类似于回归模型。因此,它擅于找到简单的线性关系。基于树的模型虽然有效,但在发现和利用线性关系方面却并不那么擅长。

    20)哪种类型的分析对于根据以下类型的数据进行温度预测最有效。

    A)时间序列分析 B)分类 C)聚类 D)以上都不是

    解决方案:(A)

    本题获取了连续几天的数据,因此最有效的分析类型是时间序列分析。

    21)温度/降水变量的一次差分是多少?

    A)15,12.2,-43.2,-23.2,14.3,-7 B)38.17,-46.11,-4.98,14.29,-22.61 C)35,38.17,-46.11,-4.98,14.29,-22.61 D)36.21, -43.23,-5.43,17.44,-22.61

    解决方案:(B)

    73.17-35 = 38.17 27.05-73.17 = – 46.11,依此类推。 13.75 – 36.36 = -22.61

    22)考虑以下数据集:

    {23.32 32.33 32.88 28.98 33.16 26.33 29.88 32.69 18.98 21.23 26.66 29.89} 时间序列滞后一个样本的自相关是什么?

    A) 0.26 B) 0.52 C) 0.13 D) 0.07

    解决方案:(C)

    ρˆ1 = PT t = 2(x t-1- x¯)(x t- x¯)PTt = 1(xt-x¯)^2

    =(23.32-x′)(32.33-x′)+(32.33-x′)(32.88-x′)+···PT t = 1(xt -x′)^2

    = 0.130394786

    其中x是级数的平均值,为28.0275

    23)任何平稳时间序列都可以近似为在各种频率下振荡的正弦和余弦的随机叠加。

    A)真 B)假

    解决方案:(A)

    弱平稳时间序列 xt 是有限方差过程,因此

    • 平均值函数 µt 是常数,并且不依赖于时间t;并且(ii)定义的自协方差函数γ(s,t)仅依赖于s和t的差| s-t |。

    在各种频率下振荡的正弦和余弦的随机叠加是白噪声。白噪声是微弱的或平稳的。如果白噪声变量也呈正态分布或高斯分布,则该序列也是严平稳的。

    24)弱平稳时间序列的自协方差函数不取决于___

    A)xs和xt的间隔 B)h = | s – t | C)在特定时间点的位置

    解决方案:(C)

    通过定义上一个问题中描述的弱平稳时间序列。

    25)如果_____,则两个时间序列联合平稳。

    A)它们都是平稳的 B)交叉方差函数仅是滞后h的函数 C)仅A D)A和B

    解决方案:(D)

    联合平稳性是根据上述两个条件定义的。

    26)在自回归模型中___

    A)因变量的当前值受自变量的当前值影响 B)因变量的当前值受自变量的当前值和过去值影响 C)因变量的当前值受因变量和自变量的过去值影响 D)以上都不是

    解决方案:(C)

    自回归模型基于这样的思想,即序列的当前值xt可以解释为p个过去值xt-1,xt-2,…,xt-p的函数,其中p决定了预测当前值所需的过去步进数。例如 xt = xt-1 -.90xt-2 + wt,

    其中xt-1和xt-2是因变量和wt的过去值,白噪声可以表示独立值。

    该示例可以扩展为包括类似于多元线性回归的多序列。

    27)对于MA(移动平均值)模型,对 σ=1 和 θ=5 产生与对 σ=25 和θ=1/5 相同的自协方差函数。

    A)真 B)假

    解决方案:(A)

    正确,因为MA模型的自协方差是可逆的

    请注意,对于MA(1)模型,对于θ和1 /θ,ρ(h)相同。

    28)通过查看下面的ACF和PACF图,可以在时间序列中包括多少个AR和MA项?

    A)AR(1)MA(0) B)AR(0)MA(1) C)AR(2)MA(1) D)AR(1)MA(2) E)不能判断

    解决方案:(B)

    滞后1的强负相关表明MA只有1个显著滞后。阅读本文以获得更好的理解。

    29)对于白噪声,以下哪项是正确的?

    A)均值= 0 B)自协方差为0 C)自协方差为0(零滞后除外 D)二次方差

    解决方案:(C)

    白噪声过程必须具有恒定的均值,恒定的方差和无自协方差结构(滞后零(方差)除外)。

    30)对于以下MA(3)过程 yt = μ + Εt + θ1Εt-1 + θ2Εt-2 + θ3Εt-3 ,其中σt是方差为σ2的零均值白噪声过程。

    A)在滞后3时ACF = 0 B)在滞后5中ACF = 0 C)在滞后1中ACF = 1 D)在滞后2中ACF = 0 E)在滞后3和滞后5中ACF = 0

    解决方案:(B)

    回想一下,MA(q)过程仅具有长度为q的记忆。这意味着,所有自相关系数在滞后q以后的值为零。这可以通过检查MA方程并看到只有过去的q个扰动项进入方程来看出。

    因此,如果我们向前迭代此方程超过q个周期,则扰动项的当前值将不再影响y。由于滞后零的自相关函数是时间t处的y与时间t处的y的相关性(即y_t与自身的相关性),因此根据定义,滞后0处的自相关函数必须为1。

    31)考虑下面的AR(1)模型,其扰动项具有零均值和单位方差。yt = 0.4 + 0.2 yt-1 + ut, y的(无条件)方差由____给出。

    A)1.5 B)1.04 C)0.5 D)2

    解决方案:(B)

    扰动的方差除以(1减去自回归系数的平方)

    在这种情况下为:1 /(1-(0.2 ^ 2))= 1 / 0.96 = 1.041

    32)pacf(部分自相关函数)对于区分__是必需的。

    A)AR和MA模型:错误 B)AR和ARMA模型:正确 C)MA和ARMA模型:错误 D)ARMA系列中的不同模型

    解决方案:(B)

    33)时间序列的二次差分可以帮助消除哪个趋势?

    A)二次趋势 B)线性趋势 C)A和B都是 D)以上都不是

    解决方案:(A)

    第一个差分表示为 xt = xt −xt−1. (1)

    如我们所见,第一个差分消除了线性趋势。第二个差分(即(1)的差分)可以消除二次趋势,依此类推。

    34)以下哪种交叉验证技术更适合时间序列数据?

    A)k-折交叉验证 B)留一法交叉验证 C)Stratified Shuffle Split交叉验证 D)前向链交叉验证

    解决方案:(D)

    时间序列是有序数据。因此,必须对验证数据进行排序。前向链可确保这一点。其工作方式如下:

    • fold 1:训练[1],测试[2]
    • fold 2:训练[1 2],测试[3]
    • fold 3:训练[1 2 3],测试[4]
    • fold 4:训练[1 2 3 4],测试[5]
    • fold 5:训练[1 2 3 4 5],测试[6]

    35)BIC比AIC更能惩罚复杂的模型。

    A)真 B)假

    解决方案:(A)

    AIC = -2 * ln(likelihood)+ 2 * k,

    BIC = -2 * ln(likelihood)+ ln(N)* k,

    当:

    k = 模型自由度

    N = 观察数

    在N相对较低时(7及以下),BIC比AIC更能容忍自由参数,但在N相对较高时则容忍度较低(因为N的自然对数大于2)。

    36)下图显示了n = 60个观测值的时间序列的估计自相关和部分自相关。基于这些图,我们应该____.

    A)通过获取日志来转换数据 B)对序列求差分以获取平稳数据 C)将MA(1)模型拟合到时间序列

    解决方案:(B)

    自相关显示出确定的趋势,而部分自相关显示出波动的趋势,在这种情况下,采用对数是没有用的。对序列求差分以获得平稳序列是唯一的选择。

    37-38

    37)使用上面给出的估计指数平滑度,并预测接下来3年(1998-2000年)的温度

    这些结果总结了简单指数平滑与时间序列的拟合。

    A)0.2,0.32,0.6 B)0.33,0.33,0.33 C)0.27,0.27,0.27 D)0.4,0.3,0.37

    解决方案:(B)

    指数平滑的预测值在3年中都是相同的,因此我们所需要的只是明年的值。平滑的表达式是

    smootht = α yt + (1 – α) smooth t-1

    因此,对于下一个点,平滑的下一个值(下一个观察的预测)为

    smoothn = α yn + (1 – α) smooth n-1

    = 0.39680.43 + (1 – 0.3968) 0.3968

    = 0.3297

    38) 找出1999年气温预测的95%预测区间。

    这些结果总结了简单指数平滑对时间序列的拟合。

    A)0.3297 2 * 0.1125 B)0.3297 2 * 0.121 C)0.3297 2 * 0.129 D)0.3297 2 * 0.22

    解决方案:(B)

    预测误差的标准偏差为

    1个周期为 0.1125

    2个周期为 0.1125 sqrt(1+α2) = 0.1125 * sqrt(1+ 0.39682) ≈ 0.121

    39)以下哪个陈述是正确的?

    1. 如果ARIMA模型中的自回归参数(p)为1,则表示序列中不存在自相关。
    2. 如果ARIMA模型中的移动平均成分(q)为1,则表示序列中具有滞后1的自相关
    3. 如果ARIMA模型中的积分成分(d)为0,则意味着系列不是平稳的。

    A)仅1 B)1和2均 C)仅2 D)所有陈述

    解决方案:(C)

    自回归分量:AR代表自回归。自回归参数由p表示。当p = 0时,表示序列中不存在自相关。当p = 1时,表示序列自相关到一个滞后。

    积分:在ARIMA时间序列分析中,积分用d表示。积分是微分的倒数。

    • 当d = 0时,这意味着级数是平稳的,我们不需要取其差。
    • 当d = 1时,这意味着该序列不是平稳的,并且要使其平稳,我们需要求第一差分。
    • 当d = 2时,表示序列需要二次差分。
    • 通常情况下,两个以上的差分是不可靠的。

    移动平均分量:MA表示移动平均,用q表示。在ARIMA中,移动平均q = 1表示它是一个误差项,并且存在一个滞后的自相关。

    40)在时间序列预测问题中,如果第1、2和3季度的季节指数分别为0.80、0.90和0.95。你对第四季度的季节性指数有何看法?

    A)小于1 B)大于1 C)等于1 D)季节性不存在 E)数据不足

    解决方案:(B)

    由于有四个季度,所以季节指数必须总计为4。0.80 + 0.90 + 0.95 = 2.65,因此对于4的季节指数个季度必须是4-2.65 = 1.35,所以B是正确的答案。

    原文链接:https://www.analyticsvidhya.com/blog/2017/04/40-questions-on-time-series-solution-skillpower-time-series-datafest-2017

    欢迎关注磐创AI博客站: http://panchuang.net/

    sklearn机器学习中文官方文档: http://sklearn123.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    展开全文
  • Improving the Accuracy of Global Forecasting Models using Time Series Data Augmentation ...该论文提出了一个新颖的、基于数据增强的预测框架,能够在数据不太丰富的情况下提高GFM模型的基准精度。 使用了三种
  • 时间序列数据挖掘

    千次阅读 2018-11-14 12:40:44
    时间序列是一种重要的高维数据类型,它是由客观对象的某个物理量在不同时间点的采样值按照...利用时间序列数据挖掘,可以获得数据中蕴含的与时间相关的有用信息,实现知识的提取[1]。时间序列数据本身所具备的高维...
  • 基于混沌序列数据加密算法

    千次阅读 2021-05-23 08:47:06
    那么下面我将给大家介绍一款基于Logistic映射混沌序列数据加密算法。一、混沌序列加密原理1、加密方式加密系统所采用的基本工作方式称为密码体制,根据对明文数据加密的方式,可将信息加密分为分组密码和序列密码...
  • 数据分析】基于时间序列的预测方法

    千次阅读 多人点赞 2021-01-13 14:59:40
    时间序列(Time Series,TS)是数据科学中比较有意思的一个领域。顾名思义,TS是按固定时间间隔收集的数据点的集合。对这些数据进行分析以确定长期趋势,以便预测未来或执行其他形式的分析。但是TS又与常规回归问题...
  • m序列产生原理及其性质

    千次阅读 2021-05-24 05:10:47
    m序列产生原理及其性质一、m序列的简介1、m序列是最长线性移位寄存器序列的简称。顾名思义,m序列是由多级移位寄存器或其延迟元件通过线性反馈产生的最长的码序列。在二进制移位寄存器中,若n为移位寄存器的级数,n...
  • 波动数据时间序列的分析与处理

    千次阅读 2021-04-21 09:37:13
    摘要:该文研究波动数据的处理与分析方法。波动性数据在各个行业的应用实践中,经常出现,对该类数据的处理方法的研究,具有重要的理论与实用价值。波动数据有的很有周期规律性,例如复合周期函数型的电子信号;有的...
  • 简单来说,时间序列的回归分析需要我们分析历史数据,找到历史数据演化中的特征与模式,其主要分为线性回归分析和非线性回归分析两种类型。 01 模型构建与验证 回归分析多采用机器学习方法,我们首先需要明确机器...
  • ACM SIGKDD(Conference on Knowledge Discovery and Data Mining, KDD)是全球最大规模的国际数据科学会议,将展示知识发现和数据挖...
  • 傅立叶变换是一种从完全不同的角度查看数据的强大方法:从时域到频域。 但是这个强大的运算用它的数学方程看起来很可怕。 将时域波变换为频域的公式如下: 下图很好地说明了傅立叶变换:将一个复杂的波分解成许多...
  • 序列数据(具有时间依赖性的数据)在业务中非常常见,从信用卡交易到医疗保健记录再到股票市场价格。 但是,隐私法规限制并极大地减慢了对研发至关重要的有用数据的访问。 这就产生了对具有高度代表性但又完全私有的...
  • 随着近年来物联网(IoT)的快速发展,时间序列数据出现了爆炸式增长。根据过去两年DB-Engines数据库类型的增长趋势,时间序列数据库的增长是巨大的。这些大型开源时间序列数据库的实现是不同的,并且它们都不是完美...
  • 时间序列预处理

    千次阅读 2020-12-19 21:43:55
           ...时间序列预处理流程图(侵删) 下面来详细介绍每个阶段的处理 数据预处理流程图 数据预处理-平稳性检验        
  • 时间序列数据挖掘模板: 墨尔本十年气温变化预测

    千次阅读 多人点赞 2020-03-12 23:00:30
    时间序列数据广泛存在于量化交易, 回归预测等机器学习应用, 是最常见的数据类型。所以这里通过墨尔本十年气温变化预测的任务来整理一个时间序列数据挖掘的模板,方便以后查阅方便。这个模板可以用在大部分的时间...
  • 问题描述 求取数组中最大连续子序列和,例如给定数组为A={1, 3, -2, 4, -5}, 则最大连续子序列和为6,即1+3+(-2)+ 4 = 6。 (一)穷举法no.1 穷举式的尝试所有可能,这里就不多做解释,这里的算法复杂度...
  • 异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程。有效的异常检测被广泛用于现实世界的很多领域,例如量化...
  • 但文章发现它的两个主要缺点: (1)位置不确定(locality-agnostics):原始 Transformer架构中的点积注意力机制(point-wise dotproduct self-attention)对本地上下文不敏感,这可能使模型在时间序列容易出现异常;...
  • 我们在采用LSTM,GRU等深度模型进行时间序列预测任务时,通常会采用滑动窗口策略,即将训练集和测试集划分为若干个滑动时间窗口,利用N个历史时间窗口的数据(xt−N,...,xtx_{t-N},...,xtxt−N​,...,xt)去预测未来...
  • m序列是最长线性反馈移位寄存器序列的简称,它是由带线性反馈的移位寄存器产生的周期最长的一种伪随机序列。是由移位寄存器、反馈抽头及模2加法器组成。m序列一旦反馈多项式及移位寄存器初值给定,则就是可以预先...
  • 本篇主要分析java序列化、反序列化的过程,原理, 并且通过简化版URLDNS做案例分析利用链原理。
  • Android数据序列化方案研究

    千次阅读 2017-07-12 14:48:06
    数据序列化在Android开发中占据着重要的地位,无论是在进程间通信、本地数据存储又或者是网络数据传输都离不开序列化的支持。而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响。 广义上讲,序列...
  • XGBoost和时间序列

    千次阅读 2021-03-23 09:02:51
    在很多领域和比赛中XGBoost已被用于预测此处的时间序列,它表现良好原因的在于为,需要它提供与时间相关的功能:比如滞后,频率,小波系数,周期等 由于XGBoost非常擅长识别数据模式,因此如果您有足够的描述数据集...
  • 【计量经济学导论】06. 序列相关性

    千次阅读 2020-10-31 17:15:21
    本文主要介绍序列相关问题对回归分析的影响,涉及了部分时间序列的内容。
  • 序列化和反序列

    千次阅读 2021-05-21 12:13:46
    定义以及相关概念互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如:TCP/...
  • 时间序列数据可能包含一些季节性的成分。 这是一个随时间重复的循环,按照月度或者年度。这种重复的循环可能会对我们想要建模预测的信号产生干扰,反之会给我们的模型带来一个非常强的信号。 在这个教程中,我们会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,758
精华内容 84,303
关键字:

容易产生序列相关问题的数据