8

我有一个像下面这样的示例图..,我用数组 X 中的一组 (x,y) 值绘制它。

http://bubblebird.com/images/t.png

如您所见,图像的峰值在 4000 到 5100 之间

我的确切问题是我可以以编程方式找到图形最密集的这个范围吗?
即..使用 Array X 如何找到该图密集的范围?
对于这个数组,它将是 4000 - 5100。

为简单起见,假设该数组只有一个密集区域。
如果您能建议一个伪代码/代码,将不胜感激。

4

3 回答 3

5

您可以在移动窗口上使用信号的方差。这是一个示例(参见附图,其中测试信号为红色,窗口方差为绿色,过滤后的信号为蓝色):

简单的例子

测试信号生成:

import numpy as np
X = np.arange(200) - 100.  
Y = (np.exp(-(X/10)**2) + np.exp(-((np.abs(X)-50.)/2)**2)/3.) * np.cos(X * 10.)

计算移动窗口方差:

window_length = 30 # number of point for the window
variance = np.array([np.var(Y[i-window_length / 2.: i+window_length/2.]) for i in range(200)])

获得方差高的指数(这里我选择标准方差优于最大方差的一半......你可以根据你的情况调整它):

idx = np.where(variance > 0.5 * np.max(variance))

X_min = np.min(X[idx])
# -14.0
X_max = np.max(X[idx])
# 15.0

或过滤信号(将方差低的点设置为零)

Y_modified = np.where(variance > 0.5 * np.max(variance), Y, 0)
于 2012-11-27T15:47:41.173 回答
4

您可以计算相邻值之间的绝对差,然后可以用滑动窗口稍微平滑一些东西,然后找到平滑后的绝对差值为最大值的 50% 的区域。

使用 python(你在标签中有 python)这看起来像这样:

a = ( 10, 11, 9, 10, 18, 5, 20, 6, 15, 10, 9, 11 )

diffs = [abs(i[0]-i[1]) for i in zip(a,a[1:])]
# [1, 2, 1, 8, 13, 15, 14, 9, 5, 1, 2]
maximum = max(diffs)
# 15
result = [i>maximum/2 for i in diffs]
# [False, False, False, True, True, True, True, True, False, False, False]
于 2012-11-27T13:38:52.433 回答
0

您可以使用分类算法(例如 k-means),将数据拆分为集群并找到权重最大的集群

于 2012-11-28T15:36:10.753 回答