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