2017-11-25 10 views
0

This questionには、移動平均の取得方法に関する多くの有益な回答があります。 私はnumpy畳み込みとnumpy cumsumの2つのメソッドを試してみましたが、両方ともサンプルデータセットでうまく動作しましたが、実際のデータには短い配列が生成されました。移動平均は異なる長さの配列を生成しますか?

データは、0.01で区切られています。この例のデータセットの長さは50であり、実際のデータは数万である。だから問題を引き起こしているウィンドウサイズについての何かでなければならず、私は関数で何が起こっているのかよく分かりません。

これは私が関数を定義する方法である:

def smoothMAcum(depth,temp, scale): # Moving average by cumsum, scale = window size in m 
    dz = np.diff(depth) 
    N = int(scale/dz[0]) 
    cumsum = np.cumsum(np.insert(temp, 0, 0)) 
    smoothed=(cumsum[N:] - cumsum[:-N])/N 
    return smoothed 

def smoothMAconv(depth,temp, scale): # Moving average by numpy convolution 
    dz = np.diff(depth) 
    N = int(scale/dz[0]) 
    smoothed=np.convolve(temp, np.ones((N,))/N, mode='valid') 
    return smoothed 

は、その後、私はそれを実装:私は他の機能を使用する場合

scale = 5. 
smooth = smoothMAconv(dep,data, scale) 

しかしprint len(dep), len(smooth) 戻り81071 80572

と同じ起こります。 データと同じ長さのスムーズな配列を取得するにはどうすればよいですか?

なぜ小規模なデータセットで動作しましたか?異なるスケールを試しても(例とデータで同じものを使用しても)、この例の結果は元のデータと同じ長さになりますが、実際のアプリケーションでは同じ長さになりません。 私はnanという値の効果を考慮しましたが、例ではnanの場合は違いはありません。

問題はどこにありますか?可能であれば、完全なデータセットなしで伝えることができますか?

+0

シミュレーションデータ(私の答えの中のランダムな配列など)によって、大きなサイズのデータ​​セットを持つ再現可能な例を含むことができます。 – FTP

答えて

1

numpy.convolveはパラメータmode='same'をサポートしているため、アプローチの2番目の方法は長さを維持するために変更するのが簡単です。

np.convolve(temp, np.ones((N,))/N, mode='same') 

これは、ゼロパディングデータによって可能となっているが、両側のtempを設定する - あなたのデータが境界付近0であることを起こる場合を除き、必然的に境界でのいくつかの効果があります 。例:

N = 10 
x = np.linspace(0, 2, 100) 
y = x**2 + np.random.uniform(size=x.shape) 
y_smooth = np.convolve(y, np.ones((N,))/N, mode='same') 
plt.plot(x, y, 'r.') 
plt.plot(x, y_smooth) 
plt.show() 

smoothing

ゼロパディングの境界効果は、データポイントが約4~5であるが、減少させるために0

によってパディングさ右端、に非常に見えますこの望ましくない効果は、インテリジェントなパディングにnumpy.padを使用します。畳み込みのためにmode='valid'に戻ります。パッドの幅は、合計N-1個の要素が追加されるようにする必要があります.Nは移動するウィンドウのサイズです。アレイのエッジ値によって

y_padded = np.pad(y, (N//2, N-1-N//2), mode='edge') 
y_smooth = np.convolve(y_padded, np.ones((N,))/N, mode='valid') 

padding

パディングははるかに良く見えます。

0

移動平均の全体的なポイントは、配列を滑らかにすることであり、いくつかのデータポイントを除外します。それはあなたの配列をほぼ定義どおりに短縮しようとしています。あなたは、(1,2)、(2,3)...(4を持っているので -

1,2,3,4,5 

と(一部は窓が排他的になるかもしれない一つの実施、)2のウィンドウで移動平均を考えてみましょう5)結果は次のようになります。

1.5,2.5,3.5,4.5 

これは移動平均の(期待され、予想される)プロパティです。明らかにあなたのデータの同じ長さの 'smoothest'配列は、あなたのデータです。配列が元のデータを最もよく表していることを前提にしていれば、意味がありません。ウィンドウが排他的(すなわち、(1,2)、(3,4)(5))であれば、ウィンドウサイズに応じてさらにデータが減少する。

データを記述するためのスムーズな関数を探している場合は、移動平均ではなく補間が必要です。さもなければ、あなたはデータ範囲からいくつかの点を補う必要があります - より危険な補間です。

関連する問題