Die Einstein-opsomming

Tensor-bewerkings in Python
Einstein Summation Techniques
Numpy en Tensor Flow Voorbeelde
Die Einstein-opsomming cover image

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

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

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

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

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:

Cij=aibjC_{ij} = a_{i}b_{j}

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:

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


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.


Career Services background pattern

Loopbaandienste

Contact Section background image

Kom ons bly in kontak

Code Labs Academy © 2025 Alle regte voorbehou.