数据来源:
下面资源还在审核的话,就用上面的链接下载
针对数据ECG1和ECG2进行DFA分析。
红色为ECG1基于DFA的线性拟合
蓝色为ECG2基于DFA的线性拟合
需要注意如下:
1. 数据以对数曲线表示。
2. 这里时间长time=3 间隔s=0.03 数据长度只取到3000 为了避免错误,请确保【数据长度>=10^time】
3. 可以基于FDA继续算ECG1和ECG2的DCCA
4. 拟合是线性的,可根据自己数据情况考虑更换二次(比如金融数据)及以上。具体方法:DFA的第三个参数:线性=1,二次=2,以此类推
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def DFA(data,ni,fittime):
n = len(data)//ni
nf = int(n*ni)
n_mean =np.mean(data[:nf])
y = []
y_hat = []
for i in range(nf):
y.append(np.sum(data[:i+1]-n_mean))
for i in range(int(n)):
x = np.arange(1,ni+1,1)
y_temp = y[int(i*ni+1)-1:int((i+1)*ni)]
coef = np.polyfit(x,y_temp,deg=fittime)
y_hat.append(np.polyval(coef,x))
fn = np.sqrt(sum((np.asarray(y)-np.asarray(y_hat).reshape(-1))**2)/nf)
return fn
df = pd.read_csv('nsrdb-16265.csv')
ECG = df['ECG1'].values[:3000]
time = 3
s = 0.03
t = np.arange(1,time,s)
n = []
for i in range(len(t)):
n.append(int(10**t[i]))
f = []
for i in range(len(n)):
f.append(DFA(ECG,n[i],1))
coef = np.polyfit(np.log10(n),np.log10(f),1)
y_hat = np.polyval(coef,np.log10(n))
for i in range(len(n)):
y_hat[i] = 10**y_hat[i]
plt.plot(n,y_hat,c='r')
plt.xlabel('n')
plt.ylabel('F(n)')
plt.xscale('log')
plt.yscale('log')
ECG2 = df['ECG2'].values[:3000]
f2 = []
for i in range(len(n)):
f2.append(DFA(ECG2,n[i],1))
coef2 = np.polyfit(np.log10(n),np.log10(f2),1)
y2_hat = np.polyval(coef2,np.log10(n))
for i in range(len(n)):
y2_hat[i] = 10**y2_hat[i]
plt.plot(n,f2,'o')
plt.plot(n,y2_hat,'b')
plt.show()
matlab对应代码:DCCA算法matlab代码【因为是收费资源,防止广告,请自行搜索】