scipy 在最后一个去定位元素上使用平滑度先验进行信号去定位的问题

im9ewurl  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(185)

我试着使用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、***------------------------------------------------------------------------------
ktca8awb

ktca8awb1#

用于创建稀疏矩阵D_2的数据矩阵B被创建得太短(N-2),并且在创建时它没有到达稀疏矩阵中的最后两列。
将上面的代码行更改为以下代码行:

B = np.dot(np.ones((N, 1)), np.array([[1, -2, 1]]))
t5zmwmid

t5zmwmid2#

本文称二阶差分矩阵为(N-3)×(N-1)。要做到这一点,你必须做到:

B = np.dot(np.ones((N, 1)), np.array([[1, -2, 1]]))
D_2 = sp.sparse.dia_matrix((B.T, [0, 1, 2]), shape=(N - 3, N-1))

现在D_2矩阵就可以了(例如N=10):

array([[ 1., -2.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  1., -2.,  1.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  1., -2.,  1.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  1., -2.,  1.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  1., -2.,  1.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  1., -2.,  1.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  1., -2.,  1.]])

相关问题