Python: Διανύσματα, πίνακες και πίνακες με NumPy

Python Vectors Matrices



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

Η βιβλιοθήκη NumPy μας επιτρέπει να εκτελούμε διάφορες λειτουργίες που πρέπει να γίνουν σε δομές δεδομένων που χρησιμοποιούνται συχνά στη μηχανική εκμάθηση και την επιστήμη δεδομένων, όπως διανύσματα, πίνακες και πίνακες. Θα δείξουμε μόνο τις πιο συνηθισμένες λειτουργίες με το NumPy που χρησιμοποιούνται σε πολλούς αγωγούς Machine Learning. Τέλος, σημειώστε ότι το NumPy είναι απλώς ένας τρόπος εκτέλεσης των λειτουργιών, επομένως, οι μαθηματικές πράξεις που δείχνουμε είναι ο κύριος στόχος αυτού του μαθήματος και όχι το ίδιο το πακέτο NumPy. Ας αρχίσουμε.







Τι είναι το Vector;

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





Τα διανύσματα είναι πολύ σημαντικά στη Μηχανική Μάθηση καθώς δεν περιγράφουν μόνο το μέγεθος αλλά και την κατεύθυνση των χαρακτηριστικών. Μπορούμε να δημιουργήσουμε ένα διάνυσμα στο NumPy με το ακόλουθο απόσπασμα κώδικα:





εισαγωγή μουδιασμένοςόπως καιπ.χ

row_vector = np.array([1,2,3])
Τυπώνω(row_vector)

Στο παραπάνω απόσπασμα κώδικα, δημιουργήσαμε ένα διάνυσμα γραμμών. Μπορούμε επίσης να δημιουργήσουμε ένα διάνυσμα στήλης ως:

εισαγωγή μουδιασμένοςόπως καιπ.χ

col_vector = np.array([[1],[2],[3]])
Τυπώνω(col_vector)

Κάνοντας μια μήτρα

Ένας πίνακας μπορεί απλά να νοηθεί ως δισδιάστατος πίνακας. Μπορούμε να δημιουργήσουμε έναν πίνακα με το NumPy κάνοντας έναν πολυδιάστατο πίνακα:



matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
Τυπώνω(μήτρα)

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

  1. Ο πίνακας είναι το βασικό όταν πρόκειται για το πακέτο NumPy
  2. Οι περισσότερες από τις λειτουργίες με NumPy επιστρέφουν πίνακες και όχι πίνακα

Χρησιμοποιώντας μια αραιή μήτρα

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

Ας δημιουργήσουμε έναν πίνακα σπινθήρα εδώ:

από scipy εισαγωγή αραιά

original_matrix = np.array([[1,0,3],[0,0,6],[7,0,0]])
sparse_matrix = sparse.csr_matrix(original_matrix)
Τυπώνω(sparse_matrix)

Για να καταλάβετε πώς λειτουργεί ο κώδικας, θα δούμε την έξοδο εδώ:

Στον παραπάνω κώδικα, χρησιμοποιήσαμε μια λειτουργία NumPy για να δημιουργήσουμε ένα Συμπιεσμένη αραιή σειρά μήτρα όπου μη μηδενικά στοιχεία αναπαρίστανται χρησιμοποιώντας μηδενικούς δείκτες. Υπάρχουν διάφορα είδη αραιής μήτρας, όπως:

  • Συμπιεσμένη αραιή στήλη
  • Λίστα καταλόγων
  • Λεξικό κλειδιών

Δεν θα βουτήξουμε σε άλλες αραιές μήτρες εδώ, αλλά να γνωρίζουμε ότι κάθε χρήση τους είναι συγκεκριμένη και κανείς δεν μπορεί να χαρακτηριστεί ως «καλύτερος».

Εφαρμογή λειτουργιών σε όλα τα διανυσματικά στοιχεία

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

matrix = np.array([
[1,2,3],
[4,5,6],
[7,8,9]])

mul_5 = λάμδα x: x* 5
vectorized_mul_5 = np. vectorize(mul_5)

vectorized_mul_5(μήτρα)

Για να καταλάβετε πώς λειτουργεί ο κώδικας, θα δούμε την έξοδο εδώ:

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

μήτρα* 5

Και το αποτέλεσμα θα ήταν ακριβώς το ίδιο. Wantedθελα να δείξω πρώτα το περίπλοκο μέρος, αλλιώς θα είχατε παραλείψει την ενότητα!

Μέση, διακύμανση και τυπική απόκλιση

Με το NumPy, είναι εύκολο να εκτελέσετε λειτουργίες που σχετίζονται με περιγραφικά στατιστικά στοιχεία σε διανύσματα. Η μέση τιμή ενός διανύσματος μπορεί να υπολογιστεί ως εξής:

μ.π. μέσο(μήτρα)

Η διακύμανση ενός διανύσματος μπορεί να υπολογιστεί ως εξής:

np.var(μήτρα)

Η τυπική απόκλιση ενός διανύσματος μπορεί να υπολογιστεί ως εξής:

π.χ. std(μήτρα)

Η έξοδος των παραπάνω εντολών στη δεδομένη μήτρα δίνεται εδώ:

Μεταφορά μιας μήτρας

