TP-traitement-audio-visuel/TP1/rapport/rapport.md
2023-06-22 20:47:16 +02:00

314 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 BŽezier
d = 8;
% Estimation des paramètres de la courbe de BŽezier (sauf beta_0 et beta_d) :
beta_estime = moindres_carres(D_app,beta_0,beta_d,d);
% TracŽ de la courbe de BŽezier estimŽe, 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 BŽzier utilisŽe comme modle (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
```