Πρόβλημα με συνάρτηση eig Matlab

Γενικά θέματα για τις γλώσσες προγραμματισμού που δεν καλύπτονται από τις άλλες περιοχές της κατηγορίας.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
bakalogatos
Δημοσιεύσεις: 15
Εγγραφή: 05 Ιαν 2008 22:42

Πρόβλημα με συνάρτηση eig Matlab

Δημοσίευση από bakalogatos » 06 Ιούλ 2008 22:36

Καλησπέρα σε όλους! Λοιπόν ας περάσω στο πρόβλημα μου!
Σε κάποιο σημείο της διπλωματικής μου πρέπει να κάνω PCA. Επομένως έπρεπε να βρώ eigenvalues-eigenvectors ενός covariance matrix. Αρχικά χρησιμοποίησα την συνάρτηση του Matlab eig και όλα ήταν καλά. Αργότερα έπρεπε να κάνω translate τον κώδικα του matlab σε standalone κώδικα σε c. Υλοποίησα σε c συνάρτηση για το eigen analysis. Όμως υπήρχε διαφορά στο πρόσημο των eigenvectors σε σχέση με το αποτέλεσμα του Matlab.Ψάχνοντας στο internet βρήκα και άλλο κώδικα που είχε και εκείνος το ίδιο πρόβλημα.Το πρόσημο δν βγαίνει πάντα λάθος , αλλά τυχαία. Το Matlab (κατά ένα ανεξηγητο τρόπο :o ) ορισμένες φορές πολ/σιαζει το eigenvector με το -1. Μήπως είχε κανείς το ίδιο πρόβλημα ? Οποιαδήποτε ιδέα δεκτή!



Φιλικά Bakalogatos
Τελευταία επεξεργασία από το μέλος bakalogatos την 07 Ιούλ 2008 14:56, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Πρόβλημα με συνάρτηση eig Matlab

Δημοσίευση από soteres2002 » 07 Ιούλ 2008 03:28

bakalogatos έγραψε: Το πρόσημο δν βγαίνει πάντα λάθος , αλλά τυχαία. Το Matlab (κατά ένα ανεξηγητο τρόπο :o ) ορισμένες φορές πολ/σιαζει το eigenvector με το -1. Μήπως είχε κανείς το ίδιο πρόβλημα ? Οποιαδήποτε ιδέα δεκτή!

Φιλικά Bakalogatos
Δώσε περισσότερο info για τις συνθήκες που γίνεται αυτό. Ο αλγορίθμος που υλοποιησες είναι σωστά υλοποιημένος (1:1); Ακόμα κι αν είναι όντως 1:1 η Matlab και η C δεν εξασφαλίζουν πάντα την ίδια ακρίβεια. Καλύπτεις ίσως περιπτώσεις που επιβάλει η υλοποίηση σε C πέρα από την μεταφορά του ψευδοκώδικα σε C; Αν και δεν δίνεις περισσότερες λεπτομέρειες, υποψιάζομαι πως υπάρχει κάποιο παράδοξο στην αριθμητική του συστήματος. Αν δοκιμάσεις τους ίδιους κώδικες σε άλλη αρχιτεκτονική παίζει το ίδιο; Αν οι συναρτήσεις της Matlab είναι σε native Java πολύ πιθανόν να δημιουργούνται παράδοξα, καθώς το virtual machine δεν εξομοιώνει την αριθμητική του συστήματος όπως γίνεται με native C. Πάντως εξαρτάται και η είσοδος που δίνεις, καθώς συγκεκριμένα νούμερα μπορεί να συσσωρεύουν σφάλματα λόγω στογγύλευσης που υπάρχουν στην ΙΕΕΕ αριθμητική. Αν είναι έτσι, πρέπει να τροποποιήσεις κάποιους υπολογισμούς ώστε να μην συσσωρεύονται σφάλματα ή να χρησιμοποιήσεις άλλη μέθοδο υπολογισμού που είναι πιο ασφαλής σε ακρίβεια.

Ίσως αν χρησιμοποιήσεις κάποιο package στην Matlab για γραμμική άλγεβρα που είναι native να λύσει το πρόβλημα ή να έχεις ελάχιστο σχετικό σφάλμα στις μετρήσεις που βγαίνουν από τις 2 υλοποιήσεις.

