Die Einstein -Summationsnotation ist eine kurze und leistungsstarke Möglichkeit, Tensoroperationen darzustellen, die häufig in Physik und maschinellem Lernen verwendet werden. Es ermöglicht uns, komplexe Berechnungen auf Tensoren in kompakter Form zu schreiben. Wir werden die Grundlagen zur Einstein -Summierung abdecken, wie man sie in Python mit Numpy und Tensorflow verwendet und Beispiele zur Veranschaulichung seiner Verwendung angeben.
Grundlagen der Einstein -Summation
Die Einstein -Summationsnotation (Ein -Einsum) basiert auf der Idee, über wiederholte Indizes in Tensorausdrücken zu summieren. Es basiert auf den folgenden zwei Regeln:
1. Summierung über wiederholte Indizes: Wenn ein Index zweimal in einem Term erscheint, wird er übersät
2. Freie Indizes: Indizes, die nur einmal erscheinen, sind freie Indizes und stellen die Achsen des Ausgangszensors dar
Veranschaulichen wir dies mit dem Beispiel, zwei Matrizen A und B zu multiplizieren: Die resultierende Matrix C wird definiert als
In Python bieten sowohl die Numpy- als auch die Tensorflow -Bibliotheken eine Ein -Einsum -Funktion.
Numpy
import numpy as np
# Define two matrices A and B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# Perform matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)
print(C)
# [[19 22]
# [43 50]]
Im obigen Beispiel ist ij,jk->ik
die Einsum -Zeichenfolge:
ij
repräsentiert die Indizes der Matrix a
jk
repräsentiert die Indizes von Matrix B
->ik
Gibt die Indizes der Ausgangsmatrix C an
Die Operation fasst den Index j zusammen
Der gleiche Code in TensorFlow würde so aussehen wie
import tensorflow as tf
# Define two matrices A and B
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32)
# Perform matrix multiplication using einsum
C = tf.einsum('ij,jk->ik', A, B)
print(C)
# tf.Tensor(
# [[19. 22.]
# [43. 50.]], shape=(2, 2), dtype=float32)
Mehr Beispiele
Inneres Produkt von Vektoren
Das innere Produkt (Punktprodukt) von zwei Vektoren A und B ist definiert als
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Außenprodukt von Vektoren
Das äußere Produkt von zwei Vektoren A und B ist gegeben durch:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Transponierung einer Matrix
Die Transponierung einer Matrix A kann durch Austausch ihrer Indizes erhalten werden
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Trace einer Matrix
Die Spur einer Matrix A ist die Summe seiner diagonalen Elemente:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Stapelmatrix -Multiplikation
Einsum ist besonders nützlich für Stapeloperationen. Angenommen, wir haben eine Reihe von Matrizen A und B, und wir möchten die entsprechenden Matrizen in der Charge multiplizieren:
A = np.random.rand(3, 2, 2)
B = np.random.rand(3, 2, 2)
# Perform batch matrix multiplication
C = np.einsum('bij,bjk->bik', A, B)
print(C)
Hier repräsentiert b
die Stapeldimension.
Vorteile der Einsum -Notation
1. SUPCISSINITY: Die Einsum -Notation ist kompakt und kann komplexe Operationen prägnant darstellen
2. Flexibilität: Es kann eine Vielzahl von Tensoroperationen behandeln, ohne explizit umzugestalten oder Arrays zu transponieren
3. Effizienz: Viele Bibliotheken optimieren die Einsum -Operationen intern und führen möglicherweise zu einer besseren Leistung.