Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.55 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. ###############################################################################
  3. # Apprentissage et reconnaissance
  4. # GIF-4101 / GIF-7005, Automne 2018
  5. # Devoir 2, Question 1
  6. #
  7. ###############################################################################
  8. ############################## INSTRUCTIONS ###################################
  9. ###############################################################################
  10. #
  11. # - Repérez les commentaires commençant par TODO : ils indiquent une tâche que
  12. # vous devez effectuer.
  13. # - Vous ne pouvez PAS changer la structure du code, importer d'autres
  14. # modules / sous-modules, ou ajouter d'autres fichiers Python
  15. # - Ne touchez pas aux variables, TMAX*, ERRMAX* et _times, à la fonction
  16. # checkTime, ni aux conditions vérifiant le bon fonctionnement de votre
  17. # code. Ces structures vous permettent de savoir rapidement si vous ne
  18. # respectez pas les requis minimum pour une question en particulier.
  19. # Toute sous-question n'atteignant pas ces minimums se verra attribuer
  20. # la note de zéro (0) pour la partie implémentation!
  21. #
  22. ###############################################################################
  23.  
  24. import time
  25. import numpy
  26.  
  27. from matplotlib import pyplot
  28.  
  29. from scipy.stats import norm
  30.  
  31. from sklearn.neighbors import KernelDensity
  32.  
  33. # Fonctions utilitaires liées à l'évaluation
  34. _times = []
  35.  
  36.  
  37. def checkTime(maxduration, question):
  38. duration = _times[-1] - _times[-2]
  39. if duration > maxduration:
  40. print("[ATTENTION] Votre code pour la question {0} met trop de temps à s'exécuter! ".format(question) +
  41. "Le temps maximum permis est de {0:.4f} secondes, mais votre code a requis {1:.4f} secondes! ".format(
  42. maxduration, duration) +
  43. "Assurez-vous que vous ne faites pas d'appels bloquants (par exemple à show()) dans cette boucle!")
  44.  
  45. # Définition des durées d'exécution maximales pour chaque sous-question
  46.  
  47.  
  48. TMAX_Q1A = 1.0
  49. TMAX_Q1B = 2.5
  50.  
  51.  
  52. # Ne changez rien avant cette ligne!
  53.  
  54.  
  55. # Définition de la PDF de la densité-mélange
  56. def pdf(X):
  57. return 0.4 * norm(0, 1).pdf(X[:, 0]) + 0.6 * norm(5, 1).pdf(X[:, 0])
  58.  
  59.  
  60. # Question 1A
  61.  
  62. # TODO Q1A
  63. # Complétez la fonction sample(n), qui génère n
  64. # données suivant la distribution mentionnée dans l'énoncé
  65. def sample(n):
  66. Xlow = -5
  67. Xhigh = 10
  68. span = Xhigh - Xlow
  69. dataPerUnit = span/n
  70. X = numpy.empty((n+1,1))
  71. x = numpy.empty(n+1)
  72. for k in range(n+1):
  73. X[k] = k * dataPerUnit + Xlow
  74. x[k] = k * dataPerUnit + Xlow
  75. Y = pdf(X)
  76. return (x, Y)
  77.  
  78.  
  79. if __name__ == '__main__':
  80. # Question 1A
  81. _times.append(time.time())
  82. # TODO Q1A
  83. # Échantillonnez 50 et 10 000 données en utilisant la fonction
  84. # sample(n) que vous avez définie plus haut et tracez l'histogramme
  85. # de cette distribution échantillonée, en utilisant 25 bins,
  86. # dans le domaine [-5, 10].
  87. # Sur les mêmes graphiques, tracez également la fonction de densité réelle.
  88. sampleSizes = [50, 10000]
  89. binNumber = 25
  90. fig, subfigs = pyplot.subplots(1, len(sampleSizes))
  91. i = 0
  92. for subfig in subfigs:
  93. data = sample(sampleSizes[i])
  94. try:
  95. subfig.hist(data[0], weights=data[1], bins=binNumber, density=True, color='c', edgecolor='k')
  96. except:
  97. subfig.hist(data[1], bins=binNumber, normed=True, color='c', edgecolor='k')
  98. subfig.set_title(str(sampleSizes[i]) + " données")
  99. subfig.set_xlabel("domaine [-5, 10]")
  100. subfig.set_ylabel("densité")
  101. subfig.set_xlim(-5,10)
  102. i += 1
  103.  
  104. # Affichage du graphique
  105. _times.append(time.time())
  106. checkTime(TMAX_Q1A, "1A")
  107. pyplot.suptitle("Histogrammes à 25 bins")
  108. pyplot.show()
  109.  
  110. # Question 1B
  111. _times.append(time.time())
  112.  
  113. # TODO Q1B
  114. # Échantillonnez 50 et 10 000 données, mais utilisez cette fois une
  115. # estimation avec noyau boxcar pour présenter les données. Pour chaque
  116. # nombre de données (50 et 10 000), vous devez présenter les distributions
  117. # estimées avec des tailles de noyau (bandwidth) de {0.3, 1, 2, 5}, dans
  118. # la même figure, mais tracées avec des couleurs différentes.
  119.  
  120. sampleSizes = [50, 10000]
  121. bandwidths = [0.3, 1, 2, 5]
  122. fig1, subfigs1 = pyplot.subplots(1, 2, sharex=True, sharey=True)
  123. colors = "rbcg"
  124. i = 0
  125. for subfig1 in subfigs1:
  126. N = sampleSizes[i]
  127.  
  128. X = numpy.linspace(-5, 10, N)[:, numpy.newaxis]
  129. Y = numpy.concatenate((numpy.random.normal(0, 1, int(0.4 * N)),
  130. numpy.random.normal(5, 1, int(0.6 * N))))[:, numpy.newaxis]
  131. subfig1.set_title(("Échantillon de " + str(N) + " données"))
  132. subfig1.set_xlabel("domaine [-5, 10]")
  133. subfig1.set_ylabel("densité")
  134. i += 1
  135. kde = KernelDensity(kernel='tophat').fit(Y)
  136. for k in range(len(bandwidths)):
  137. kde.bandwidth = bandwidths[k]
  138. _times.append(time.time())
  139. log_dens = kde.score_samples(X)
  140. _times.append(time.time())
  141. duration = _times[-1] - _times[-2]
  142. print("duration: " + str(duration))
  143. Y = numpy.exp(log_dens)
  144. subfig1.plot(X[:, 0], Y, label=bandwidths[k])
  145.  
  146. # Affichage du graphique
  147. _times.append(time.time())
  148. checkTime(TMAX_Q1B, "1B")
  149. pyplot.legend()
  150. pyplot.suptitle("Densité de noyau 'tophat' selon la largeur")
  151. pyplot.show()
  152.  
  153. # N'écrivez pas de code à partir de cet endroit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement