我试着使用neurokit 2的平滑先验方法来消除信号的趋势。
https://neurokit2.readthedocs.io/en/master/_modules/neurokit2/signal/signal_detrend.html
该方法基于Tarvainen等人2002年发表的研究论文“方法”(Tarvainen,M. P.,Ranta-Aho,P.O.,& Karjalainen,P.A.(2002).一种应用于HRV分析的先进去趋势方法. IEEE生物医学工程学报,49(2),172-175)。
我也看了一下论文,实现的代码看起来还可以。所以我真的需要一些关于这个问题的帮助:
def signal_detrend_smoothness_priors(signal, regularization=500):
N = len(signal)
identity = np.eye(N)
B = np.dot(np.ones((N - 2, 1)), np.array([[1, -2, 1]]))
import scipy as sp
D_2 = sp.sparse.dia_matrix((B.T, [0, 1, 2]), shape=(N - 2, N))
inv = np.linalg.inv(identity + regularization**2 * D_2.T @ D_2)
z_stat = ((identity - inv)) @ signal
trend = np.squeeze(np.asarray(signal - z_stat))
# detrend
detrended = np.array(signal) - trend
return detrended
该方法不断返回最后两个固定参数,并且信号在接近结束时逐渐减弱。
原始信号结束:1107.0,1068.25,1029.5,990.75,952.0,939.0,939.0,893.0,903.0,1004.0,1172.0,1101.0,1040.0,986.0,921.0,963.0,978.0]
通过以下方法确定的趋势结束:192.12546294、173.40315833、155.18668501、137.54799278、120.56268372、104.30992768、88.87237529、74.33606792、60.79044746、48.32841445、37.04619828、27.04344702、18.42367655、11.29498257、5.76979111、1.964643、963.、978.])
通过以下方法消除趋势信号结束:8.32209553e+02、8.54671586e+02、9.66953802e+02、1.14495655e+03、1.08257632e+03、1.02870502e+03、9.80230209e+02、9.19035357e+02、0.000000000e +00、0.00000000e+00])
- 另外,我还测试了一些其他代码,有时这些解决方案也会出现去趋势信号中最后两个元素的问题。-2.83746979e+01、-2.66270824e+00、1.15376970e+02、3.01091508e+02、2.47593345e+02、2.02817006e+02、***------------------------------------------------------------------------------
2条答案
按热度按时间ktca8awb1#
用于创建稀疏矩阵D_2的数据矩阵B被创建得太短(N-2),并且在创建时它没有到达稀疏矩阵中的最后两列。
将上面的代码行更改为以下代码行:
t5zmwmid2#
本文称二阶差分矩阵为(N-3)×(N-1)。要做到这一点,你必须做到:
现在D_2矩阵就可以了(例如N=10):