{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Άσκηση 08 - Χρήση των GMMs ως Παραγωγικών Μοντέλων - Solution.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "qxvQeirxrIqK" }, "source": [ "# Άσκηση: Χρήση των Γκαουσιανών Μοντέλων Μείξης ως Παραγωγικών Μοντέλων (Solution)" ] }, { "cell_type": "markdown", "metadata": { "id": "CFUaZZLy7bx7" }, "source": [ "Σε αυτή την άκηση θα χρησιμοποιήσουμε τα γκαουσιανά μοντέλα μείξης ως παραγωγικά μοντέλα, για τη δημιουργία ασπρόμαυρων φωτογραφιών ανθρώπινων προσώπων. Για το σκοπό αυτό, θα χρησιμοποιήσουμε ως δεδομένα εκπαίδευσης το σύνολο δεδομένων [Olivetti Faces](https://scikit-learn.org/0.19/datasets/olivetti_faces.html), το οποίο μπορούμε να φορτώσουμε απευθείας μέσω του scikit-learn.\n", "\n", "Ξεκινάμε κάνοντας import τις κλάσεις και τις μεθόδους που πρόκειται να χρησιμοποιήσουμε." ] }, { "cell_type": "code", "metadata": { "id": "cQWkjb2prClu" }, "source": [ "from sklearn.datasets import fetch_olivetti_faces\n", "from sklearn.decomposition import PCA\n", "from sklearn.mixture import GaussianMixture\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ocY4UT6c8XPX" }, "source": [ "Στη συνέχεια ορίζουμε τη μέθοδο *print_faces()*, η οποία κατ' αντίστοιχο τρόπο με την *plot_digits()* που είδαμε στο εργαστήριο, θα εμφανίζει τις ασπρόμαυρες φωτογραφίες στη μορφή gallery." ] }, { "cell_type": "code", "metadata": { "id": "JrAOrSWOzmmJ" }, "source": [ "def print_faces(images):\n", " \"\"\"\n", " Σχεδίαση προσώπων Olivetti\n", " \"\"\"\n", " fig, ax = plt.subplots(6, 6, figsize=(16,16), subplot_kw=dict(xticks=[], \n", " yticks=[]))\n", " fig.subplots_adjust(hspace=0.05, wspace=0.05)\n", " for i, axi in enumerate(ax.flat):\n", " im = axi.imshow(images[i].reshape(64,64), cmap=plt.cm.gray) " ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "YFCe6DMH-FIt" }, "source": [ "Κατόπιν καλούμε τη μέθοδο *fetch_olivetti_faces()* και αποθηκεύουμε στη μεταβλητή *faces* τα δεδομένα του Olivetti Faces" ] }, { "cell_type": "code", "metadata": { "id": "eeJgnXWH-T-c" }, "source": [ "faces = fetch_olivetti_faces()" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wOibEGMp993O" }, "source": [ "## 1. Στοιχεία της συλλογής δεδομένων\n", "\n", "Εμφανίστε στην οθόνη τα βασικά χαρακτηριστικά της συλλογής δεδομένων (πλήθος στοιχείων επί πλήθος χαρακτηριστικών ανά στοιχείο) καθώς και ορισμένες χαρακτηριστικές εικόνες από τη συλλογή" ] }, { "cell_type": "code", "metadata": { "id": "DBqEI5TtreiE" }, "source": [ "print(faces.data.shape)\n", "print_faces(faces.data)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "bdEdcOHsAARW" }, "source": [ "## 2. Διαστατικότητα δεδομένων\n", "\n", "Όπως θα είδατε παραπάνω, το πλήθος των χαρακτηριστικών του κάθε δείγματος είναι μεγάλο. Εφαρμόστε μείωση των διαστάσεων μέσω ανάλυσης κυρίων συνιστωσών (PCA) έτσι ώστε το πλήθος των χαρακτηριστικών να μειωθεί. Ορίστε το ποσοστό της διακύμανσης σε συνάρτηση και με τα επόμενα βήματα της άσκησης" ] }, { "cell_type": "code", "metadata": { "id": "3sY1vGXn22zv" }, "source": [ "pca = PCA(0.85, whiten=True)\n", "data = pca.fit_transform(faces.data)\n", "data.shape" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "iqKVxnK7AndB" }, "source": [ "## 3. Πλήθος γκαουσιανών\n", "\n", "Χρησιμοποιείστε το Bayesian Information Criterion και το Aikake Information Criterion για να προσδιορίσεετε το βέλτιστο πλήθος των γκαουσιανών κατανομών που θα χρησιμοποιήσετε. Προσδιορίστε τα όρια αναζήτησης εμπειρικά και σχεδιάστε τις αντίστοιχες γραφικές παραστάσεις." ] }, { "cell_type": "code", "metadata": { "id": "Ld4NGuXV3SgM" }, "source": [ "n_components = np.arange(10, 210, 10)\n", "models = [GaussianMixture(n, covariance_type='full', random_state=0) \n", "for n in n_components]\n", "aics = [model.fit(data).aic(data) for model in models]\n", "bics = [model.fit(data).bic(data) for model in models]\n", "plt.plot(n_components, aics)\n", "plt.plot(n_components, bics)\n", "plt.legend(loc='best')\n", "plt.xlabel('Πλήθος στοιχείων');" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "1YCvWNOf3tjK" }, "source": [ "print('Ελαχιστοποίηση AIC στα {} στοιχεία του GMM'.format(\n", " n_components[aics.index(min(aics))])\n", ")\n", "print('Ελαχιστοποίηση BIC στα {} στοιχεία του GMM'.format(\n", " n_components[bics.index(min(bics))])\n", ")" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "9nUvkcL7BooQ" }, "source": [ "## 4. Παραγωγή νέων προσώπων\n", "\n", "Για τις βέλτιστες τιμές των κριτηρίων που βρήκατε στο προηγούμενο βήμα, κατασκευάστε τα αντίστοιχα γκαουσιανά μοντέλα μείξης και χρησιμοποιείστε τα για την παραγωγή νέων δειγμάτων. Εμφανίστε στην οθόνη τα νέα δείγματα που παράξατε." ] }, { "cell_type": "code", "metadata": { "id": "47V6P2ZF379r" }, "source": [ "gmm_aic = GaussianMixture(40, covariance_type='full', random_state=0)\n", "gmm_aic.fit(data)\n", "data_new = gmm_aic.sample(len(data))\n", "t1 = data_new[0]\n", "faces_new = pca.inverse_transform(t1)\n", "print_faces(faces_new)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MMGOB-nDCH8R" }, "source": [ "gmm_bic = GaussianMixture(20, covariance_type='full', random_state=0)\n", "gmm_bic.fit(data)\n", "data_new = gmm_bic.sample(len(data))\n", "t1 = data_new[0]\n", "faces_new = pca.inverse_transform(t1)\n", "print_faces(faces_new)" ], "execution_count": null, "outputs": [] } ] }