Hepic / Big-Data-Assignment

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Αλγοριθμική Επιστήμη Δεδομένων Προγραμματιστική Άσκηση

Αντώνης Σκαρλάτος AL1180016 (Α.Λ.ΜΑ)


Δομή αρχείων

Υπάρχουν τρία αρχεία.

  • Το αρχείο main.py διαβάζει τα δεδομένα, καλεί συναρτήσεις για τους κατάλληλους υπολογισμούς και εξάγει τα δεδομένα.
  • Το αρχείο algorithms.py περιέχει όλες τις συναρτήσεις που αφορούν τους αλγόριθμους που χρησιμοποιούνται.
  • Το αρχείο help_functions.py περιέχει όλες τις βοηθητικές συναρτήσεις.

Λειτουργία

Για την εκτέλεση του προγράμματος τρέχουμε την εντολή python main.py data_file solution_file_families όπου data_file είναι η τοποθεσία του αρχείου με τα δεδομένα και solution_file_families η τοποθεσία του αρχείου με τις λύσεις για τις οικογένειες. Το αρχείο data_file είναι υποχρεωτικό, αλλά το solution_file_families είναι προεραιτικό για την περίπτωση που θέλουμε να υπολογίσουμε το accuracy για τις οικογένειες. Δεν γίνεται κάποιος έλεγχος για τα ορίσματα και η λανθασμένη εκτέλεση της εντολής θα πετάξει απρόβλεπτη έξοδο.

Παραδείγματα εκτέλεσης:

  • python main.py datasets/recordings_example.csv
  • python main.py datasets/recordings_example.csv datasets/solution_1a_example.csv

Στην έξοδο του προγράμματος εκτυπώνονται οι χρόνοι και προεραιτικά το accuracy μόνο για τις οικόγενειες. Επίσης στα αρχεία datasets/solution_1a.csv, datasets/solution_1b.csv, datasets/solution_2.csv αποθηκεύονται οι απαντήσεις που βρίσκει το πρόγραμμα για τα αντίστοιχα ερωτήματα της εκφώνησης.

Επεξήγηση του αλγορίθμου

Στην αρχή διαβάζουμε τα δεδομένα και αποθηκεύουμε μόνο τις πληροφορίες που φαίνονται πιο φυσιολογικές για την κάθε περίπτωση. Για παράδειγμα για τις οικογένειες αποφεύγουμε τις ώρες δουλειάς, καθώς υποθέτουμε ότι εκείνες τις ώρες δεν βρίσκεται κάποιος στο σπίτι. Επομένως έτσι αποθηκεύουμε μόνο τις πληροφορίες που μας είναι χρήσιμες σε κάθε περίπτωση.

Για κάθε mac κρατάμε μία λίστα από triples (day, hour, ip). Δηλαδή για κάθε mac κρατάμε όλες τις συνδέσεις της και ακόμα προσθέτουμε αυθαίρετα κάποιες ακόμα συνδέσεις (+-2 ώρες από την ώρα που συνδέθηκε ο χρήστης) για να βοηθηθεί η απόσταση που χρησιμοποιούμε για τις mac.

Σαν απόσταση μεταξύ δύο mac χρησιμοποιούμε την jaccard απόσταση. Δύο mac ενώνονται μεταξύ τους αν η jaccard απόστασή τους είναι σχετικά μικρή σε σχέση με τις υπόλοιπες. Αυτή η ένωση γίνεται με τον αλγόριθμο union-find.

Επειδή η λίστα μίας mac μπορεί να είναι πολύ μεγαλή, εφαρμόζουμε τον αλγόριθμο του minhash ώστε να πάρουμε συμπιεσμένες λίστες που όμως διατηρούν περίπου την ίδια jaccard απόσταση μεταξύ τους. Επιπλέον, επειδή οι mac είναι πολλές, για να βρούμε τις πιο κοντινές mac, χρησιμοποιούμε LSH και ελέγχουμε την jaccard απόσταση δύο mac μόνο αν έχουν πέσει σε κάποιο κοινό bucket κάποιου hash table. Πιο ειδικά, με το minhash συμπιέζουμε την λίστα της κάθε mac σε πενήντα στοιχεία χρησιμοποιώντας πέντε hash functions, όπου μέσω της κάθε συνάρτησης παίρνουμε δέκα στοιχεία. Επομένως για κάθε mac αποθηκεύουμε πενήντα συνδέσεις της. Στην συνέχεια, επειδή έχουμε ήδη συμπιέσει την πληροφορία της κάθε mac, δημιουργούμε πενήντα hash tables και εισάγουμε κάθε ένα στοιχείο σε διαφορετικό hash table. Οπότε η υπόθεση είναι, πως αν κάποιες mac είναι κοντά τότε θα έχουν σε κάποια θέση των λιστών τους, ακριβώς την ίδια σύνδεση με αποτέλεσμα να πέσουν στο ίδιο bucket ενός hash table.

Για να δημιουργήσουμε τις ομάδες που περιέχουν κοινές mac, διατρέχουμε κάθε bucket και βάζουμε δύο mac στην ίδια ομάδα αν η jaccard απόσταση των αρχικών λιστών τους (πριν το minhash) που περιέχουν τις συνδέσεις τους, είναι σχετικά μικρή.

Αφού δημιουργήσουμε τις ομάδες, διαγράφουμε κάποιες από αυτές με βάση κάποια κριτήρια με την υπόθεση ότι δεν είναι πραγματικές ομάδες. Κάποια κριτήρια που χρησιμοποιούμε για τις οικογένειες, είναι να αφαιρέσουμε αυτές που περιέχουν λιγότερα από τρία μέλη και αυτές που έχουν λίγες αλλαγές των ip διευθύνσεών τους ανά μέρα.

Κόστος Χρόνου/Χώρου

Ο χώρος που χρησιμοποιεί το πρόγραμμα είναι αντίστοιχος του μεγέθους του αρχείου εισόδου.

Ο συνολικός χρόνος για το μικρό αρχείο για να υπολογίσει οικογένειες, εργαζόμενους και ξενοδοχεία είναι περίπου τέσσερα δευτερόλεπτα. Για το κανονικό αρχείο ο χρόνος για να υπολογίσει μόνο τις οικογένειες είναι περίπου είκοσι πέντε δευτερόλεπτα. Κάποιες σημαντικές παράμετροι για τον χρόνο είναι ο τρόπος που γίνεται το minhash, το πλήθος των hash tables, το αν συγκρίνουμε τα στοιχεία στα ίδια bucket με την πραγματική τους απόσταση ώστε να αποφύγουμε false positives. Τροποποιώντας δηλαδή κάτι από αυτά θα μπορούσε να μειώσει πολύ το χρόνο εκτέλεσης με πιθανόν χειρότερα αποτελέσματα και αντίστοιχα με πιο αυστηρές παραμέτρους θα μπορούσαμε να πάρουμε καλύτερα αποτελέσματα με πιο μεγάλη καθυστέρηση.

About


Languages

Language:Python 100.0%