Die Einstein Summation-notasie is 'n bondige en kragtige manier om tensor-bewerkings voor te stel, wat dikwels in fisika en masjienleer gebruik word. Dit stel ons in staat om komplekse berekeninge op tensors in 'n kompakte vorm te skryf. Ons sal die basiese beginsels oor Einstein-opsomming dek, hoe om dit in Python met Numpy en Tensorflow te gebruik, en voorbeelde verskaf om die gebruik daarvan te illustreer.
Basiese beginsels van Einstein-opsomming
Die Einstein Summation-notasie (Einsum) is gebaseer op die idee om oor herhaalde indekse in tensor-uitdrukkings op te som. Dit is gebaseer op die volgende twee reëls:
1. Opsomming oor herhaalde indekse: As 'n indeks twee keer in 'n kwartaal verskyn, word dit oor opgetel
2. Vrye indekse: Indekse wat slegs een keer verskyn, is vrye indekse en verteenwoordig die asse van die uitsettensor
Kom ons illustreer dit met die voorbeeld van vermenigvuldiging van twee matrikse A en B: die resulterende matriks C word gedefinieer as
In Python bied beide die Numpy- en Tensorflow-biblioteke 'n einsum-funksie.
Numpie
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]]
In die voorbeeld hierbo is ij,jk->ik
die einsum-string:
ij
verteenwoordig die indekse van matriks A
jk
verteenwoordig die indekse van matriks B
->ik
spesifiseer die indekse van die uitsetmatriks C
Die bewerking som oor die indeks j
Dieselfde kode in Tensorflow sou lyk
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)
Meer voorbeelde
Innerlike produk van vektore
Die binneproduk (puntproduk) van twee vektore a en b word gedefinieer as
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.einsum('i,i->', a, b)
print(c) # Output: 32
Buitenste produk van vektore
Die buitenste produk van twee vektore a en b word gegee deur:
C = np.einsum('i,j->ij', a, b)
print(C)
# Output
# [[4 5 6]
# [8 10 12]
# [12 15 18]]
Transponeer van 'n matriks
Die transponeer van 'n matriks A kan verkry word deur sy indekse om te ruil
A_transpose = np.einsum('ij->ji', A)
print(A_transpose)
# Output
# [[1. 3.]
# [2. 4.]]
Spoor van 'n matriks
Die spoor van 'n matriks A is die som van sy diagonale elemente:
trace = np.einsum('ii->', A)
print(trace)
# Output: 5.0
Bondelmatriksvermenigvuldiging
Einsum is veral nuttig vir bondelbewerkings. Gestel ons het 'n bondel matrikse A en B, en ons wil die ooreenstemmende matrikse in die bondel vermenigvuldig:
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 verteenwoordig b
die bondeldimensie.
Voordele van die Einsum-notasie
1. Beknoptheid: Die Einsum-notasie is kompak en kan komplekse bewerkings bondig voorstel
2. Buigsaamheid: Dit kan 'n wye verskeidenheid tensor-bewerkings hanteer sonder om skikkings eksplisiet te hervorm of te transponeer
3. Doeltreffendheid: Baie biblioteke optimaliseer die einsum-bedrywighede intern, wat moontlik tot beter werkverrigting lei.