Python实现相空间重构求关联维数

您所在的位置:网站首页 二维分形维数怎么求 Python实现相空间重构求关联维数

Python实现相空间重构求关联维数

2023-10-12 03:46| 来源: 网络整理| 查看: 265

Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m GP算法:

若有一维时间序列为{x1,x2,…,xn},对其进行相空间重构得到高维相空间的一系列向量:

x i ( τ , m ) = ( x i , x i 1 , ⋯   , x i + ( m − 1 ) τ ) {x_i}(\tau ,m) = \left( {{x_i},{x_{i1}}, \cdots ,{x_{i + {{(m - 1)}_\tau }}}} \right) xi​(τ,m)=(xi​,xi1​,⋯,xi+(m−1)τ​​)

式中: τ \tau τ为时间延迟, τ \tau τ=k Δ t {\rm{\Delta }}t Δt,其中k为整数,为采样时间间隔;m为嵌入维数;i=1,2,⋯,N;N为重构后向量的个数, N = n − ( m − 1 ) τ N = n - (m - 1)\tau N=n−(m−1)τ。 重构相空间关联维数为:

D 2 = lim ⁡ r → 0 ln ⁡ c r ln ⁡ r {D_2} = \mathop {\lim }\limits_{r \to 0} \frac{{\ln {c_r}}}{{\ln r}} D2​=r→0lim​lnrlncr​​

c r = 1 N 2 {c_r} = \frac{1}{{{N^2}}} cr​=N21​ ∑ ∑ H \sum\sum H ∑∑H ( r − ∣ ∣ x j − x k ∣ ∣ ) \left( {r - ||{x_j} - {x_k}||} \right) (r−∣∣xj​−xk​∣∣)

式中:j≠k;r为m维超球半径;H为Heaviside函数。

def GP(imf,tau): #GP算法求关联维数 N=2000 if (len(imf) != N): print('请输入指定的数据长度!') # N为指定数据长度 return elif (isinstance(imf, np.ndarray) != True): print('数据格式错误!') return else: m_max=10 #最大嵌入维数 ss=50 #r的步长 fig=plt.figure() for m in range(1,m_max+1): i_num = N - (m - 1) * tau kj_m = np.zeros((i_num, m)) # m维重构相空间 for i in range(i_num): for j in range(m): kj_m[i][j] = imf[i + j * tau] dist_min, dist_max = np.linalg.norm(kj_m[0] - kj_m[1]), np.linalg.norm(kj_m[0] - kj_m[1]) Dist_m = np.zeros((i_num, i_num)) # 两向量之间的距离 for i in range(i_num): for k in range(i_num): D= np.linalg.norm(kj_m[i] - kj_m[k]) if(D>dist_max): dist_max=D elif(D>0 and D{N}}}\sum R(jτ)=N1​∑ x ( i ) x ( i + j τ ) x(i)x(i + j\tau ) x(i)x(i+jτ)

当自相关函数值下降到初始函数值的1- e − 1 {{\rm{e}}^{ - 1}} e−1时。所对应的 τ \tau τ即为时间延迟参数。

# 计算GP算法的时间延迟参数(自相关法) def get_tau(imf): N=2000 if (len(imf) != N): print('请输入指定的数据长度!') # N为指定数据长度 return 0 elif (isinstance(imf, np.ndarray) != True): print('数据格式错误!') return 0 else: j = 1 # j为固定值 tau_max = 20 Rall = np.zeros(tau_max) for tau in range(tau_max): R = 0 for i in range(N - j * tau): R += imf[i] * imf[i + j * tau] Rall[tau] = R / (N - j * tau) for tau in range(tau_max): if Rall[tau] xi​,xi+τ​,⋯,xi+(m−1)τ​},i=1,2,…,N,N为向量总数,找出它的最近向量 X j ( m ) X_{j(m)} Xj(m)​,计算两者欧氏距离 R m ( i ) = ∣ ∣ X i ( m ) − X j ( m ) ∣ ∣ {R_{m }}(i) = ||{X_{i(m)}} - {X_{j(m )}}|| Rm​(i)=∣∣Xi(m)​−Xj(m)​∣∣,它们在m+1维空间的距离为:

R m + 1 ( i ) = ∣ ∣ X i ( m + 1 ) − X j ( m + 1 ) ∣ ∣ {R_{m + 1}}(i) = ||{X_{i(m + 1)}} - {X_{j(m + 1)}}|| Rm+1​(i)=∣∣Xi(m+1)​−Xj(m+1)​∣∣

如果 R m + 1 ( i ) {R_{m + 1}}(i) Rm+1​(i)>> R m ( i ) {R_{m}}(i) Rm​(i),则为虚假近邻点,定义比值:

