AntonisZks / Information-Systems-Software-Development-Project

A university project implementing Vamana-Indexing-Algorithm (VIA) for Approximate-Nearest-Neighbors (ANN) problem.
2 stars 0 forks source link
ann approximate-nearest-neighbor-search graph graph-search k-nearest-neighbours knn vamana vamana-indexing-algorithm via

Ανάπτυξη Λογισμικού για Πληροφοριακά Συστήματα

Project - Μέρος Πρώτο : Προσσεγιστική Επίλυση του προβλήματος K-Εγγύτερων Γειτόνων (K-Nearest Neigbours) μέσω του Αλγορίθμου Vamana

Τμήμα Πληροφορικής και Τηλεπικοινωνιών - ΕΚΠΑ - Χειμερινό Εξάμηνο 24-25

| Ονοματεπώνυμο | Αριθμός Μητρώου | email | | :-------------: | :-------------: | :-------------: | | Ζήκας Αντώνιος | 1115202100038 | sdi2100038@di.uoa.gr | | Χασιώτη Ευανθία | 1115202100289 | sdi2100289@di.uoa.gr | | Κώτσιλας Σταύρος | 1115201700292 | sdi1700292@di.uoa.gr |

Overview

Χαρακτηριστικά Κώδικα

Μεταγλώττιση και Εκτέλεση

Datasets

VIA = Vamana Indexing Algorithm

Τα δεδομένα που χρησιμοποιούνται για τον Αλγόριθμο Vamana Indexing. Είναι σετ διανυσμάτων 128 διαστάσεων (με αριθμούς κινητής υποδιαστολής (float)). Στον κώδικά μας αξιοποιήσαμε το σετ δεδομένων ANN_SIFT10K. το οποίο περιέχει:

Περιγραφή Πρώτου Μέρους Project και Ζητούμενα

Στο πρώτο μέρος του Project κληθήκαμε να υλοποιήσουμε τον Αλγόριθμο Vamana Indexing, o oποίος λειτουργεί ως μία Προσεγγιστική Λυση του Προβλήματος της Εύρεσης των Κ-Εγγύτερων Γειτόνων, μέσω της χρήσης κατευθυνόμενου γράφου για την αναπαράσταση και επεξεργασία των δεδομένων. Η υλοποίησή μας στηρίχθηκε πάνω στο αρθρο του 2019, DiskANN:Fast Accurate Billion-point Nearest Neighbour Search on a Single Node Search. Πιο συγκεκριμένα, μας ζητήθηκε να υλοποιήσουμε τα εξής:

Για την εξέταση της λειτουργικότητας του VIA ήταν αναγκάιο να δημιουργήσουμε συμπληρωματικές κλάσεις και μεθόδους για:

Διαδικασία Ανάπτυξης, Συνεργασία και Αρμοδιότητες Συμμετεχόντων της Ομάδας

Στην Ανάπτυξη του Project αξιοποιήθηκε το εργαλείο Issues του github για την επικοινωνία και τον συγχρονισμό των διεργασιών που είχε αναλάβει να διεκπεραιώσει το κάθε μέλος της ομάδας.

Καθόλη την διάρκεια της ανάπτυξης του Project υπήρξε συνεχείς επικοινωνία των μελών τόσο μέσω των εργαλείων του github όσο και με προγραμματισμένα online calls.

Υποστηρικτικές / Συμπληρωματικές Συναρτήσεις και Κλάσεις

Η υλοποίηση των συναρτήσεων VamanaIndex(), GreedySearch(), RobustPrune() και Recall(), έγινε σύμφωνα με τους ψευδοκώδικες που παρουσιάζονται στο άρθρο, και φάινονται παρακάτω:

Alt Text Alt Text Alt Text

Οι βασικότερες κλάσεις και μέθοδοι που υλοποιήθηκαν συμπληρωματικά αυτών που ζητήθηκαν στην εκφώνηση είναι:

  1. Συνάρτηση FindMedoid(), για την εύρεση του ενδιάμεσου στοιχείου του συνόλου G, που παράγεται μέσα στην Vamana.
  2. Συνάρτηση CalculateRecallEvaluation() , για την εξέταση της εγγυρότητας των αποτέλεσμάτων του ANN Vamana Index, βάσει των τιμών του shiftsmall_groundtruth.ivecs.
  3. Κλάση DataVector, για την αποθήκευση των δεδομένων των αρχείων .fvecs.
  4. Κλάσεις Graph και GraphNode. Δομές τι οποίες αξιοποιεί ο VIA.
  5. Συναρτήσεις ReadVectorFile() και SaveVector(), για την ανάγνωση και αποθήκευση των δεδομένων.
  6. Συναρτήσεις EuclidianDistance() και ManhattanDistance(), για τον υπολογισμό της απόστασης μεταξύ των διανυσμάτων.

Flowchart Αλγορίθμου

Για την εκτέλεση του κώδικα πληκτρολογούμε τις εντολές:

Οι τιμές στο τέλος αντιστοιχούν στις παραμέτρους:

Η εκτέλεση του Vamana Indexing Algorithm γίνεται σε τρεις φάσεις:

Initialization Phase

Στο Initialization phase, γίνεται η ανάγνωση και η αποθήκευση των δεδομένων μας από τις συναρτήσεις:

Η οποίες διαβάζουν από τα αρχεία siftsmall_base.fvecs, siftsmall_query.fvecs και siftsmall_groundtruth.ivecs τα δεδομένα μας.

Vamana Phase

Σε δεύτερη φάση, ξεκινά η δημιουργία του τυχάιου γράφου από την Vamana(), η οποία αναθέτει τα δεδομένα του siftsmall_base.fvecs σε αντικείμενα της κλάσης node, και ύστερα δημιουργεί τυχαίες εξερχόμενες ακμές από καθένα από αυτούς (με όριο τον αριθμό R που ορίζουμε από την γραμμή εντολών). Ο γράφος αναπαριστάται με λίστα γειτνίασης.

Ακολουθούν οι διαδικασίες GreedySearch() και σε συνδυασμό με την RobustPrune(), εκτελούν την βασική λειτουργία του Vamana Indexing Algorithm όπου είναι η αναζήτηση των K εγγύτερων γειτόνων του query vector (που το ορίζουμε από την γραμμή εντολών), με την βοήθεια της διαδικασίας του κλαδέματος ακμών.

Validity Phase

Στην τελευταία φάση του αλγορίθμου, καλείται η GreedySearch() για τον υπολογισμό των K εγγύτερων γειτόνων, και ακολουθεί η μέθοδος CalculateRecallEvaluation(), η οποία εξετάζει την εγκυρότητα των αποτελεσμάτων που επιστράφηκαν από την δεύτερη φάση, με τις τιμές που βρίσκονται στο αρχείο siftsmall_groundtruth.ivecs και επιστρέφει το ποσοστό "ομοιότητας" των πρσεγγιστικών τιμών του VIA με την πραγματική τιμή του K.