微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用列表理解有效地计算能量峰度的最佳方法是什么?

如何解决使用列表理解有效地计算能量峰度的最佳方法是什么?

我想在 Python 3.8 的函数中计算 Teager Energy Kurtosis。我认为这也应该适用于列表理解。

我使用以下代码进行了尝试,但收到一条错误消息,指出 numpy 对象不可迭代。变量 data 包含一个包含来自加速度计的测量值的列表。

def EO(data):
       numerator = pow(len(data),2)*sum((pow(((pow(data[i+1],2) - pow(data[i],2))-(sum(pow(data[i+1],2))/len(data))),4)) for i in range(len(data)-1))
       denominator = pow(sum(pow(((pow(data[i+1],2) for i in range(len(data)-1)),2)
       energy_operator = numerator/denominator
       return energy_operator

实现此类公式的一般方法是什么,您必须多次迭代,当然也考虑到效率。要计算值的数据集包含 133329 个条目。

我想主要问题是分母的和包含另一个必须先形成的和。怎么做 ?。如果没有列表理解,我将使用 for 循环遍历整个数据集两次以首先获得平均值,然后在第二次迭代中计算其余部分。这样的可读性当然就没有了。

欢迎提出任何建议!

干杯, 格里特

编辑: 这是不使用列表理解的工作代码

def EO_5(data):
       summe = 0
       num_sum = 0
       den_sum = 0
       for i in range(1,len(data)-1):
          summe += pow(data[i],2)-((data[i-1])*(data[i+1]))
       ave = summe/len(data)
       for i in range(1,len(data)-1):
          num_sum += pow((pow(data[i],2)-((data[i-1])*(data[i+1])))-ave,4)
          den_sum += pow((pow(data[i],2)
       numerator = (len(data)-1)*num_sum
       denominator = pow(den_sum,2)
       return numerator/denominator

解决方法

给了。

def EO_5(data):
  ave = (sum([i**2 for i in data[1:-1]])-sum([i*j for i,j in zip(data[:-2],data[2:])]))/len(data)
  num = (sum([(j**2-i*k-ave)**4 for i,j,k in zip(data[:-2],data[1:-1],data[2:])]))*(len(data)-1)
  den = (sum([(j**2-i*k-ave)**2 for i,data[2:])]))**2
  return num/den
,
sum(pow(data[i+1],2) - pow(data[i],2))

我认为这是 (a) 问题。 sum 的参数基本上只是一个数字,而它应该是类似列表的(可迭代的)。

另一个问题是,这太严重了。这么长的线路让人皱眉,等等。

另一个问题是您共享的两个代码块中表达的数学似乎不匹配。第一个不起作用,似乎更接近于您链接的图像中的内容,但 IDK 如果这意味着它是“正确的”。有没有更好的参考“Teager Energy Kurtosis”。

我没有以任何方式对此进行测试,但这几乎是我简化您所说的工作代码的方式。

def EO_5(data):
    n = len(data) - 1)
    deltas = tuple(
        pow(x,2) - (before * after)
        for (before,x,after)
        in zip(data[:-2],data[2:])
    )
    ave = sum(deltas) / len(data)
    num_sum = sum(pow(d - ave,4) for d in deltas)
    den_sum = sum(pow(d - ave,2) for d in deltas)
    numerator = n * num_sum
    denominator = pow(den_sum,2)
    return numerator / denominator

如果您在性能方面遇到问题,您可以使用 numpy 来利用向量运算来使其更加简化,但我对此的经验有限。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?