映射数据到新空间

快速傅里叶变换

​ 用快速傅里叶变换(FFT)能将时域的数字信号转换为频域信号。转换为频域信号之后可以分析出信号的频率成分,在频域上进行处理。因此我们利用FFT可以将离散的时间序列数据转化为频域上的特征进行分析。

​ python的numpy包提供了FFT的实现。

>>> import numpy as np
>>> x = np.random.rand(8)
>>> x
array([ 0.15562099,  0.56862756,  0.54371949,  0.06354358,  0.60678158,
 0.78360968,  0.90116887,  0.1588846 ])
>>> xf = np.fft.fft(x)
>>> xf
array([ 3.78195634+0.j, -0.53575962+0.57688097j,-0.68248579-1.12980906j, -0.36656155-0.13801778j,0.63262552+0.j, -0.36656155+0.13801778j,
 -0.68248579+1.12980906j, -0.53575962-0.57688097j])

小波变换

  小波变换也是对时域信号的处理。

​ 傅立叶变换仅仅给出了信号的频谱分量,但没有给出关于这些分量出现时间的信息。因此,傅立叶变换一般不适用于分析非平稳信号。

​ 当需要对频谱分量进行时间定位时,我们就需要一个可以给出信号时-频表示的变换,其中一种就是小波变换。

#pip install PyWavelets
>>> import pywt
#一维离散小波变换(DWT)
#传入的参数为时间序列的数据,第二个参数为用于变换的小波
#['haar', 'db', 'sym', 'coif', ‘bior’, ‘rbio’, ‘dmey’]
#返回低频分量和高频分量
>>> (cA, cD) = pywt.dwt([1,2,3,4,5,6], 'db1')
>>> print cA
[ 2.12132034  4.94974747  7.77817459]
>>> print cD
[-0.70710678 -0.70710678 -0.70710678]

数据熵

​ 除了利用时域和频域间的转换来处理时间序列特征,还可以利用信息论中的特征表示方法来构建特征。主要有两种方式,分别是近似熵和样本熵。

  • 近似熵

    ​ 近似熵用以量化随时间序列数据波动的规律性和不可预测性。

    ​ 例如有两个序列的数据:

    ​ 序列1:[10,20,10,20,10,20,10,20,10,20,10,20 ...]

    ​ 序列2:[10,10,20,10,20,20,20,10,10,20,10,20,20 ...],其具有10或20的值,随机选择,每个具有概率1/2。

    ​ 像均值或方差等统计不能区分这两个序列,然而序列1是“规则的”,知道一个项为20使人能否确定地预测下时刻的随机估值,而在序列2中却无法由一个时刻的值准确预知下一时刻的值。

    ​ 时间序列中重复波动模式的存在使得它比没有这种模式的时间序列更可预测。近似熵反映了相似的观测模式不会被其他类似观测结果跟踪的可能性。包含许多重复模式的时间序列具有相对较小的近似熵值; 不太可预测的过程具有更高的近似熵值。

    算法

    ​ Step1:形成时间序列的数据。这是N个在原始数据上均匀采样的数据点。

    ​ Step2:选定固定m值(整数),r值(正实数),m代表比较运行的数据长度,r代表一个过滤级别。

    ​ Step3:形成一个载体序列,其中 ​ Step4:使用序列,构建 (number of such that , 其中, 中的个标量。等于两个向量分量的最大差值,用以表示两个向量之间的距离, 可以取的所有值,时,向量与其自身匹配。

    ​ Step5:定义

    ​ Step6:近似熵

    ​ 通常m=2或3,而r取决于应用。

  import numpy as np

  def ApEn(U, m, r):

      def _maxdist(x_i, x_j):
          return max([abs(ua - va) for ua, va in zip(x_i, x_j)])

      def _phi(m):
          x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
          C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
          return (N - m + 1.0)**(-1) * sum(np.log(C))

      N = len(U)

      return abs(_phi(m+1) - _phi(m))

  # Usage example
  U = np.array([85, 80, 89] * 17)
  print ApEn(U, 2, 3)
  1.0996541105257052e-05
  • 样本熵

    样本熵的作用与近似熵类似,但是不包括近似熵那样的自相似模式。是对近似熵的一种改进,它有以下优势:

    • 样本熵不包含自身数据段的比较,因此它是条件概率的服平均自然对数的精确值,样本熵的计算不依赖数据长度。
    • 样本熵具有很好的一致性,如一时间序列比另一时间序列有较高的样本熵的话,对于其他m和r也具有较高的样本熵。
    • 样本熵对丢失数据不敏感。

      样本熵计算:

      A为 number of such that

      B为 number of such that

      从定义中可以清楚地看到 A将始终具有小于或等于B。一个较小的也表明数据集中更多的自相似性或更少的噪声。

import numpy as np

def SampEn(U, m, r):

    def _maxdist(x_i, x_j):
        result = max([abs(ua - va) for ua, va in zip(x_i, x_j)])
        return result

    def _phi(m):
        x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
        C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) for x_i in x]
        return sum(C) - 1.0

    N = len(U)

    return -np.log(_phi(m+1) / _phi(m))

参考资料

1.google机器学习课程-特征组合

2.GDBT构建新的特征思想

3.sklearn利用GBDT模型进行特征变换的介绍

4.特征选择常用算法综述

5.机器学习中的数据清洗与特征处理综述

6.点击率预测问题建模 交叉特征构造

7.用Python做科学计算-FFT演示程序

8.小波变换教程

9.离散小波变换

10.维基百科-近似熵

11.维基百科-样本熵

12.时间序列的复杂度和熵

results matching ""

    No results matching ""