样本熵(SampEn)计算时间序列复杂度(Python程序)

Posted 今天你在干什么(编程失败版)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了样本熵(SampEn)计算时间序列复杂度(Python程序)相关的知识,希望对你有一定的参考价值。

关于样本熵,Python有第三方包sampen可以直接引用,但是对于某些序列总会出现错误(我猜测说的是分母为0,计算逻辑的错误)

本来想顺着三方包进行检查,但是原包过于复杂,于是就结合网上的代码进行了修改。

样本熵的原理网上有很多,具体如下:

但是我有个疑惑,如果在一个时间序列中没有符合约束的距离即Ai和Bi,那么两者相除的时候就会返回错误(因为分母是不能为0的)。此时就说明了样本熵的值是无穷∞大的,也就说明该序列是很复杂的。 

def SampEn(U, m, r):
    """
    用于量化时间序列的可预测性
    :param U: 时间序列
    :param m: 模板向量维数
    :param r: 距离容忍度,一般取0.1~0.25倍的时间序列标准差,也可以理解为相似度的度量阈值
    :return: 返回一个-np.log(A/B),该值越大,序列就越复杂
    """

    def _maxdist(x_i, x_j):
        """
         Chebyshev distance
        :param x_i:
        :param x_j:
        :return:
        """
        return max([abs(ua - va) for ua, va in zip(x_i, x_j)])

    def _phi(m):
        x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
        C = [len([1 for j in range(len(x)) if i != j and _maxdist(x[i], x[j]) <= r]) for i in range(len(x))]
        result=sum(C)/(N-m)
        return result

    N = len(U)
    return -np.log(_phi(m + 1) / _phi(m))


if __name__ == '__main__':
    m=2
    data = [0.2, 0.6, 0.7, 1.2, 55, 66]
    print(SampEn(data, m, r=0.2 * np.std(data)))

以上是关于样本熵(SampEn)计算时间序列复杂度(Python程序)的主要内容,如果未能解决你的问题,请参考以下文章

Python近似熵,样本熵,模糊熵计算高效版

信息熵 增益

排列熵模糊熵近似熵样本熵的原理及MATLAB实现之近似熵

排列熵模糊熵近似熵样本熵的原理及MATLAB实现之近似熵

排列熵模糊熵近似熵样本熵的原理及MATLAB实现

1-2 决策树节点划分时的特征选择依据