Θα σου συνιστούσα να δουλέψεις με LINPACK/LAPACK για να καταπολεμήσεις εμπόδια που αφορούν κομμάτια αρχιτεκτονικής και δεν μπορεί να βρεθεί γενική λύση στο υπολογιστικό πρόβλημα. Είναι πολλές φορές σαν να προσπαθείς να λύσεις κάτι χωρίς να ξέρεις τι ακριβώς ψάχνεις... Ειναι σαν ψυχανάλυση κίνδυνο να βγάλεις λάθος συμπέρασμα, μην το επιχειρήσεις έτσι... Το να γίνεις myth buster μπορεί να να είναι επίπονο ενώ δεν χρειάζεται. :lol:

Μπορώ να σε παραπέμψω και σε αποδεικτικά (αριθμητικής ανάλυσης) για αυτά που λέω όσον αφορά την Java που είναι γραμμένη η Matlab με hints που ίσως σε πάνε λίγο παραπέρα, αν και δεν αφορούν άμεσα τη διπλωματική σου. Δεν είναι ό,τι καλύτερο να συγκρίνεις αυτα τα 2. Καλύτερα δούλεψε σε κάτι που μειώνει τα σφάλματα (με κάποιο αποδεδειγμένα έμπιστο framework). Μην παρεξηγηθώ, δεν κατηγορώ την Matlab, απλά μερικές φορές μπορεί σε κάτι εξειδικευμένο να πρέπει να επιστρατεύσεις άλλες τεχνικές και άλλη γνώση.

Όταν λες ότι το πρόσημο δεν βγαίνει λάθος πάντα, αλλά "τυχαία" αυτό αφορά τα ίδια δεδομένα; Δηλαδή μια παίζει σωστά την άλλη οχι για την ίδια είσοδο; Το πρόβλημα σίγουρα είναι κάτι που αφορά την αριθμητική. Από τη μία είναι παράλογο μια να παίζει έτσι την άλλη γιουβέτσι ο αλγόριθμος που είναι ντετερμινιστικός (μπορεί να μην έχει και καλή κατάσταση) και όχι αιτιοκρατικός που αποφαίνεται βάσει πιθανότητας. Από την άλλη, το πρόβλημα μπορεί να το δημιουργεί και η είσοδός σου, μια μικρή μεταβολή στα δεδομένα σου μπορεί να δώσει καλύτερα αποτελέσματα. Τίποτα δεν είναι ανεξήγητο, μπορεί όμως να μην είναι άμεσα προφανές και να φαίνεται σαν παράδοξο.

Ελπίζω να σε κατεύθυνα/συμβούλεψα σωστά.

bakalogatos
Δημοσιεύσεις: 15
Εγγραφή: 05 Ιαν 2008 22:42

Πρόβλημα με συνάρτηση eig Matlab

Δημοσίευση από bakalogatos » 07 Ιούλ 2008 14:55

Αρκετά κατατοπιστικά αυτά που μου είπες. Αρχικά όταν λέω ότι βγάζει λάθος πρόσημο εννοώ ότι για κάποιους πίνακες βγάζει σωστά αποτελέσματα και οι 2 διαδικασίες ενώ για κάποιους άλλους βγάζει λάθος πρόσημο. Πάντα όμως και οι 2 διαδικασίες βγάζουν ίδια eigenvalues. Γενικά στο internet που έψαξα το έχουν και άλλοι αυτό το πρόβλημα! Επίσης υλοποίηση την συνάρτηση dsyev του lapack που χρησιμοποιεί το matlab αλλά πάλι το ίδιο πράγμα. Πάντος το να βγάλει αντίθετο πρόσημο δν είναι λάθος γιατί και αντίθετο πρόσημο να βγεί ένα eigenvector θα είναι πάλι eigenvector του πίνακα , απλά θα είναι παράλληλο ως προς το σωστό ως προς το matlab eivenvector. Στην δικιά μου περίπτωση όμως χρειάζομαι το σωστό κατα το matlab eigevencetor γιατι παρακάτω κάνω διαχορισμό βάση του προσήμου του eigenvector.

Φιλικά Bakalogatos

Απάντηση

Επιστροφή στο “γλώσσες προγραμματισμού - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες