77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
#!/usr/bin/python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
'''
|
||
@Date : 2021.11.1
|
||
@Author : Herry
|
||
'''
|
||
import numpy as np
|
||
from vmdpy import VMD
|
||
from PyEMD import EMD, EEMD
|
||
|
||
class Decomposition:
|
||
def __init__(self, data, length):
|
||
self.data = data.reshape(-1)
|
||
self.length = length
|
||
|
||
def SSA(self):
|
||
series = self.data
|
||
# step1 嵌入
|
||
windowLen = self.length # 嵌入窗口长度
|
||
seriesLen = len(series) # 序列长度
|
||
K = seriesLen - windowLen + 1
|
||
X = np.zeros((windowLen, K))
|
||
for i in range(K):
|
||
X[:, i] = series[i:i + windowLen]
|
||
# step2: svd分解, U和sigma已经按升序排序
|
||
U, sigma, VT = np.linalg.svd(X, full_matrices=False)
|
||
|
||
for i in range(VT.shape[0]):
|
||
VT[i, :] *= sigma[i]
|
||
A = VT
|
||
|
||
# 重组
|
||
rec = np.zeros((windowLen, seriesLen))
|
||
for i in range(windowLen):
|
||
for j in range(windowLen - 1):
|
||
for m in range(j + 1):
|
||
rec[i, j] += A[i, j - m] * U[m, i]
|
||
rec[i, j] /= (j + 1)
|
||
for j in range(windowLen - 1, seriesLen - windowLen + 1):
|
||
for m in range(windowLen):
|
||
rec[i, j] += A[i, j - m] * U[m, i]
|
||
rec[i, j] /= windowLen
|
||
for j in range(seriesLen - windowLen + 1, seriesLen):
|
||
for m in range(j - seriesLen + windowLen, windowLen):
|
||
rec[i, j] += A[i, j - m] * U[m, i]
|
||
rec[i, j] /= (seriesLen - j)
|
||
|
||
return rec.T
|
||
|
||
def EMD(self):
|
||
data = self.data
|
||
decomp = EMD()
|
||
decomp.emd(data)
|
||
imfs, res = decomp.get_imfs_and_residue()
|
||
IMFs = imfs.T
|
||
IMFs = np.insert(IMFs, IMFs.shape[1], values=res, axis = 1)
|
||
|
||
return IMFs
|
||
|
||
def EEMD(self):
|
||
data = self.data
|
||
decomp = EEMD()
|
||
decomp.eemd(data)
|
||
imfs, res = decomp.get_imfs_and_residue()
|
||
IMFs = imfs.T
|
||
IMFs = np.insert(IMFs, IMFs.shape[1], values=res, axis = 1)
|
||
|
||
return IMFs
|
||
|
||
def VMD(self):
|
||
data = self.data
|
||
alpha, tau, length, DC, init, tol = 5000, 0, self.length, 0, 1, 1e-8
|
||
u, u_hat, omega = VMD(data, alpha, tau, length, DC, init, tol)
|
||
|
||
return u.T
|