A suma de Einstein

Operacións de tensores en Python
técnicas de suma de Einstein
exemplos de fluxo numpy e tensor
A suma de Einstein cover image

A notación de suma de Einstein é unha forma concisa e poderosa de representar operacións de tensores, que se usa a miúdo en física e aprendizaxe automática. Permítenos escribir cálculos complexos sobre tensores de forma compacta. Cubriremos os conceptos básicos sobre a suma de Einstein, como usalo en Python con Numpy e Tensorflow e proporcionaremos exemplos para ilustrar o seu uso.

Conceptos básicos da suma de Einstein

A notación de suma de Einstein (Einsum) baséase na idea de sumar índices repetidos en expresións tensoriais. Baséase nas dúas seguintes regras:

1. Suma sobre índices repetidos: Se un índice aparece dúas veces nun termo, sumarase sobre

2. Índices libres: Os índices que aparecen unha soa vez son índices libres e representan os eixes do tensor de saída

Ilustremos isto co exemplo de multiplicar dúas matrices A e B: a matriz C resultante defínese como

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

En Python, tanto as bibliotecas Numpy como Tensorflow proporcionan unha función 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]]

No exemplo anterior, ij,jk->ik é a cadea einsum:

ij representa os índices da matriz A

jk representa os índices da matriz B

->ik especifica os índices da matriz de saída C

A operación suma sobre o índice j

O mesmo código en Tensorflow parecería

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)

Máis exemplos

Produto interno dos vectores

O produto interno (produto puntual) de dous vectores a e b defínese como

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

Produto exterior dos vectores

O produto exterior de dous vectores a e b vén dado por:

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

Transposición dunha matriz

A transposición dunha matriz A pódese obter intercambiando os seus índices

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

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

Rastro dunha matriz

A traza dunha matriz A é a suma dos seus elementos diagonais:

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


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

print(trace)
# Output: 5.0

Multiplicación matricial por lotes

Einsum é particularmente útil para operacións por lotes. Supoñamos que temos un lote de matrices A e B e queremos multiplicar as matrices correspondentes no lote:


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)

Aquí, b representa a dimensión do lote.

Vantaxes da notación Einsum

1. Concisión: A notación Einsum é compacta e pode representar operacións complexas de forma sucinta

2. Flexibilidade: Pode xestionar unha gran variedade de operacións de tensores sen modificar ou transpoñer matrices de forma explícita.

3. Eficiencia: Moitas bibliotecas optimizan as operacións de einsum internamente, o que pode levar a un mellor rendemento.


Career Services background pattern

Servizos de Carreira

Contact Section background image

Mantémonos en contacto

Code Labs Academy © 2025 Todos os dereitos reservados.