Підведення підсумків Ейнштейна

Тензорні операції в Python
методи сумування Ейнштейна
приклади Numpy і Tensor Flow
Підведення підсумків Ейнштейна cover image

Нотація підсумовування Ейнштейна — це стислий і потужний спосіб представлення тензорних операцій, який часто використовується у фізиці та машинному навчанні. Це дозволяє записувати складні обчислення на тензорах у компактній формі. Ми розглянемо основи підсумовування Ейнштейна, як його використовувати в Python із Numpy і Tensorflow, а також наведемо приклади, щоб проілюструвати його використання.

Основи підсумовування Ейнштейна

Нотація підсумовування Ейнштейна (Einsum) базується на ідеї підсумовування повторюваних індексів у тензорних виразах. Він базується на таких двох правилах:

1. Підсумовування за повторюваними індексами: Якщо індекс з’являється двічі в терміні, він підсумовується

2. Вільні індекси: Індекси, які з’являються лише один раз, є вільними індексами та представляють осі вихідного тензора

Проілюструємо це на прикладі множення двох матриць A і B: результуюча матриця C визначається як

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

У Python бібліотеки Numpy і Tensorflow забезпечують функцію 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]]

У наведеному вище прикладі ij,jk->ik є рядком einsum:

ij представляє індекси матриці A

jk представляє індекси матриці B

->ik визначає індекси вихідної матриці C

Операція підсумовує індекс j

Той самий код у Tensorflow виглядав би так

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)

Більше прикладів

Внутрішній добуток векторів

Скалярний добуток (скалярний добуток) двох векторів a і b визначається як

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

Зовнішній добуток векторів

Зовнішній добуток двох векторів a і b визначається як:

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

Транспонування матриці

Транспонування матриці A можна отримати, помінявши її індекси місцями

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

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

Слід матриці

Слідом матриці A є сума її діагональних елементів:

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


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

print(trace)
# Output: 5.0

Пакетне множення матриць

Einsum особливо корисний для пакетних операцій. Припустимо, у нас є набір матриць A і B, і ми хочемо помножити відповідні матриці в набору:


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)

Тут "b" означає розмір партії.

Переваги нотації Ейнсума

1. Лаконічність: Нотація Einsum є компактною та може стисло відображати складні операції

2. Гнучкість: він може обробляти широкий спектр тензорних операцій без явної зміни форми або транспонування масивів

3. Ефективність: Багато бібліотек оптимізують операції einsum внутрішньо, що потенційно може призвести до кращої продуктивності.


Career Services background pattern

Кар'єрні послуги

Contact Section background image

Давайте залишатися на зв'язку

Code Labs Academy © 2025 Всі права захищені.