8

以下のようなサンプル グラフがあります。これは、配列 X に (x,y) 値のセットをプロットしたものです。

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

ご覧のとおり、画像には 4000 から 5100 の間に密集したピーク値があります。

私の正確な質問は、グラフが最も密集しているこの範囲をプログラムで見つけることができるかということです。
つまり、配列 X では、このグラフが密集している範囲をどのように見つけることができますか?
この配列の場合、4000 ~ 5100 になります

。簡単にするために、配列には高密度領域が 1 つだけあると仮定します。
疑似コード/コードを提案していただければ幸いです。

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 に答える