TP2-ThInfo-Correction
Posted on Fri 31 January 2020 in posts
Estimation de la moyenne, erreur et variance/covariance¶
Le but de ce TP est d'un part d'observer dans des exemples simples les estimations de la valeur moyenne (lorsque l'on connnaît la vérité terrain) et de voir comment mesurer l'erreur sur celle-ci. Dans un second temps, on regardera (toujours sur des cas contrôlés) la signification de la covariance et une façon de réduite naïvement la dimension des données.
Question
Correction
Remarques
Sujet
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
- Générer $N_s = 10^{2,3,4,5,6}$ variables Gaussienns de moyennes 0 et de variance 2.
- Afficher pour chacune des valeurs l'estimation de la valeur moyenne et de la variance.
- Comment calcule-t-on l'erreur sur l'estimation de la moyenne ?
- Vous afficherez les résultats sur un plot en échelle logarithmique pour l'axe x (pourquoi l'échelle log ?).
- A l'aide de la fonction 'errorbar' faire un graphe avec la barre d'erreur.
- Que se passe-t-il si la variance n'est pas 2 mais 10
Question
- Générer $N_s = 10^{2,3,4,5,6}$ variables Gaussienns de moyennes 0 et de variance 2.
- Afficher pour chacune des valeurs l'estimation de la valeur moyenne et de la variance.
- Comment calcule-t-on l'erreur sur l'estimation de la moyenne ?
Correction
On peut estimer l'erreur sur l'estimation avec :
err
= $\sqrt{\frac{Var(sample)}{\#sample}}$
# Génerer 10^{2,3,4,5,6} variables Gaussienns de moyennes 0 et de variance 2
NbS = np.array(10**np.arange(2,9))
print('NbS =', NbS)
ech = [np.random.normal(0, 2, size=ns) for ns in NbS]
est_m = list(map(np.mean, ech))
est_v = list(map(np.var, ech))
err = [np.sqrt(np.var(e)/ns) for e, ns in zip(ech, NbS)]
print("moyennes: ", est_m)
print("variances: ", est_v)
print("erreurs: ", err)
Remarques
Plus joliement affiché :
pd.DataFrame(dict(NbS=NbS, moyennes=est_m, varaiances=est_v, erreurs=err))
Question
- Vous afficherez les résultats sur un plot en échelle logarithmique pour l'axe x (pourquoi l'échelle log ?).
- A l'aide de la fonction 'errorbar' faire un graphe avec la barre d'erreur.
Correction
Echelle log car sinon on ne voit rien.
plt.axhline(y=0, c='red', label='0')
plt.errorbar(NbS, est_m, yerr=err, fmt='--o', label='mean estimate')
plt.xscale('log')
plt.ylabel('estimate')
plt.xlabel('N samples')
plt.legend()
plt.show()
plt.loglog(NbS, err, '--o')
plt.title("Erreur vs Nb Samples")
plt.ylabel('N samples')
plt.xlabel('error')
plt.show()
Question
- Que se passe-t-il si la variance n'est pas 2 mais 10
Correction
# Génerer 10^{2,3,4,5,6} variables Gaussienns de moyennes 0 et de variance 10
NbS = np.array(10**np.arange(2,9))
print('NbS =', NbS)
ech = [np.random.normal(0, 10, size=ns) for ns in NbS]
est_m = list(map(np.mean, ech))
est_v = list(map(np.var, ech))
err = [np.sqrt(np.var(e)/ns) for e, ns in zip(ech, NbS)]
print("moyennes: ", est_m)
print("variances: ", est_v)
print("erreurs: ", err)
pd.DataFrame(dict(NbS=NbS, moyennes=est_m, varaiances=est_v, erreurs=err))
plt.axhline(y=0, c='red', label='0')
plt.errorbar(NbS, est_m, yerr=err, fmt='--o', label='mean estimate')
plt.xscale('log')
plt.ylabel('estimate')
plt.xlabel('N samples')
plt.legend()
plt.show()
plt.title("Erreur vs Nb Samples")
plt.loglog(NbS,err, '--o')
plt.ylabel('N samples')
plt.xlabel('error')
plt.show()
On voit que l'erreur décroit avec le nombre d'échantillon. La décroissance est en loi de puissance. L'erreur augment avec la variance.
Sujet
Dans le fichier "data_ping.d", sont enregistrés les données du temps de ping vers un serveur.
- Tracer l'histogramme des valeurs, que constatez-vous ?
- Estimez la valeur moyenne et son erreur
A l'aide de la fonction "np.random.permutation":
- obtenez $200$ estimations (dans un tableau) de la valeur moyenne en prenant $30$ valeurs aléatoire parmis le jeu de données.
- Faites l'histogramme des valeurs obtenues.
- En utilisant l'histogramme, pouvez-vous devinez la distribution obtenue ? (vous pouvez aussi tracer l'histogramme avec l'option "log=True" pour mettre l'échelle y en log)
- Tracer la distribution intuitée pour s'en assurer, que remarquez-vous ?
Bonus : sur la distribution des valeurs du ping, saurez-vous estimez le comportement de la distribution pour les "grandes" valeurs de ping ?
Question
- Tracer l'histogramme des valeurs, que constatez-vous ?
- Estimez la valeur moyenne et son erreur
Correction
data = np.genfromtxt("data_ping.d")
try:
import seaborn as sns
sns.distplot(data)
plt.show()
except ImportError:
pass
plt.hist(data, bins=30, density=True)
plt.show()
#comportement exponentiel
x_range = np.arange(9,35,0.5)
plt.hist(data, bins=30, log=True, density=True)
plt.plot(x_range, np.exp( - (x_range - 11.0) / 3 ) / 5)
plt.show()
estimate_mean = np.mean(data)
n_samples = data.shape[0]
estimate_mean_error = np.sqrt(np.var(data)/n_samples)
print("estimate mean = {} +/- {}".format(estimate_mean, estimate_mean_error))
Question
- obtenez $200$ estimations (dans un tableau) de la valeur moyenne en prenant $30$ valeurs aléatoire parmis le jeu de données.
Correction
# Version 0
N = 2000
estimated_means = []
for _ in range(2000):
idx = np.random.permutation(np.arange(n_samples))
idx = idx[30:]
data_sample = data[idx]
data_sample_mean = np.mean(data_sample)
estimated_means.append(data_sample_mean)
# Version 1
N = 2000
random_permutation = np.array([np.random.permutation(np.arange(n_samples)) for i in range(N)])
estimated_means = np.array([np.mean(data[idx[:30]]) for idx in random_permutation])
Question
- Faites l'histogramme des valeurs obtenues.
- En utilisant l'histogramme, pouvez-vous devinez la distribution obtenue ? (vous pouvez aussi tracer l'histogramme avec l'option "log=True" pour mettre l'échelle y en log)
- Tracer la distribution intuitée pour s'en assurer, que remarquez-vous ?
Correction
sns.distplot(estimated_means)
plt.title('estimated mean distribution')
plt.show()
plt.hist(estimated_means, 35)
plt.title('estimated mean distribution')
plt.show()
plt.hist(estimated_means, 35, log=True)
plt.title('estimated mean distribution')
plt.show()
# on definit la pdf
def gauss(x, m, s):
return 1/np.sqrt(2*np.pi*s) * np.exp(-(x-m)**2 / (2.0*s) )
myx = np.arange(11, 14.5, 0.01)
mu, beta = 12.6, 0.4
count, bins, ignored = plt.hist(estimated_means, bins=40, density=True, log=True, label='measured')
plt.ylim(0.01, 1)
plt.semilogy(myx, gauss(myx, np.mean(estimated_means), np.std(estimated_means)), label='gauss')
plt.title('estimated mean distribution')
plt.legend()
plt.show()
La distribution gaussienne semble caractériser les fluctucations sur la valeur moyenne, on a évidement des phénomènes de coupure à gauche.
Remarques
on a "évidement" des phénomènes de coupure à gauche ??
Due à la longue queue de la ditribution de data.