Suma Einstein

Operații cu tensori în Python
tehnici de însumare Einstein
exemple de flux Numpy și tensor
Suma Einstein cover image

Notația Einstein Summation este o modalitate concisă și puternică de a reprezenta operațiile tensorilor, adesea folosită în fizică și învățare automată. Ne permite să scriem calcule complexe pe tensori într-o formă compactă. Vom acoperi elementele de bază despre însumarea Einstein, cum să o folosim în Python cu Numpy și Tensorflow și vom oferi exemple pentru a ilustra utilizarea acesteia.

Bazele însumării Einstein

Notația Einstein Summation (Einsum) se bazează pe ideea însumării indicilor repeți în expresii tensorale. Se bazează pe următoarele două reguli:

1. Însumarea peste indici repeți: Dacă un indice apare de două ori într-un termen, acesta este însumat peste

2. Indicii liberi: Indicii care apar o singură dată sunt indici liberi și reprezintă axele tensorului de ieșire

Să ilustrăm acest lucru cu exemplul de înmulțire a două matrice A și B: matricea rezultată C este definită ca

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

În Python, atât bibliotecile Numpy, cât și Tensorflow oferă o funcție einsum.

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]]

În exemplul de mai sus, ij,jk->ik este șirul einsum:

ij reprezintă indicii matricei A

jk reprezintă indicii matricei B

->ik specifică indicii matricei de ieșire C

Operația însumează peste indicele j

Același cod în Tensorflow ar arăta

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)

Mai multe exemple

Produsul interior al vectorilor

Produsul interior (produsul punctual) a doi vectori a și b este definit ca

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

Produsul exterior al vectorilor

Produsul exterior a doi vectori a și b este dat de:

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]]

Transpunerea unei matrice

Transpunerea unei matrice A poate fi obținută prin schimbarea indicilor acesteia

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

Urma unei matrice

Urma unei matrice A este suma elementelor diagonale ale acesteia:

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


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

Înmulțirea matricei în loturi

Einsum este deosebit de util pentru operațiunile pe lot. Să presupunem că avem un lot de matrice A și B și dorim să înmulțim matricele corespunzătoare din lot:


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)

Aici, b reprezintă dimensiunea lotului.

Avantajele notației Einsum

1. Concizie: Notația Einsum este compactă și poate reprezenta succint operații complexe

2. Flexibilitate: Poate gestiona o mare varietate de operații cu tensori fără a remodela sau transpune în mod explicit tablourile

3. Eficiență: Multe biblioteci optimizează operațiunile einsum intern, ceea ce poate duce la o performanță mai bună.


Career Services background pattern

Servicii de carieră

Contact Section background image

Să rămânem în legătură

Code Labs Academy © 2025 Toate drepturile rezervate.