代码之家  ›  专栏  ›  技术社区  ›  Blender

确定数据集的“摆动度”——python

  •  13
  • Blender  · 技术社区  · 14 年前

    我正在开发一个软件,它需要实现一组数据的灵活性。以下是我将收到的输入示例,与每个垂直像素条的亮度图合并: alt text

    很容易看出左边距是 真的? Wiggly(即有大量的最小值/最大值),我想生成一组图像的临界点。我已经对数据应用了10次高斯平滑函数,但从一开始似乎很不稳定。

    有什么想法吗?

    这是我的原始代码,但它不会产生非常好的结果(对于Wiggligness):

    def local_maximum(list, center, delta):
      maximum = [0, 0]
    
      for i in range(delta):
        if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]]
        if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]]
    
      return maximum
    
    def count_maxima(list, start, end, delta, threshold = 10):
          count = 0
    
      for i in range(start + delta, end - delta):
        if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1
    
      return count
    
    def wiggliness(list, start, end, delta, threshold = 10):
      return float(abs(start - end) * delta) / float(count_maxima(list, start, end, delta, threshold))
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   gtrak    14 年前

    看看低通/高通/陷波/带通滤波器、傅立叶变换或小波。基本思想是有很多不同的方法来计算在不同时间段量化的信号的频率内容。

    如果我们能弄清楚什么是摇摆,那会有帮助的。我会说最左边的空白是摆动的b/c,它有更多的高频内容,你可以用傅立叶变换来可视化。

    如果你对这个红色信号进行高通滤波,你只会得到高频率的内容,然后你可以测量振幅并做阈值来确定摇摆度。但我想,摇摆只是需要更多的形式主义。

        2
  •  1
  •   miro    14 年前

    对于这些事情,numpy使事情变得更容易,因为它提供了操作向量数据的有用函数,例如,向每个元素添加一个标量,计算平均值等。

    例如,您可以尝试使用原始数据的零交叉率(wigglianess1)或第一个差异-权重2(取决于什么是wigglianess,确切地说,如果要忽略全局趋势,您可能应该使用差异数据)。对于x,您将从原始数据中获取感兴趣的切片或窗口,从而获得一种局部摆动的度量。 如果使用原始数据,在消除偏差后,您可能还希望将所有小于某个阈值的值设置为0以忽略低振幅摆动。

    import numpy as np
    
    def wiggliness1(x):
        #remove bias:
        x=x-np.average(x)
        #calculate zero crossing rate:
        np.sum(np.abs(np.sign(np.diff(x))))
    
    
    def wiggliness(x):
        #calculate zero crossing rate of the first difference:
        return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x))))))
    
    推荐文章