R ( i ) = R(i)= R(i)= [ R m + 1 ( i ) ] 2 − [ R m ( i ) ] 2 [ R m ( i ) ] 2 \sqrt {\frac{{{{\left[ {{R_{m + 1}}(i)} \right]}^2} - {{\left[ {{R_m}(i)} \right]}^2}}}{{{{\left[ {{R_m}(i)} \right]}^2}}}} [Rm​(i)]2[Rm+1​(i)]2−[Rm​(i)]2​ ​

若 R ( i ) > R 0 R(i)>R_0 R(i)>R0​,则称 X j X_j Xj​为 X i X_i Xi​的假近邻点, R 0 R_0 R0​为阈值通常取大于10.计算该m下虚假近邻点占点比例,直到虚假近邻点百分比很小或不随m增大而减少时,此时的m即为所需嵌入维数。

#计算GP算法的嵌入维数(假近邻算法) def get_m(imf, tau): N=2000 if (len(imf) != N): print('请输入指定的数据长度!') # N为指定数据长度 return 0, 0 elif (isinstance(imf, np.ndarray) != True): print('数据格式错误!') return 0, 0 else: m_max = 10 P_m_all = [] # m_max-1个假近邻点百分率 for m in range(1, m_max + 1): i_num = N - (m - 1) * tau kj_m = np.zeros((i_num, m)) # m维重构相空间 for i in range(i_num): for j in range(m): kj_m[i][j] = imf[i + j * tau] if (m > 1): index = np.argsort(Dist_m) a_m = 0 # 最近邻点数 for i in range(i_num): temp = 0 for h in range(i_num): temp = index[i][h] if (Dist_m[i][temp] > 0): break D = np.linalg.norm(kj_m[i] - kj_m[temp]) D = np.sqrt((D * D) / (Dist_m[i][temp] * Dist_m[i][temp]) - 1) if (D > 10): a_m += 1 P_m_all.append(a_m / i_num) i_num_m = i_num - tau Dist_m = np.zeros((i_num_m, i_num_m)) # 两向量之间的距离 for i in range(i_num_m): for k in range(i_num_m): Dist_m[i][k] = np.linalg.norm(kj_m[i] - kj_m[k]) P_m_all = np.array(P_m_all) m_all = np.arange(1, m_max) return m_all, P_m_all 三连、三连、三连

完整测试代码如下: import numpy as np from scipy.fftpack import fft from scipy import fftpack import matplotlib.pyplot as plt N_ft=2000 #时频域的点数 # 计算GP算法的时间延迟参数(自相关法) def get_tau(imf): if (len(imf) != N_ft): print('请输入指定的数据长度!') # 需要更改,比如弹出对话框 return 0,0,0 elif (isinstance(imf, np.ndarray) != True): print('数据格式错误!') return 0,0,0 else: j = 1 # j为固定值 tau_max = 20 Rall = np.zeros(tau_max) for tau in range(tau_max): R = 0 for i in range(N_ft - j * tau): R += imf[i] * imf[i + j * tau] Rall[tau] = R / (N_ft - j * tau) for tau in range(tau_max): if Rall[tau] 1): index = np.argsort(Dist_m) a_m = 0 # 最近邻点数 for i in range(i_num): temp = 0 for h in range(i_num): temp = index[i][h] if (Dist_m[i][temp] > 0): break D = np.linalg.norm(kj_m[i] - kj_m[temp]) D = np.sqrt((D * D) / (Dist_m[i][temp] * Dist_m[i][temp]) - 1) if (D > 10): a_m += 1 P_m_all.append(a_m / i_num) i_num_m = i_num - tau Dist_m = np.zeros((i_num_m, i_num_m)) # 两向量之间的距离 for i in range(i_num_m): for k in range(i_num_m): Dist_m[i][k] = np.linalg.norm(kj_m[i] - kj_m[k]) P_m_all = np.array(P_m_all) m_all = np.arange(1, m_max) return m_all, P_m_all # GP算法求关联维数(时频域特征) def GP(imf, tau): if (len(imf) != N_ft): print('请输入指定的数据长度!') # 需要更改,比如弹出对话框 return elif (isinstance(imf, np.ndarray) != True): print('数据格式错误!') return else: m_max = 10 # 最大嵌入维数 ss = 50 # r的步长 fig = plt.figure(1) for m in range(1, m_max + 1): i_num = N_ft - (m - 1) * tau kj_m = np.zeros((i_num, m)) # m维重构相空间 for i in range(i_num): for j in range(m): kj_m[i][j] = imf[i + j * tau] dist_min, dist_max = np.linalg.norm(kj_m[0] - kj_m[1]), np.linalg.norm(kj_m[0] - kj_m[1]) Dist_m = np.zeros((i_num, i_num)) # 两向量之间的距离 for i in range(i_num): for k in range(i_num): D = np.linalg.norm(kj_m[i] - kj_m[k]) if (D > dist_max): dist_max = D elif (D > 0 and D


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3