我有人在屏幕上将光标移向目标的数据(实际上我有很多数据)。例如:
运动总是在~9cm左右。因此,在上面的情况下,个人超过了目标并在最后对其进行了纠正。这往往会发生。
我想要做的是使用卡尔曼滤波器来预测光标的位置不是在t + 1,而是在t + 15(因此前面15个步骤)。此外,我认为我目前的实施中存在错误,这是我在上述案例中得到的结果:
你可以看到它真的搞砸到最后,这让我怀疑我的实现。所以这是我的问题:
1)有人可以查看我的代码,看看我是否犯了错误?有任何改进建议吗?
2)我如何修改我的代码,以便我可以预测前面的许多步骤(例如,15步)而不仅仅是一步?在给定的迭代中,我基本上想要预测x(t + 15)而不是x(t + 1)。
我真的很感激这里的任何帮助,我已经坚持了一段时间。
以下是数据: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
答案 0 :(得分:1)
我没有检查过你的卡尔曼滤波器的代码,但是,假设它是正确的,你所谓的残差协方差,以及得到的增益,不依赖于观察结果,而只取决于原始设置和它有多长时间一直在跑。我喜欢将卡尔曼滤波器视为通过更新其均值和方差来跟踪未知数量。平均值取决于观察结果,但方差不是。
在现实生活中发生的事情是,用户的光标是非常可预测的,直到它到达屏幕的末端,然后它会彻底改变,然后再次变得可预测。增益/观察方差没有一个设置可以在所有三个区域中很好地工作。我会考虑尝试检测错误率突然增加的时段然后大幅增加不确定性,这样卡尔曼滤波器不再认为仅仅因为它一直沿着屏幕跟踪光标,剩余不确定性非常小它将继续超越屏幕边缘。就此而言,让预测继续超越屏幕边缘是一个非常好的提示,这些预测不准确,你应该增加不确定性。
您还可以尝试使用您收集的所有数据来查找导致最小错误的初始不确定性设置 - 或者,如果您在预测开始偏离屏幕结束时重置不确定性,则初始和重置导致最小错误的不确定性设置。