TP2-Correction

Posted on Mon 18 March 2019 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.

In [1]:
import numpy as np
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
In [3]:
# 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)
est_m = np.array([])
est_v = np.array([])
err = np.array([])
for ns in NbS:
    ech = np.random.normal(0,100,size=(ns))
    est_m = np.append(est_m,np.mean(ech))
    est_v = np.append(est_v,np.var(ech))
    # erreur = sqrt(var/Ns)
    err = np.append(err,np.sqrt(np.var(ech)/ns))
    
print("moyennes: ",est_m)
print("variances: ",est_v)
print("erreurs: ",err)
[      100      1000     10000    100000   1000000  10000000 100000000]
moyennes:  [-1.92212542e+01  1.69768772e+00 -9.33983798e-01 -4.51081732e-01
  9.74014323e-02 -2.05749263e-02  3.14066487e-03]
variances:  [10683.20314495 10779.87363358 10112.50650699 10053.06229448
 10002.10985741  9993.33363704  9999.53746501]
erreurs:  [1.03359582e+01 3.28327179e+00 1.00560959e+00 3.17065645e-01
 1.00010549e-01 3.16122344e-02 9.99976873e-03]
In [4]:
plt.semilogx(NbS,est_m)
plt.semilogx(NbS,est_m*0)
plt.errorbar(NbS,est_m, yerr=err, fmt='--o')
plt.show()
plt.title("Erreur vs Nb Samples")
plt.loglog(NbS,err,'--o')
Out[4]:
[<matplotlib.lines.Line2D at 0x7f75acdb4550>]
In [16]:
# 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)
est_m = np.array([])
est_v = np.array([])
err = np.array([])
for ns in NbS:
    ech = np.random.normal(0,10,size=(ns))
    est_m = np.append(est_m,np.mean(ech))
    est_v = np.append(est_v,np.var(ech))
    # erreur = sqrt(var/Ns)
    err = np.append(err,np.sqrt(np.var(ech)/ns))
    
print("moyennes: ",est_m)
print("variances: ",est_v)
print("erreurs: ",err)

plt.semilogx(NbS,est_m)
plt.semilogx(NbS,est_m*0)
plt.errorbar(NbS,est_m, yerr=err, fmt='--o')
plt.show()
plt.title("Erreur vs Nb Samples")
plt.loglog(NbS,err,'--o')
[      100      1000     10000    100000   1000000  10000000 100000000]
moyennes:  [-0.38767473 -0.55904341  0.08847112 -0.03242972 -0.00223794 -0.00974045
  0.00060156]
variances:  [ 89.90785215 107.19757104  96.75993891  99.9189119  100.12087258
 100.00803327 100.00474505]
erreurs:  [0.94819751 0.3274104  0.09836663 0.03160995 0.01000604 0.0031624
 0.00100002]
Out[16]:
[<matplotlib.lines.Line2D at 0x7f91ce8a6f28>]

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.

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 ?

In [6]:
dp=np.genfromtxt("data_ping")
plt.hist(dp,bins=30,normed=True)
plt.show()
plt.hist(dp,bins=30,log=True, normed=True)
myx = np.arange(9,35,0.5)
myx = np.arange(5,40,1)
print("moyenne= ",np.mean(dp))
print("variance= ",np.std(dp))
print("erreur=", (np.std(dp)/dp.shape[0])**0.5)

#comportement exponentiel
myx = np.arange(9,35,0.5)
plt.plot(myx,np.exp(-(myx-11.0)/3)/5)
/home/aurele/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: MatplotlibDeprecationWarning: 
The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.
  
moyenne=  12.836788732394366
variance=  2.9335520070217282
erreur= 0.040653479015560025
/home/aurele/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:4: MatplotlibDeprecationWarning: 
The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.
  after removing the cwd from sys.path.
Out[6]:
[<matplotlib.lines.Line2D at 0x7f75aceafac8>]
In [34]:
est_m = np.array([])
for i in range(200):
    idp = np.random.permutation(np.arange(1775))
    est_m = np.append(est_m,np.mean(dp[idp[:30]]))
In [37]:
# 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(est_m,bins=40,normed=True, log=True)
plt.ylim(0.01,1)
plt.semilogy(myx,gauss(myx,np.mean(est_m),np.std(est_m)))
plt.show()

La distribution gaussienne semble caractériser les fluctucations sur la valeur moyenne, on a évidement des phénomènes de coupure à gauche.

In [ ]: