【机器学习笔记30】时序分析(预处理)

【参考资料】
【1】《应用时序分析》
【2】https://pandas.pydata.org/pandas-docs/stable/api.html
【3】测试数据来源:智能运维挑战赛 http://iops.ai/
【4】《概率论与数理统计》
【5】http://www.dataguru.cn/thread-584371-1-1.html
【6】《应用回归分析》 第三章 多元回归分析
【7】https://stats.stackexchange.com/questions/129052/acf-and-pacf-formula/129374

一、相关概率知识点复习

1.1 数学期望:
设X是一个连续型随机变量,概率密度函数为f(x),当 + x f ( x ) d x < + \int_{-\infty}^{+\infty}|x|f(x)dx < +\infty 时,称X的数学期望存在,且:
E ( x ) = + x f ( x ) d x E(x)=\int_{-\infty}^{+\infty}xf(x)dx

例子:

设X服从正太分布 X N ( u , σ 2 ) X \sim N(u, \sigma^2) ,求期望E(x):

E ( x ) = + x 1 2 π σ e ( x u ) 2 2 σ 2 d x E(x)=\int_{-\infty}^{+\infty}x\dfrac{1}{\sqrt{2\pi}\sigma}e^{-\dfrac{(x - u)^2}{2\sigma^2}}dx

z = x u σ z=\dfrac{x-u}{\sigma} ,则:

E ( x ) = 1 2 π + ( σ z + u ) e z 2 / 2 d z E(x)=\dfrac{1}{\sqrt{2\pi}}\int_{-\infty}^{+\infty}(\sigma z + u)e^{-z^2/2}dz
= σ 2 π + z e z 2 / 2 d z + u 2 π + e z 2 / 2 d z =\dfrac{\sigma}{\sqrt{2\pi}} \int_{-\infty}^{+\infty}ze^{-z^2/2}dz + \dfrac{u}{\sqrt{2\pi}} \int_{-\infty}^{+\infty}e^{-z^2/2}dz

= 0 + u 2 π 2 π = u =0 + \dfrac{u}{\sqrt{2\pi}} \sqrt{2\pi} = u

