13

我工作的一个软件,其需要实现的一组数据的wiggliness。这里的输入我会收到的样本,合并每个垂直像素带的亮度情节: alt text确定数据集的“wiggliness” - Python的

不难看出,左边距为真的波浪(即有一吨最小值/最大值),我想生成一组图像的关键点。我已经对数据应用了一个高斯平滑函数〜10次,但是它似乎开始时相当虚弱。

任何想法?

这里是我的原代码,但它不会产生(用于wiggliness)很不错的结果:

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)) 
+10

你可以发布一个链接到一个准确定义的wiggliness? – 2010-11-16 06:29:48

+0

您正在寻找描绘频率特征或振幅特征的统计数据吗? – SingleNegationElimination 2010-11-16 07:14:45

+1

如果你问的方式来描述,而不是一种方式wiggliness以编程方式实现该特性,您可能对http://stats.stackexchange.com/更多的运气。 – katrielalex 2010-11-16 07:38:32

回答

5

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

如果我们能找出wiggliness是,这将有助于。我会说最左边的边缘是扭曲的B/C它有更多的高频内容,您可以通过使用傅里叶变换来形象化。

如果你把红色信号的高通滤波器,你会得到公正的高频内容,然后可以测量振幅和做阈值来确定wiggliness。但是我认为,莽撞只是需要更多的形式主义。

+0

谢谢!我会看看他们。我仍在试着弄清楚所有这些术语是什么意思;) – Blender 2010-11-17 15:05:28

1

对于这样的事情,numpy的使事情更加容易,因为它用于操纵矢量数据,例如提供有用的功能例如,你可以试着用原始数据wiggliness1或第一个差异wiggliness2的过零率(取决于应该是什么样的wiggliness,确切地说,如果全球趋势被忽略,你应该使用差异数据)。对于x,您可以从原始数据中获取感兴趣的切片或窗口,从而获得某种本地wiggliness的度量。 如果您使用原始数据,在删除偏差后,您可能还想将小于某个阈值的所有值设置为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)))))) 
+0

谢谢,我从来没有想到这一点。我想我会使用它,因为我的平滑算法消除了一些关键点... – Blender 2010-11-17 18:54:22