移動平均からデータポイントを抽出しますか?


15

移動平均データからデータポイントを抽出することは可能ですか?

言い換えれば、データのセットが前の30ポイントの単純な移動平均のみを持っている場合、元のデータポイントを抽出することは可能ですか?

もしそうなら、どのように?


1
答えは「はい」ですが、正確な手順は、データの初期セグメントがどのように処理されるかによって異なります。単純にドロップすると、15個のデータが事実上失われ、未確定の線形方程式システムが残ります。結果として、一般的に多くの有効な回答が存在しますが、(a)最初の15の移動平均に(a)短いウィンドウ(またはそのような手順)を使用するか、(b)追加の制約を指定すると解決策(約15次元の制約の価値...)。あなたはどんな状況にいますか?
whuber

@whuber見てくれてありがとう!2,000ポイントあります。最初のMAポイントは、おそらく最初の30個の元のポイントの平均です。正確さは、一般に正しい結果に次ぐものであり、最も「最近」のポイントで最も正確に推測できます。比較的簡単な方法を推奨できますか?前もって感謝します!

1
(コメントを書くのに5分以上かかる場合...)。私が書きたかったのは、平均化を行列乗算と考えることができるということです。中央の行には、対角線の前に1/30 * [1 1 1 ...]があります。問題は、マトリックスを反転可能にするために、ベクトルの境界のポイントをどのように扱うかです。これを行うには、それらがより少ない要素の平均化の結果であると仮定するか、他の制約について考えます。マトリックスの反転はそれを理解する簡単な方法ですが、最も効率的ではないことに注意してください。あなたはおそらくFFTを使用してそれをしたいと思うでしょう。
fabee

回答:


4

完了したfabeeの回答に+1。手元の操作を行うことがわかったパッケージに基づいて、Rに変換するためのメモです。私の場合、NOAAの気温を3か月単位で予測したデータがありました:1月から2月から3月、2月から3月、4月、3月から4月、5月などです。 3か月の各期間の温度が本質的に平均であると仮定した場合の月単位の値。

library (Matrix)
library (matrixcalc)

# Feb-Mar-Apr through Nov-Dec-Jan temperature forecasts:

qtemps <- c(46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2)

# Thus I need a 10x12 matrix, which is a band matrix but with the first
# and last rows removed so that each row contains 3 1's, for three months.
# Yeah, the as.matrix and all is a bit obfuscated, but the results of
# band are not what svd.inverse wants.

a <- as.matrix (band (matrix (1, nrow=12, ncol=12), -1, 1)[-c(1, 12),])
ai <- svd.inverse (a)

mtemps <- t(qtemps) %*% t(ai) * 3

それは私にとって素晴らしい作品です。ありがとう@fabee。

編集:OK、RをPythonに逆翻訳すると、次のようになります:

from numpy import *
from numpy.linalg import *

qtemps = transpose ([[46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2]])

a = tril (ones ((12, 12)), 2) - tril (ones ((12, 12)), -1)
a = a[0:10,:]

ai = pinv (a)

mtemps = dot (ai, qtemps) * 3

(Rバージョンよりもデバッグに時間がかかりました。まず、RほどPythonに精通していないためですが、Rが対話的にはるかに使いやすいためです。)


@Gracchus:申し訳ありませんが、C ++の男ではありませんが、RでRcppArmadilloパッケージを介して利用できるArmadillo C ++線形代数ライブラリ(arma.sourceforge.net)で必要なものを見つけることができます。
ウェイン

OK、うまくいくか確認してください。もしそうなら、あなたは私の答えを選ぶことができます;-)
ウェイン

PythonのFYIベストプラクティスは、絶対インポートを実行することです:python.org/dev/peps/pep-0008/#importsこれにより、他の人のコードを非常に簡単に読み取ることができます。あなたが知らないそれぞれを調べてください。同じことをすることがRの標準であったことを願います。他の人のコードの小さな機能をすべて検索しなければならないので、本当に歯車が
磨けてしまい

また、Pythonインタラクティブ機能用のJupyterノートブック、またはIPython。
言葉forthewise

17

私はwhuberが言ったことを答えに入れようとします。n = 2000エントリの大きなベクトルとします。もし長さのウィンドウで移動平均を計算する場合= 30、あなたはベクトル行列乗算としてこれを書くことができ、Y = A X、ベクトルのX行列とxn=2000=30y=Axx

A=130(1...10...001...10...0...1...100...01...1)

これには、の行があり、行を進みながら30個の行がシフトして、マトリックスの最後に到達します。ここで、平均化されたベクトルyは1970次元です。マトリックスには、1970行と2000列があります。したがって、それは可逆的ではありません。3030y19702000

x1,...,x2000y1y2

x1,...,xnxyx

A3030AA

AAz=AyxyAz

2000x

reconstruction of original signal from moving average using the pseudoinverse

多くの数値プログラムは擬似逆関数を提供します(Matlab、pythonのnumpyなど)。

ここに私の例から信号を生成するためのPythonコードがあります:

from numpy import *
from numpy.linalg import *
from matplotlib.pyplot import *
# get A and its inverse     
A = (tril(ones((2000,2000)),-1) - tril(ones((2000,2000)),-31))/30.
A = A[30:,:]
pA = pinv(A) #pseudo inverse

# get x
x = random.randn(2000) + 5
y = dot(A,x)

# reconstruct
x2 = dot(pA,y)

plot(x,label='original x')
plot(y,label='averaged x')
plot(x2,label='reconstructed x')
legend()
show()

お役に立てば幸いです。


これは素晴らしい答えですが、「yとAzの間の2次距離を最小化する」と言ったのは間違いだと思います。実際、yとAzは同じものです。最小化されているのはzのノルムであり、これは私が試した実世界の信号にはうまく機能しますが、元の信号に多くの外れ値がある場合はあまり良くありません。
gdelfino

従うかどうかわかりません。yとAxは同じですが、yとAzは同じではありません。zのノルムも最小化するのは事実です。私の例ではなぜ機能しないのかもわかりません。青と赤の線はかなりきれいに一致しています。コメントに何か足りないものはありますか?
-fabee

yは、元の信号xからAを乗算して計算された移動平均です。この手順により、同じ移動平均yを持つ信号zが得られます。したがって、y = Azですから、zのノルムのみが最小化されます。元の信号のノルム値が大きい場合、この手順では良い結果が得られません。ノルム値が大きい信号の例は次のとおりです
。– gdelfino

{42.8、-33.7、13.2、-45.6、10.2、35.8、-41.4、20.253、43.3429、-33.2735、13.6135、-45.1067、10.6346、36.1352、-40.9703、20.6616、43.6796、-32.8966、14.0406、-44.7001、10.9988 、36.4675、-40.7277、20.8823、43.7878、-32.7415、13.9951、-44.7947、11.044、36.3873、-40.7117、20.7505、43.8204、-32.9399、13.9129、-44.9549、10.8703、36.1559、-40.8894、20.4211、43.4591、-33.2786 、13.5468、-45.2374、10.3787、35.8235、-41.5161、19.9717、43.0658、-33.7125、13.0321}
-gdelfino

上記の信号には、8のウィンドウサイズを使用してください。このように、フィルタリングされた信号は元の信号とは形状が大きく異なります。
-gdelfino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.