Einsteinov seštevek

Tenzorske operacije v Pythonu
Einsteinove tehnike seštevanja
primeri Numpy in Tensor Flow
Einsteinov seštevek cover image

Zapis Einsteinovega seštevka je jedrnat in zmogljiv način za predstavitev tenzorskih operacij, ki se pogosto uporablja v fiziki in strojnem učenju. Omogoča nam pisanje kompleksnih izračunov na tenzorjih v kompaktni obliki. Obravnavali bomo osnove Einsteinovega seštevanja, kako ga uporabljati v Pythonu z Numpy in Tensorflow ter podali primere za ponazoritev njegove uporabe.

Osnove Einsteinovega seštevanja

Einsteinov zapis seštevanja (Einsum) temelji na ideji seštevanja ponavljajočih se indeksov v tenzorskih izrazih. Temelji na naslednjih dveh pravilih:

1. Seštevanje ponavljajočih se indeksov: Če se indeks pojavi dvakrat v izrazu, se sešteje

2. Prosti indeksi: Indeksi, ki se pojavijo samo enkrat, so prosti indeksi in predstavljajo osi izhodnega tenzorja

Ponazorimo to s primerom množenja dveh matrik A in B: nastala matrika C je definirana kot

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

V Pythonu tako knjižnici Numpy kot Tensorflow zagotavljata funkcijo 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]]

V zgornjem primeru je ij,jk->ik niz einsum:

ij predstavlja indekse matrike A

jk predstavlja indekse matrike B

->ik podaja indekse izhodne matrike C

Operacija sešteje nad indeksom j

Ista koda v Tensorflow bi izgledala takole

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)

Več primerov

Notranji produkt vektorjev

Notranji produkt (pikasti produkt) dveh vektorjev a in b je definiran kot

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

Zunanji produkt vektorjev

Zunanji produkt dveh vektorjev a in b je podan z:

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

Transponiranje matrike

Transpozicijo matrike A lahko dobimo z zamenjavo njenih indeksov

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

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

Sled matrice

Sled matrike A je vsota njenih diagonalnih elementov:

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


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

print(trace)
# Output: 5.0

Paketno množenje matrik

Einsum je še posebej uporaben za paketne operacije. Recimo, da imamo paket matrik A in B in želimo pomnožiti ustrezne matrike v paketu:


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)

Tu b predstavlja dimenzijo serije.

Prednosti zapisa Einsum

1. Jedrnatost: Zapis Einsum je kompakten in lahko jedrnato predstavlja kompleksne operacije

2. Fleksibilnost: Obvladuje najrazličnejše tenzorske operacije brez eksplicitnega preoblikovanja ali prenosa nizov

3. Učinkovitost: Številne knjižnice interno optimizirajo operacije einsum, kar lahko vodi do boljše učinkovitosti.


Career Services background pattern

Karierne storitve

Contact Section background image

Ostanimo v stiku

Code Labs Academy © 2025 Vse pravice pridržane.