{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Αυτο-οργανούμενοι Χάρτες.ipynb","provenance":[]},"kernelspec":{"display_name":"Python 3.5","language":"python","name":"python3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"jQnymJ7ZRELP"},"source":["# Αυτο-οργανούμενοι Χάρτες\n","\n","Στο notebook αυτό θα χρησιμοποιήσουμε τη βιβλιοθήκη [Somoclu](https://somoclu.readthedocs.io/en/stable/index.html). Πρόκειται για μια σύγχρονη και βελτιστοποιημένη υλοποίηση των SOM, παραλληλοποιημένη για CPU και GPU. Πρώτα την εγκαθιστούμε:\n"]},{"cell_type":"code","metadata":{"id":"IO2_mgqPRELQ"},"source":["!pip install --upgrade somoclu"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"WpfdrbB61O1p"},"source":["Επίσης, ενημερώνουμε στις τελευταίες εκδόσεις τους, τις υπόλοιπες βιβλιοθήκες που πρόκειται να χρησιμοποιοήσουμε"]},{"cell_type":"code","metadata":{"id":"kmC0hZhwRELK"},"source":["!pip install --upgrade pip\n","!pip install --upgrade numpy\n","!pip install --upgrade pandas\n","!pip install --upgrade scikit-learn"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"LQQg28dNRELV"},"source":["## Εισαγωγή βιβλιοθηκών\n","\n","Εισάγουμε numpy, matplotlib και mpl_toolkits, και somoclu:"]},{"cell_type":"code","metadata":{"id":"bfr7IlOTRELX"},"source":["import numpy as np\n","import matplotlib.pyplot as plt\n","from mpl_toolkits.mplot3d import Axes3D\n","import somoclu\n","%matplotlib inline"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"4jDOTourRELb"},"source":["## Δημιουργία και οπτικοποίηση δεδομένων\n","\n","Δημιουργούμε 3 τεχνητές ομάδες τρισδιάστατων δεδομένων και εμφανίζουμε το γράφημα αναπαράστασής τους με διαφορετικό χρώμα για κάθε ομάδα:"]},{"cell_type":"code","metadata":{"id":"yzxQsP8cRELe"},"source":["samples_in_each_class = 200\n","c1 = np.random.rand(samples_in_each_class, 3)/5\n","c2 = (0.6, 0.1, 0.05) + np.random.rand(samples_in_each_class, 3)/5\n","c3 = (0.4, 0.1, 0.7) + np.random.rand(samples_in_each_class, 3)/5\n","data = np.float32(np.concatenate((c1, c2, c3)))\n","colors = [\"red\"] * samples_in_each_class\n","colors.extend([\"green\"] * samples_in_each_class)\n","colors.extend([\"blue\"] * samples_in_each_class)\n","fig = plt.figure()\n","ax = Axes3D(fig)\n","ax.scatter(data[:, 0], data[:, 1], data[:, 2], c=colors)\n","labels = range(3*samples_in_each_class)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"PxP_HExQRELi"},"source":["## Αρχικοποίηση και εκπαίδευση του SOM\n","Στη συνέχεια αρχικοποιούμε ένα χάρτη SOM με 10 x 10 νευρώνες και τον εκπαιδεύουμε με default παραμέτρους. Χρησιμοποιούμε τη magic `time` για να πάρουμε το χρόνο εκπαίδευσης."]},{"cell_type":"code","metadata":{"id":"PbBS__s_RELj"},"source":["n_rows, n_columns = 10, 10\n","som = somoclu.Somoclu(n_columns, n_rows, compactsupport=False)\n","%time som.train(data)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"Rs4_XWD2RELn"},"source":["Δείτε [εδώ](https://somoclu.readthedocs.io/en/stable/reference.html) όλο το function reference της βιβλιοθήκης."]},{"cell_type":"markdown","metadata":{"id":"LWko_xvQRELr"},"source":["## Απεικόνιση SOM\n","\n","Η βιβλιοθήκη προσφέρει διάφορες δυνατότητες απεικόνισης του χάρτη."]},{"cell_type":"markdown","metadata":{"id":"8amW-AfhRELt"},"source":["### Επίπεδα συνιστωσών\n","\n","H πρώτη είναι να δούμε τα επίπεδα συνιστωσών (component planes), ως προς τους (τρεις) άξονες των διαστάσεων εισόδου. To colorbar μας δείχνει ποιοι νευρώνες του codebook (δηλαδή των 10x10 νευρώνων εξόδου) είναι κοντά. Θυμόμαστε ότι οι νευρώνες εξόδου βρίσκονται σε χώρο ίδιων διαστάσεων με τα διανύσματα εισόδου. Τα 3 γραφήματα είναι για x, y και z."]},{"cell_type":"code","metadata":{"scrolled":true,"id":"aU8ekByjRELv"},"source":["som.view_component_planes(colorbar=True, bestmatches=True, figsize=(15, 15))"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"2h3pNrjsRELy"},"source":["Η figsize ελέγχει τις διαστάσεις του γραφήματος (zoom), όχι τις διαστάσεις του grid.\n","\n","Η απεικόνιση με επίπεδα συνιστωσών είναι πολύ αναλυτική, περισσότερο από ότι θα χρειαζόταν για να μας βοηθήσει στην ομαδοποίηση."]},{"cell_type":"markdown","metadata":{"id":"3-O7gFAdRELz"},"source":["### U-matrix\n","\n","Στην πράξη χρησιμοποιούμε το U-matrix που μας δείχνει το πλέγμα του SOM και το χρωματίζει ανάλογα το πόσο απέχουν οι νευρώνες εξόδου μεταξύ τους (όπως είδαμε στο μάθημα και σύμφωνα με το colorbar)"]},{"cell_type":"code","metadata":{"id":"i8YdbsDgREL1"},"source":["som.view_umatrix(bestmatches=True, bestmatchcolors=colors, labels=labels, colorbar=True, figsize=(15, 15))"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"6JFWk2s6REL5"},"source":["## Παρατηρήσεις για την απεικόνιση U-matrix\n","\n","- με `bestmatches=True` και `labels=labels` τυπώνουμε τα labels των δειγμάτων εισόδου που ανήκουν σε κάθε νευρώνα νικήτη (best matching unit - bmu). Προσοχή εδώ, στο local install του Somoclu ο χάρτης είναι διαδραστικός, στο notebook οχι. Προφανώς δεν ανήκει μόνο ένα δείγμα εισόδου σε κάθε bmu όπως φαίνεται εδώ αφου έχουμε 100 bmus και samples_in_each_class x 3 δείγματα εισόδου (πχ 600 για samples_in_each_class=200). Ο λόγος που εμφανίζεται έτσι είναι γιατί εμφανίζεται μόνο η ετικέτα του τελευταίου δείγματος που ανατίθεται στο κάθε bmu (φανταστείτε δηλαδή ότι κάτω από κάθε ετικέτα συνήθως υπάρχουν και άλλες).\n","- Οι κόκκινες περιοχές δείχνουν περιοχές με μεγάλες αποστάσεις και οι μπλε περιοχές δείχνουν περιοχές με μικρές αποστάσεις. Εποπτικά, βλέπουμε ότι έχει διαχωρίσει καλά σε τρία clusters τα δείγματα εισόδου. "]},{"cell_type":"markdown","metadata":{"id":"cqDdb_PbREL6"},"source":["## Clustering των νευρώνων νικητών (bmus)\n","Η `bestmatchcolors=colors` βάζει χρώμα στα bmu που ανήκουν στο ίδιο cluster. Αυτό δεν γίνεται εποπτικά (\"με το μάτι\" από το U-matrix) αλλά ως εξής σε τρια βήματα: \n","1. μέσω ανταγωνιστικής μάθησης έχουμε μάθει τα βάρη των νευρώνων νικητών (bmus). \n","2. εφαρμόζουμε έναν αλγόριθμο συσταδοποίησης όπως k-means για βρούμε ποιοι νευρώνες νικητές ανήκουν στο ίδιο cluster\n","3. χρωματίζουμε με το ίδιο χρώμα τους νευρώνες κάθε cluster\n","\n","Μπορούμε να ορίσουμε όποιον αλγόριθμο συσταδοποίησης θέλουμε για τα bmus του SOM:\n","```python\n","from sklearn.cluster import KMeans\n","algorithm = KMeans()\n","som.cluster(algorithm=algorithm)\n","```"]},{"cell_type":"markdown","metadata":{"id":"ru8sCAVkREL8"},"source":["### Best matching units (BMUS)\n","\n","Μπορούμε να δούμε σε ποιο νευρώνα νικητή ανήκει κάθε δείγμα εισόδου ως εξής:"]},{"cell_type":"code","metadata":{"id":"1rx5qWRnREL9"},"source":["bmus = som.bmus"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"djWeG2-TREMB"},"source":["print(bmus.shape)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"PoQC0XlIREME"},"source":["οι διαστάσεις είναι τα διανύσματα εισόδου επί τις διαστάσεις του πλέγματός μας (2 εφόσον είναι 10x10). Ο πίνακας bmus μας δείχνει τις συντεταγμένες στο πλέγμα του νευρώνα νικητή στον οποίο ανήκει το κάθε δείγμα εισόδου."]},{"cell_type":"code","metadata":{"id":"SFlpSaE3REMG"},"source":["print(bmus)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"od0Er_SfREMK"},"source":["**Προσοχή**\n","- η σύμβαση του Somoclu είναι \\[κολόνα γραμμή\\] (ανάποδα από την Python)\n","- αν πάρετε τις μοναδικές εμφανίσεις των bmus μπορεί να είναι λιγότερες από 100 (10x10). Αυτό γιατί μπορεί να υπάρξουν νευρώνες εξόδου που δεν νίκησαν ποτέ και δεν τους έχουν ανατεθεί δείγματα εδώ.\n","\n","Μπορούμε να απαριθμήσουμε τα μοναδικά bmus και να πάρουμε άνα πίνακα που μας δείχνει σε ποιο αριθμό bmu ανήκει κάθε δείγμα εισόδου ως εξής:"]},{"cell_type":"code","metadata":{"id":"atMejNtaREMM"},"source":["ubmus, indices = np.unique(bmus, return_inverse=True, axis=0)\n","# το return_inverse επιστρέφει και τους δείκτες indices"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"HxoOLjC-REMR"},"source":["Τυπώνουμε τα μοναδικά bmus. Το \\[0 0\\] είναι το bmu 0, το \\[0 1\\] είναι το bmu 1, το \\[0 2\\] είναι το bmu 2 κοκ. "]},{"cell_type":"code","metadata":{"id":"J4SOh2uHREMT"},"source":["print(ubmus)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"3K8v4Sn8REMY"},"source":["Τυπώνουμε τέλος για κάθε δείγμα εισόδου σε ποιο αριθμό bmu ανήκει. (πιο βολικό από τις συντεταγμένες των bmus)"]},{"cell_type":"code","metadata":{"scrolled":true,"id":"TiNKfKNjREMa"},"source":["print(indices)"],"execution_count":null,"outputs":[]}]}