Η μεταφορά είναι μια πολύ συνηθισμένη λειτουργία για την οποία θα ακούτε κάθε φορά που περιβάλλεστε από πίνακες. Η μεταφορά είναι απλώς ένας τρόπος ανταλλαγής τιμών στήλης και γραμμής ενός πίνακα. Παρακαλώ σημειώστε ότι α το διάνυσμα δεν μπορεί να μεταφερθεί ως διάνυσμα είναι απλώς μια συλλογή τιμών χωρίς αυτές οι τιμές να ταξινομούνται σε γραμμές και στήλες. Λάβετε υπόψη ότι η μετατροπή ενός διανύσματος γραμμών σε διάνυσμα στήλης δεν μεταφέρει (με βάση τους ορισμούς της γραμμικής άλγεβρας, η οποία δεν εμπίπτει στο πεδίο αυτού του μαθήματος).

Προς το παρόν, θα βρούμε ειρήνη μόνο με τη μεταφορά μιας μήτρας. Είναι πολύ απλή η πρόσβαση στη μεταφορά μιας μήτρας με το NumPy:

μήτρα.Τ

Η έξοδος της παραπάνω εντολής στον δεδομένο πίνακα δίνεται εδώ:

Η ίδια λειτουργία μπορεί να γίνει σε ένα διάνυσμα γραμμών για να το μετατρέψετε σε διάνυσμα στήλης.

Ισοπέδωση ενός πίνακα

Μπορούμε να μετατρέψουμε έναν πίνακα σε έναν μονοδιάστατο πίνακα εάν θέλουμε να επεξεργαστούμε τα στοιχεία του με γραμμικό τρόπο. Αυτό μπορεί να γίνει με το ακόλουθο απόσπασμα κώδικα:

μήτρα.επιπεδώνεται()

Η έξοδος της παραπάνω εντολής στον δεδομένο πίνακα δίνεται εδώ:

Σημειώστε ότι η επίπεδη μήτρα είναι μια μονοδιάστατη συστοιχία, απλά γραμμική στη μόδα.

Υπολογισμός ιδιοτιμών και ιδιοδιανυσμάτων

Τα ιδιοδιανύσματα χρησιμοποιούνται πολύ συχνά σε πακέτα Machine Learning. Έτσι, όταν μια συνάρτηση γραμμικού μετασχηματισμού παρουσιάζεται ως μήτρα, τότε Χ, τα ιδιοδιανύσματα είναι τα διανύσματα που αλλάζουν μόνο σε κλίμακα του διανύσματος αλλά όχι και στην κατεύθυνσή του. Μπορούμε να πούμε ότι:

Xv = γv

Εδώ, το Χ είναι η τετραγωνική μήτρα και το γ περιέχει τις Ιδιοτιμές. Επίσης, το v περιέχει τα ιδιοδιανύσματα. Με το NumPy, είναι εύκολο να υπολογίσετε ιδιοτιμές και ιδιοδιανύσματα. Εδώ είναι το απόσπασμα κώδικα όπου αποδεικνύουμε το ίδιο:

evalues, evectors = np.linalg.eig(μήτρα)

Η έξοδος της παραπάνω εντολής στον δεδομένο πίνακα δίνεται εδώ:

Dot Products of Vectors

Τα Dot Products of Vectors είναι ένας τρόπος πολλαπλασιασμού 2 διανυσμάτων. Σου λέει για πόσα από τα διανύσματα βρίσκονται στην ίδια κατεύθυνση , σε αντίθεση με το εγκάρσιο προϊόν που σας λέει το αντίθετο, πόσο λίγα είναι τα διανύσματα προς την ίδια κατεύθυνση (ονομάζονται ορθογώνια). Μπορούμε να υπολογίσουμε το τελικό γινόμενο δύο διανυσμάτων όπως δίνεται στο απόσπασμα κώδικα εδώ:

a = np.συστοιχία([3,5,6])
b = np.συστοιχία([2. 3,δεκαπέντε,1])

np.dot(α, β)

Η έξοδος της παραπάνω εντολής στους συγκεκριμένους πίνακες δίνεται εδώ:

Προσθήκη, αφαίρεση και πολλαπλασιασμός πινάκων

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

np.προσθέστε(μήτρα, μήτρα)

Στη συνέχεια, δύο πίνακες μπορούν να αφαιρεθούν ως:

np.αφαίρεση(μήτρα, μήτρα)

Η έξοδος της παραπάνω εντολής στον δεδομένο πίνακα δίνεται εδώ:

Όπως ήταν αναμενόμενο, καθένα από τα στοιχεία της μήτρας προστίθεται/αφαιρείται με το αντίστοιχο στοιχείο. Ο πολλαπλασιασμός ενός πίνακα είναι παρόμοιος με τον εντοπισμό του τελικού προϊόντος όπως κάναμε νωρίτερα:

np.dot(μήτρα, μήτρα)

Ο παραπάνω κώδικας θα βρει την πραγματική τιμή πολλαπλασιασμού δύο πινάκων, που δίνεται ως εξής:

μήτρα*μήτρα

Η έξοδος της παραπάνω εντολής στον δεδομένο πίνακα δίνεται εδώ:

συμπέρασμα

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

Μοιραστείτε ελεύθερα τα σχόλιά σας σχετικά με το μάθημα στο Twitter με @linuxhint και @sbmaggarwal (αυτός είμαι εγώ!).