备注(复习的时候发现第二项积分出 2 π \sqrt{2\pi} 居然不会推:(,如下,利用扩展成二重积分后用极坐标转换做:
在这里插入图片描述

1.2 方差:
设X是一组随机变量,若 E ( X E ( X ) ) 2 E(X-E(X))^2 存在,则称其为方差,记作D(X),称 D X \sqrt{DX} 为均方差或标准差。

对于连续随机变量,有: D ( x ) = + [ x i E ( X ) ] 2 d x D(x)=\int_{-\infty}^{+\infty}[x_i - E(X)]^2dx

1.3 边缘分布

二维随机变量(X,Y)关于X的边缘概率密度
f X ( x ) = + f ( x , y ) d y f_X(x)=\int_{-\infty}^{+\infty}f(x,y)dy //固定x对y求积分
二维随机变量(X,Y)关于Y的边缘概率密度
f Y ( y ) = + f ( x , y ) d x f_Y(y)=\int_{-\infty}^{+\infty}f(x,y)dx //固定y对x求积分

1.4 二维随机变量的数学期望
设二维随机变量为(X, Y)的联合概率密度为f(x,y),则:
E ( X ) = + x f ( x , y ) d x d y E(X)=\int_{-\infty}^{+\infty}xf(x,y)dxdy
E ( Y ) = + y f ( x , y ) d x d y E(Y)=\int_{-\infty}^{+\infty}yf(x,y)dxdy

举例:
在这里插入图片描述

1.5 二维随机变量的协方差和相关系数
设(X,Y)为二维随机变量,若E{[(X-E(X))(Y-E(Y)]}存在,则称其为随机变量X和Y的协方差,记作cov(X,Y),即:
cov(X, Y) = E{[(X-E(X))(Y-E(Y)]} 或展开为cov(X,Y)=E(XY)-E(X)E(Y)
如果X和Y是相互独立的,那么E(XY)=E(X)E(Y),其协方差为0。

同时我们定义相关系数如下:
ρ = c o v ( X , Y ) D ( X ) D ( Y ) \rho = \dfrac{cov(X,Y)}{\sqrt{D(X)D(Y)}}

1.6 二维随机变量的偏相关系数
定义简单相关系数:

r = i = 1 n ( X i X ˉ ) ( Y i Y ˉ ) i = 1 n ( X i X ˉ ) 2 i = 1 n ( Y i Y ˉ ) 2 r=\dfrac{\sum\limits_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum\limits_{i=1}^{n}(X_i - \bar{X})^2}\sqrt{\sum\limits_{i=1}^{n}(Y_i - \bar{Y})^2}}

定义偏相关系数:
r 12 ; 3 2 = ( r 12 r 13 r 23 ) 2 ( 1 r 13 2 ) ( 1 r 23 2 ) r_{12;3}^2=\dfrac{(r_{12} - r_{13}r_{23})^2}{(1-r_{13}^2)(1-r_{23}^2)}

二. 平稳性检验
2.1 时间序列的定义

对于时间序列 { X t , t T } \{X_t, t \in T\} ,定义概率分布密度如下:
任意正整数m,任取 t 1 , t 2 , . . . , t m T t_1, t_2, ... , t_m \in T ,则m维随机向量 ( X t 1 , X t 2 , . . . , X t m ) (X_{t1}, X_{t2}, ..., X_{tm})' 的联合概率密度记作 F t 1 , t 2 , . . . , t m ( x 1 , x 2 , . . . , x m ) F_{t_1, t_2, ... , t_m}(x_1, x_2, ..., x_m) 。由这些(注意是多个)有限维分布函数构成的全体称为序列 { X t } \{X_t\} 概率分布族

2.2 平稳时间序列的定义

严平稳: 设 { X t } \{X_t\} 为一个时间序列,对于任意正整数m,取 t 1 , t 2 , . . . , t m T t_1, t_2, ... , t_m \in T ,对任意 γ \gamma ,有:
F t 1 , t 2 , . . . , t m ( x 1 , x 2 , . . . , x m ) = F t 1 , t 2 , . . . , t m ( x 1 + γ , x 2 + γ , . . . , x m + γ ) F_{t_1, t_2, ... , t_m}(x_1, x_2, ..., x_m)=F_{t_1, t_2, ... , t_m}(x_{1+\gamma}, x_{2+\gamma}, ..., x_{m+\gamma})

简单讲就是在任务时刻,任何尺度下,该时序有相同的概率分布。

宽平稳: 如果 { X t } \{X_t\} 满足如下三个条件:
(1) 任取 t T t \in T ,有 E X t 2 < EX_t^2 < \infty
(2) 任取 t T t \in T , 有 E X t = μ EX_t = \mu
(3) 任取 t , s , k T t, s, k \in T k + s t T k+s-t \in T ,有 γ ( t , s ) = γ ( k , k + s t ) \gamma(t, s)=\gamma(k, k+s -t)

备注:(3)表示间隔相同的任意两个时刻,具备一样的自协方差

其中 γ \gamma 代表协方差,其中任取时间序列里的t、s时刻,有:
γ ( t , s ) = E ( X t μ t ) E ( X s μ s ) \gamma(t, s)=E(X_t - \mu_t)E(X_s - \mu_s)

2.3 平稳时间序列检测

1 时序图
在这里插入图片描述

2 自相关图

在这里插入图片描述

自相关系数的x轴表示计算自相关系数时时序的偏移量(同偏相关图),由自相关系数的定义可知,为1时表示时序统计性质一样,为0时表示两者独立。上面的自相关图可以对应看出其时序图是一个有单调上升趋势的非稳定时序。

3 偏相关图
在这里插入图片描述

程序如下

# -*- coding: utf-8 -*-
import numpy  as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf


df = pd.read_csv('./data/train.csv', sep=',')

#1. 取出其中一个序列
df_kpi = df[df['KPI ID'] == '02e99bd4f6cfb33f']

#2. 将值标准化
max_value = np.max(df_kpi['value'])
min_value = np.min(df_kpi['value'])

df_kpi['std_value'] = df_kpi.value.apply(lambda x : (x - min_value)/(max_value - min_value))

df_kpi.set_index(df_kpi['timestamp'])

#取100个点的时序
data = df_kpi.loc[0:100, ['std_value']]

#data.plot()
# 绘制时序图
#plt.show()
# 绘制自相关图
#plot_acf(data)
#plt.show()
# 绘制偏自相关图
plot_pacf(data)
plt.show()
三. 纯随机序列
3.1 纯随机序列定义

如果时间序列 { X t } \{X_t\} 满足如下性质:

  1. 任取 t T t \in T ,有 E X t = u EX_t=u ;
  2. 任取 t , s T t, s \in T ,有
    γ ( t , s ) = { σ 2 , t = s 0 , t s \gamma(t, s) = \begin{cases} \sigma^2, & t=s \\ 0, & t \ne s \end{cases}

备注:这里表示每个时间点都是高斯分布的,且不同时间点是相互独立的,因此其协方差为0。这种序列也成为白噪声序列。

3.2 纯随机序列检测

1 Q统计量

Belnet证明若一个时间序列是纯随机的,观察期数为n的观察序列,其序列的延迟非零周期的自相关系数将近似符合正太分布如下:
ρ k ^ N ( 0 , 1 n ) , k 0 \hat{\rho_k} \sim N(0, \dfrac{1}{n}), k \ne 0

由此定义Q统计量 Q = n k = 1 m ρ k 2 ^ Q = n \sum\limits_{k=1}^{m}\hat{\rho_k^2}

2 LB统计量

Q统计量在小样本环境下效果不好,因此人们采用LB统计量,如下定义:

L B = n ( n + 2 ) k = 1 m ρ k 2 ^ n k LB=n(n+2)\sum\limits_{k=1}^{m}\dfrac{\hat{\rho_k^2}}{n-k}

参考《统计相关基础知识点备注》

由于Q统计量近似于自由度为m的卡方分布 χ 2 ( m ) \chi^2(m) ,因此做假设检验,若Q统计量大于,卡方分布表中自由度m和显著性a对应的值,那么就认为该序列具备随机性。

四. 纯python代码

++代码计算自相似系数基于如下原理,即若存在时序 t 1 , t 2 , . . . , t n t_1, t_2, ..., t_n 实际上每次比较的是 t 1 , t 2 , t 3 t_1,t_2,t_3 t 2 , t 3 , t 4 t_2, t_3, t_4 这里假设偏移是1,观测序列长度是3。公式如下:++

ρ k ^ = t = 1 n k ( x t x ˉ ) ( x t + k x ˉ ) i = 1 n ( x t x ˉ ) 2 \hat{\rho_k}=\dfrac{\sum\limits_{t=1}^{n-k}(x_t - \bar{x})(x_{t+k} - \bar{x})}{\sum\limits_{i=1}^{n}(x_t - \bar{x})^2}

def _calc_autocorrelations(data, k, num):
    """
    data: 一维数据序列
    k: 序列偏移
    num: 观测序列长度
    """
    data_len = len(data)

    y_mean = np.array(data).mean()

    real_num = num

    if real_num + k > data_len:

        real_num = data_len - k


    x_obv = np.array(data[0 : real_num])
    y_obv = np.array(data[k : k + real_num])


    e_xy = np.sum((x_obv - y_mean) * (y_obv - y_mean))

    x_sigma = np.sum((x_obv - y_mean) * (x_obv - y_mean))

    return e_xy/x_sigma


df = pd.read_csv('./data/acf.csv', sep=',')

data = df.loc[:, ['value']]

acf_data = []

for i in range(0, 100):

    pk = _calc_autocorrelations(data, i, 20)

    acf_data.insert(i, pk)


##计算Q统计量
act_array = np.asarray(acf_data[0:10])
q_start = np.sum(act_array * act_array)*100*102/90



fig,ax=plt.subplots(figsize=(8, 5))
ax.plot(range(0, 100), acf_data, c='b',marker='.')
plt.grid() 
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Fredric_2014/article/details/84032889