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

7.5 KiB
Raw Permalink Blame History

author title description
Laurent Fainsin TAV, TP1, LF Rapport de Traitement des données audio-visuelles, Travail Pratique 1, Laurent Fainsin

Fonctions auxilliaires

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
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

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
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');

Exercice 2

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
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');

Données de test

Exercice 1

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

Exercice 2

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');

Exercice 3

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
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
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

Exercice 4

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
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
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

Exercice 5 (Optionnel)

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]
>> exercice_5

ans =

  133.0000  133.0007
   96.0000   96.0013
  139.0000  138.9989
  118.0000  118.0024