Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- ###############################################################################
- # Apprentissage et reconnaissance
- # GIF-4101 / GIF-7005, Automne 2018
- # Devoir 2, Question 1
- #
- ###############################################################################
- ############################## INSTRUCTIONS ###################################
- ###############################################################################
- #
- # - Repérez les commentaires commençant par TODO : ils indiquent une tâche que
- # vous devez effectuer.
- # - Vous ne pouvez PAS changer la structure du code, importer d'autres
- # modules / sous-modules, ou ajouter d'autres fichiers Python
- # - Ne touchez pas aux variables, TMAX*, ERRMAX* et _times, à la fonction
- # checkTime, ni aux conditions vérifiant le bon fonctionnement de votre
- # code. Ces structures vous permettent de savoir rapidement si vous ne
- # respectez pas les requis minimum pour une question en particulier.
- # Toute sous-question n'atteignant pas ces minimums se verra attribuer
- # la note de zéro (0) pour la partie implémentation!
- #
- ###############################################################################
- import time
- import numpy
- from matplotlib import pyplot
- from scipy.stats import norm
- from sklearn.neighbors import KernelDensity
- # Fonctions utilitaires liées à l'évaluation
- _times = []
- def checkTime(maxduration, question):
- duration = _times[-1] - _times[-2]
- if duration > maxduration:
- print("[ATTENTION] Votre code pour la question {0} met trop de temps à s'exécuter! ".format(question) +
- "Le temps maximum permis est de {0:.4f} secondes, mais votre code a requis {1:.4f} secondes! ".format(
- maxduration, duration) +
- "Assurez-vous que vous ne faites pas d'appels bloquants (par exemple à show()) dans cette boucle!")
- # Définition des durées d'exécution maximales pour chaque sous-question
- TMAX_Q1A = 1.0
- TMAX_Q1B = 2.5
- # Ne changez rien avant cette ligne!
- # Définition de la PDF de la densité-mélange
- def pdf(X):
- return 0.4 * norm(0, 1).pdf(X[:, 0]) + 0.6 * norm(5, 1).pdf(X[:, 0])
- # Question 1A
- # TODO Q1A
- # Complétez la fonction sample(n), qui génère n
- # données suivant la distribution mentionnée dans l'énoncé
- def sample(n):
- Xlow = -5
- Xhigh = 10
- span = Xhigh - Xlow
- dataPerUnit = span/n
- X = numpy.empty((n+1,1))
- x = numpy.empty(n+1)
- for k in range(n+1):
- X[k] = k * dataPerUnit + Xlow
- x[k] = k * dataPerUnit + Xlow
- Y = pdf(X)
- return (x, Y)
- if __name__ == '__main__':
- # Question 1A
- _times.append(time.time())
- # TODO Q1A
- # Échantillonnez 50 et 10 000 données en utilisant la fonction
- # sample(n) que vous avez définie plus haut et tracez l'histogramme
- # de cette distribution échantillonée, en utilisant 25 bins,
- # dans le domaine [-5, 10].
- # Sur les mêmes graphiques, tracez également la fonction de densité réelle.
- sampleSizes = [50, 10000]
- binNumber = 25
- fig, subfigs = pyplot.subplots(1, len(sampleSizes))
- i = 0
- for subfig in subfigs:
- data = sample(sampleSizes[i])
- try:
- subfig.hist(data[0], weights=data[1], bins=binNumber, density=True, color='c', edgecolor='k')
- except:
- subfig.hist(data[1], bins=binNumber, normed=True, color='c', edgecolor='k')
- subfig.set_title(str(sampleSizes[i]) + " données")
- subfig.set_xlabel("domaine [-5, 10]")
- subfig.set_ylabel("densité")
- subfig.set_xlim(-5,10)
- i += 1
- # Affichage du graphique
- _times.append(time.time())
- checkTime(TMAX_Q1A, "1A")
- pyplot.suptitle("Histogrammes à 25 bins")
- pyplot.show()
- # Question 1B
- _times.append(time.time())
- # TODO Q1B
- # Échantillonnez 50 et 10 000 données, mais utilisez cette fois une
- # estimation avec noyau boxcar pour présenter les données. Pour chaque
- # nombre de données (50 et 10 000), vous devez présenter les distributions
- # estimées avec des tailles de noyau (bandwidth) de {0.3, 1, 2, 5}, dans
- # la même figure, mais tracées avec des couleurs différentes.
- sampleSizes = [50, 10000]
- bandwidths = [0.3, 1, 2, 5]
- fig1, subfigs1 = pyplot.subplots(1, 2, sharex=True, sharey=True)
- colors = "rbcg"
- i = 0
- for subfig1 in subfigs1:
- N = sampleSizes[i]
- X = numpy.linspace(-5, 10, N)[:, numpy.newaxis]
- Y = numpy.concatenate((numpy.random.normal(0, 1, int(0.4 * N)),
- numpy.random.normal(5, 1, int(0.6 * N))))[:, numpy.newaxis]
- subfig1.set_title(("Échantillon de " + str(N) + " données"))
- subfig1.set_xlabel("domaine [-5, 10]")
- subfig1.set_ylabel("densité")
- i += 1
- kde = KernelDensity(kernel='tophat').fit(Y)
- for k in range(len(bandwidths)):
- kde.bandwidth = bandwidths[k]
- _times.append(time.time())
- log_dens = kde.score_samples(X)
- _times.append(time.time())
- duration = _times[-1] - _times[-2]
- print("duration: " + str(duration))
- Y = numpy.exp(log_dens)
- subfig1.plot(X[:, 0], Y, label=bandwidths[k])
- # Affichage du graphique
- _times.append(time.time())
- checkTime(TMAX_Q1B, "1B")
- pyplot.legend()
- pyplot.suptitle("Densité de noyau 'tophat' selon la largeur")
- pyplot.show()
- # N'écrivez pas de code à partir de cet endroit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement