1

私は人のデータを画面上のターゲットに向かって移動しています(私は実際に多くのデータを持っています)。たとえば:予測のためのカルマンフィルタの実装

position data

動きが〜9センチメートルの周りに常にあります。したがって、上のケースでは、個人が目標をオーバーショットし、最後にそれを修正しました。これは起こりがちです。

私がしたいことは、カルマンフィルタを使ってt + 1ではなくt + 15でカーソルの位置を予測することです(15タイムステップ先)。

kalman filter

あなたはそれが本当に終わりに向かってめちゃくちゃます見ることができ、私を疑います:また、私は私の現在の実装に誤りがあると思い、これは私が上記の場合のために取得していますものです私の実装。だからここに私の質問:

1)誰かが私のコードを見て、私は間違いをしたかどうかを確認できますか?改善のための提案?

2)コードを修正して、1ステップではなく、先行する多くのステップ(たとえば15ステップ)を予測するにはどうすればよいですか?与えられた反復において、私は本質的にx(t + 1)の代わりにx(t + 15)を予測したい。

私は本当にここに助けていただきありがとうございます、私はしばらくの間これに固執してきました。 http://s000.tinyupload.com/index.php?file_id=16556755793392871980

注センチでそれを得るためにあなたが1000で分割する必要があります。

は、ここでのデータです。

ここに私のコードです:

xp=position_data(:,1); 
yp=position_data(:,2); 

N=length(xp); 

Q=eye(4); 
motion=zeros(4,1); 

H=[1 0 0 0 
    0 1 0 0]; 
F=[1 0 1 0 
    0 1 0 1 
    0 0 1 0 
    0 0 0 1]; 

x=zeros(4,1); 
P = eye(4)*1000; %initial uncertainty 

observed_x=xp+0.05*rand(N,1).*xp; 
observed_y=yp+0.05*rand(N,1).*yp; 

R=0.01^2; 

pos=[observed_x,observed_y]; 

start=0; 
jj=zeros(N,2); %%jj will be the final result 


for k=start+1:length(observed_x) 
    measurement=pos(k,:); 
    y = measurement' - H * x; 
    S = H * P * H' + R; % residual convariance 
    K = P * H' * inv(S); % Kalman gain 
    x = x + K*y; 
    I = eye(4); % identity matrix 
    P = (I - K*H)*P; 

    % predict x and P 
    x = F*x + motion; 
    P = F*P*F' + Q; 
    jj(k,:)=x(1:2); 
end 

答えて

1

私はあなたのカルマン・フィルタのコードをチェックしますが、それが正しいと仮定すると、あなたは残留共分散、そして得られたゲインと呼んでいるもの、観察に依存しないされていませんただし、元の設定と実行されている期間だけです。私はカルマンフィルタを、その平均と分散を更新することによって未知の量を追跡していると考えるのが好きです。平均は観測値に依存するが、分散はそうではない。

現実には、画面の終わりに達するまでユーザーのカーソルがかなり予測可能であり、次にそれが大幅に変化し、再び予測可能になるということです。 3つの領域すべてでうまく機能するゲイン/観測分散の設定はありません。エラー率が急上昇してから不確実性が急激に増加する期間を検出しようとすると、カルマンフィルタは画面上のカーソルをすべてトラッキングしているという理由だけで残存不確実性は非常に小さいそれは画面の端を越えて続きます。その点については、画面の端を過ぎても予測が続くことは、これらの予測が正確ではなく、不確実性を増やすべきであるという、かなり良いヒントです。

収集したすべてのデータを使用して、最小誤差につながる初期不確かさの設定を見つけることもできます。また、予測が画面の終わりからはじまるときに不確実性をリセットすると、誤差の最小値につながる不確実性の設定をリセットします。

+0

したがって、不確実性を初期化するためにデータをどのように使用しますか?私はちょうどそれを推測して、ややうまくいくまで調整し続けました。 Didntはあなたが定量的にそれを決めることができたことを認識しませんでした。 コードを見る余裕があれば、本当に感謝しています。私は自分がスーパーだと自信を持っていますが、そうでなければそのほとんどがそこにあると思います。たぶん、あなたはまた、私はそれが大きなステップの予測を変更する方法を見ることができます。 –

+0

不確実性の測定値を取るルーチンを書くと、行列や現在の値が1000です。あなたのテストデータのコレクションの全部または一部に対してカルマンフィルタを実行し、それがどれほど良いかを示す値を返します。予測誤差の2乗。このルーチンをデリバティブなしで関数を最適化するルーチンに渡し、その最小値を求めて最小値を求めます。しかしまず第一に、エラーの大幅な増加または物理的に可能でない予測による突然の変化を検出し、その時点で不確実性を再初期化することについて考えます。 – mcdowella

+0

OK、私はあなたが言っていることを見ていると思います。私は最初に、エラーの突然の増加を検出した後で不確実性を再初期化することによってそれを試してみるでしょう。ご協力いただきありがとうございます。 –

関連する問題