-
Notifications
You must be signed in to change notification settings - Fork 0
/
Filtrelineaire.m
108 lines (75 loc) · 2.2 KB
/
Filtrelineaire.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
%% Modèle linéaire
%% Génération des données
NbRepetitionExperience=10;
for d=1:5;%1:5 %boucle sur la dimension
for numMC=1:NbRepetitionExperience
clear X;
clear Y;
clear Xhat;
clear X_1;
clear Xtilde;
clear Wtilde;
%d=2; %Dimension
K=100; %Nombre de données dans l'échantillon
for i=1:d
X_1(i)=randn;
end
A_k=0.9.*eye(d);
H_k=eye(d);
sigmav=1;
sigmaw=0.1;
V=sigmav^2.*randn(d,K);
W=sigmaw^2.*randn(d,K);
X(:,1)=X_1;
for k=2:K
X(:,k)=A_k*X(:,k-1)+V(:,k);
Y(:,k)=H_k*X(:,k)+W(:,k);
end
% Filtrage particulaire
N=100; %Nombre de particules
resample=0;
Xtilde=zeros(K,N,d);
Wtilde=1/N*ones(K,N,1); %initialisation des poids à 1/N
Xtilde(1,:,:)=randn(1,N,d); %initialisation des particules
for t=2:K
for i=1:N
Xtilde(t,i,:)=sigmav*randn(d,1)+A_k*reshape(Xtilde(t-1,i,:),1, d)';
mat = (Y(:,t)-H_k*reshape(Xtilde(t,i,:),1,d)');
Wtilde(t,i,1)=Wtilde(t-1,i,1)*exp((-(mat'*inv(sigmaw*eye(d))*mat)/2));
end
% W=reshape(sum(Wtilde(t,:,:)),1,d);
% for i=1:N
% Wtilde(t,i,:)=reshape(Wtilde(t,i,:),1,d)./W;
% end
Wtilde(t,:,1)=Wtilde(t,:,1)/sum(Wtilde(t,:,1));
Xhat(t,:)= sum(repmat(Wtilde(t,:,1)',1,d).*reshape(Xtilde(t,:,:),N,d));
if (1/sum(Wtilde(t,:,1).^2))<N/2 %On peut jouer sur le paramètre N/2
Xtilde_r=zeros(N,d);
for i=1:N
u=rand;
j=1;
while sum(Wtilde(t,1:j,1))<u
j=j+1;
end
Xtilde_r(i,:)=Xtilde(t,j,:);
end
Xtilde(t,:,:)=Xtilde_r;
Wtilde(t,:)=1/N*ones(1,N,1);
end
end
Err(d,numMC)=sum(sum((X'-Xhat).^2));
figure(10);clf;plot(X');hold on;plot(Xhat,'--');%pause
end
X(:,1)=X_1;
for k=2:K
X(:,k)=A_k*X(:,k-1)+V(:,k);
Y(:,k)=H_k*X(:,k)+W(:,k);
end
end
%%
figure(13)
clf
plot(mean(Err,2));
title('Erreur quadratique en fonction de la dimension');
hold on
plot(mean(Err2,2), 'red');