314 lines
7.5 KiB
Markdown
314 lines
7.5 KiB
Markdown
---
|
||
author: Laurent Fainsin
|
||
title: TAV, TP1, LF
|
||
description: Rapport de Traitement des données audio-visuelles, Travail Pratique 1, Laurent Fainsin
|
||
---
|
||
|
||
# Fonctions auxilliaires
|
||
|
||
```matlab
|
||
function y = bezier(beta_0,beta,beta_d,x)
|
||
d = length(beta)+1;
|
||
y = beta_0 * (1-x).^d + beta_d * x.^d;
|
||
for i = 1:d-1
|
||
y = y + beta(i) * nchoosek(d,i) * x.^i .* (1-x).^(d-i);
|
||
end
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
function y = bezier_bruitee(beta_0,beta,beta_d,x,sigma)
|
||
y = bezier(beta_0,beta,beta_d,x)+sigma*randn(size(x));
|
||
end
|
||
```
|
||
|
||
# Exercice 1
|
||
|
||
```matlab
|
||
function estimation = moindres_carres(D_app, beta_0, beta_d, d)
|
||
X = D_app(1,:)';
|
||
Y = D_app(2,:)';
|
||
|
||
B = Y - beta_0*(1-X).^d - beta_d*(X.^d);
|
||
|
||
A = zeros(length(X), d-1);
|
||
for i=1:(d-1)
|
||
A(:,i) = nchoosek(d, i) .* X.^i .* (1-X).^(d-i);
|
||
end
|
||
|
||
estimation = A \ B;
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
donnees_apprentissage;
|
||
close all;
|
||
|
||
% Degré de la courbe de Bezier
|
||
d = 8;
|
||
|
||
% Estimation des paramètres de la courbe de Bezier (sauf beta_0 et beta_d) :
|
||
beta_estime = moindres_carres(D_app,beta_0,beta_d,d);
|
||
|
||
% Trac de la courbe de Bezier estime, de degré d (trait rouge) :
|
||
y_estime = bezier(beta_0,beta_estime,beta_d,x);
|
||
plot(x,y_estime,'-r','MarkerSize',10,'LineWidth',3);
|
||
lg = legend(' Modele exact',' Donnees d''apprentissage',[' Modele estime ($d=' num2str(d) '$)'],'Location','Best');
|
||
set(lg,'Interpreter','Latex');
|
||
```
|
||
|
||
<img src="exercice_1.svg">
|
||
|
||
# Exercice 2
|
||
|
||
```matlab
|
||
function erreur = erreur_apprentissage(D_app,beta_0,beta_d,d)
|
||
X = D_app(1,:)';
|
||
Y = D_app(2,:)';
|
||
|
||
beta = moindres_carres(D_app, beta_0, beta_d, d);
|
||
estimation = bezier(beta_0, beta, beta_d, X);
|
||
|
||
erreur = mean((estimation - Y).^2);
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
donnees_apprentissage;
|
||
close all;
|
||
|
||
% Calcul de l'erreur d'apprentissage en fonction de d :
|
||
liste_d = 2:length(D_app);
|
||
liste_erreurs_apprentissage = [];
|
||
for d = liste_d
|
||
erreur = erreur_apprentissage(D_app,beta_0,beta_d,d);
|
||
liste_erreurs_apprentissage = [liste_erreurs_apprentissage erreur];
|
||
end
|
||
|
||
% Trac de l'erreur d'apprentissage en fonction de d :
|
||
figure('Name','Erreur d''apprentissage','Position',[0.4*L,0.05*H,0.6*L,0.7*H]);
|
||
plot(liste_d,liste_erreurs_apprentissage,'sb-','LineWidth',2);
|
||
set(gca,'FontSize',20);
|
||
xlabel('$d$','Interpreter','Latex','FontSize',30);
|
||
ylabel('Erreur','FontSize',30);
|
||
legend(' Erreur d''apprentissage','Location','Best');
|
||
```
|
||
|
||
<img src="exercice_2.svg">
|
||
|
||
# Données de test
|
||
|
||
## Exercice 1
|
||
|
||
```matlab
|
||
donnees_test;
|
||
|
||
% % Degr de la courbe de Bzier utilise comme modle (testez plusieurs valeurs de d entre 2 et 20) :
|
||
degres = 2:5:20;
|
||
|
||
for d=degres
|
||
beta_estime = moindres_carres(D_test,beta_0,beta_d,d);
|
||
y_estime = bezier(beta_0,beta_estime,beta_d,x);
|
||
plot(x,y_estime,'MarkerSize',10,'LineWidth',3, 'DisplayName', ['d=',num2str(d)]);
|
||
end
|
||
```
|
||
|
||
<img src="exercice_1_test.svg">
|
||
|
||
## Exercice 2
|
||
|
||
```matlab
|
||
donnees_test;
|
||
close all;
|
||
|
||
liste_d = 2:10:length(D_test);
|
||
liste_erreurs_apprentissage = [];
|
||
for d = liste_d
|
||
erreur = erreur_apprentissage(D_test,beta_0,beta_d,d);
|
||
liste_erreurs_apprentissage = [liste_erreurs_apprentissage erreur];
|
||
end
|
||
|
||
% Trac de l'erreur d'apprentissage en fonction de d :
|
||
figure('Name','Erreur d''apprentissage','Position',[0.4*L,0.05*H,0.6*L,0.7*H]);
|
||
plot(liste_d,liste_erreurs_apprentissage,'sb-','LineWidth',2);
|
||
set(gca,'FontSize',20);
|
||
xlabel('$d$','Interpreter','Latex','FontSize',30);
|
||
ylabel('Erreur','FontSize',30);
|
||
legend(' Erreur d''apprentissage','Location','Best');
|
||
```
|
||
|
||
<img src="exercice_2_test.svg">
|
||
|
||
# Exercice 3
|
||
|
||
```matlab
|
||
function erreur = erreur_generalisation(D_test,D_app,beta_0,beta_d,d)
|
||
X = D_test(1,:)';
|
||
Y = D_test(2,:)';
|
||
|
||
beta = moindres_carres(D_app, beta_0, beta_d, d);
|
||
estimation = bezier(beta_0, beta, beta_d, X);
|
||
|
||
erreur = mean((estimation - Y).^2);
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
function [d_estime, sigma_estime] = estimation_d_sigma(liste_d, liste_erreurs_generalisation)
|
||
[~, index] = min(liste_erreurs_generalisation);
|
||
d_estime = liste_d(index);
|
||
|
||
sigma_estime = std(liste_erreurs_generalisation);
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
donnees_test;
|
||
close all;
|
||
|
||
% Calcul de l'erreur d'apprentissage (risque empirique) :
|
||
liste_d = 2:20;
|
||
liste_erreurs_apprentissage = [];
|
||
for d = liste_d
|
||
erreur = erreur_apprentissage(D_app,beta_0,beta_d,d);
|
||
liste_erreurs_apprentissage = [liste_erreurs_apprentissage erreur];
|
||
end
|
||
|
||
% Tracé de l'erreur d'apprentissage en fonction de d :
|
||
figure('Name','Erreur d''apprentissage et erreur de generalisation','Position',[0.4*L,0.05*H,0.6*L,0.7*H]);
|
||
plot(liste_d,liste_erreurs_apprentissage,'sb-','LineWidth',2);
|
||
set(gca,'FontSize',20);
|
||
xlabel('$d$','Interpreter','Latex','FontSize',30);
|
||
ylabel('Erreur','FontSize',30);
|
||
hold on;
|
||
|
||
% Calcul de l'erreur de généralisation (risque espéré) :
|
||
liste_erreurs_generalisation = [];
|
||
for d = liste_d
|
||
erreur = erreur_generalisation(D_test,D_app,beta_0,beta_d,d);
|
||
liste_erreurs_generalisation = [liste_erreurs_generalisation erreur];
|
||
end
|
||
|
||
% Tracé de l'erreur de généralisation en fonction de d :
|
||
plot(liste_d,liste_erreurs_generalisation,'sg-','LineWidth',2);
|
||
legend(' Erreur d''apprentissage',' Erreur de generalisation','Location','Best');
|
||
|
||
% Estimation du degré d et de l'écart-type sigma :
|
||
[d_estime,sigma_estime] = estimation_d_sigma(liste_d,liste_erreurs_generalisation);
|
||
fprintf('Estimation du degre : d = %d\n',d_estime);
|
||
fprintf('Estimation de l''ecart-type du bruit sur les donnees : %.3f\n',sigma_estime);
|
||
```
|
||
|
||
```
|
||
Estimation du degre : d = 5
|
||
Estimation de l'ecart-type du bruit sur les donnees : 0.477
|
||
```
|
||
|
||
<img src="exercice_3.svg">
|
||
|
||
# Exercice 4
|
||
|
||
```matlab
|
||
function VC = calcul_VC(D_app, beta_0, beta_d, d)
|
||
X = D_app(1,:)';
|
||
Y = D_app(2,:)';
|
||
n = length(X);
|
||
|
||
VC = 0;
|
||
for j=1:n
|
||
D_app_loo = [D_app(:,1:j-1) , D_app(:,j+1:n)];
|
||
beta = moindres_carres(D_app_loo, beta_0, beta_d, d);
|
||
|
||
estimation = bezier(beta_0, beta, beta_d, X(j));
|
||
VC = VC + (Y(j) - estimation).^2;
|
||
end
|
||
|
||
VC = VC/n;
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
function [d_estime,sigma_estime] = estimation_d_sigma_bis(liste_d,liste_VC)
|
||
[~, index] = min(liste_VC);
|
||
d_estime = liste_d(index);
|
||
|
||
sigma_estime = std(liste_VC);
|
||
end
|
||
```
|
||
|
||
```matlab
|
||
donnees_test;
|
||
close all;
|
||
|
||
% Calcul de la validation croisée Leave-one-out :
|
||
liste_d = 2:20;
|
||
liste_VC = [];
|
||
tic;
|
||
for d = liste_d
|
||
VC = calcul_VC(D_app,beta_0,beta_d,d);
|
||
liste_VC = [liste_VC VC];
|
||
end
|
||
toc;
|
||
|
||
% Tracé de la validation croisée Leave-one-out en fonction de d :
|
||
figure('Name','Validation croisee','Position',[0.4*L,0.05*H,0.6*L,0.7*H]);
|
||
plot(liste_d,liste_VC,'sr-','LineWidth',2);
|
||
set(gca,'FontSize',20);
|
||
xlabel('$d$','Interpreter','Latex','FontSize',30);
|
||
ylabel('$VC$','Interpreter','Latex','FontSize',30);
|
||
|
||
% Estimation du degré d et de l'écart-type sigma :
|
||
[d_estime,sigma_estime] = estimation_d_sigma_bis(liste_d,liste_VC);
|
||
fprintf('Estimation du degre : d = %d\n',d_estime);
|
||
fprintf('Estimation de l''ecart-type du bruit sur les donnees : %.3f\n',sigma_estime);
|
||
```
|
||
|
||
```
|
||
Estimation du degre : d = 5
|
||
Estimation de l'ecart-type du bruit sur les donnees : 0.563
|
||
```
|
||
|
||
<img src="exercice_4.svg">
|
||
|
||
# Exercice 5 (Optionnel)
|
||
|
||
```matlab
|
||
clear;
|
||
close all;
|
||
|
||
% constantes
|
||
beta_0 = 115;
|
||
beta_d = 123;
|
||
beta = [133,96,139,118];
|
||
n_app = 100;
|
||
pas_app = 1/(n_app-1);
|
||
x_j = 0:pas_app:1;
|
||
sigma = 0.5;
|
||
d = 5;
|
||
n = 10000;
|
||
|
||
beta_moyen = zeros(1, d-1)';
|
||
sigma_moyen = 0;
|
||
for i=1:n
|
||
% génération de nouveaux points d'apprentissage
|
||
y_j = bezier_bruitee(beta_0,beta,beta_d,x_j,sigma);
|
||
D_app = [x_j ; y_j];
|
||
|
||
beta_estime = moindres_carres(D_app,beta_0,beta_d,d);
|
||
beta_moyen = beta_moyen + beta_estime/n;
|
||
end
|
||
|
||
[beta' , beta_moyen]
|
||
```
|
||
|
||
```matlab
|
||
>> exercice_5
|
||
|
||
ans =
|
||
|
||
133.0000 133.0007
|
||
96.0000 96.0013
|
||
139.0000 138.9989
|
||
118.0000 118.0024
|
||
```
|