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