Эйнштейндин жыйындысы

Pythonдогу тензордук операциялар
Эйнштейндин суммалоо ыкмалары
Numpy жана тензордук агым мисалдары
Эйнштейндин жыйындысы cover image

Эйнштейндин Суммация нотациясы физикада жана машина үйрөнүүдө көбүнчө колдонулган тензордук операцияларды көрсөтүүнүн кыска жана күчтүү жолу. Ал тензорлор боюнча татаал эсептөөлөрдү компакттуу түрдө жазууга мүмкүндүк берет. Биз Эйнштейндин жыйындысы боюнча негиздер, аны Pythonдо Numpy жана Tensorflow менен кантип колдонуу керектигин карап чыгабыз жана анын колдонулушун көрсөтүү үчүн мисалдарды келтиребиз.

Эйнштейндин жыйындысынын негиздери

Эйнштейндин Суммация нотациясы (Einsum) тензордук туюнтмалардагы кайталануучу индекстердин суммасын кошуу идеясына негизделген. Ал төмөнкү эки эрежеге негизделген:

1. Кайталануучу индекстер боюнча суммалоо: Эгерде индекс бир мөөнөттө эки жолу чыкса, анда ал жыйынтыкталат.

2. Эркин индекстер: Бир гана жолу пайда болгон индекстер эркин индекстер жана чыгаруу тензорунун окторун билдирет

Келгиле, муну эки А жана В матрицаларын көбөйтүүнүн мисалы менен түшүндүрөлү: натыйжада С матрицасы төмөнкүчө аныкталат:

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 А матрицасынын индекстерин билдирет

jk В матрицасынын индекстерин билдирет

->ik чыгуучу С матрицанын индекстерин аныктайт

Операциянын суммасы 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

Векторлордун тышкы продуктусу

Эки а жана 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_transpose = np.einsum('ij->ji', A)

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

Матрицанын изи

А матрицасынын изи анын диагоналдык элементтеринин суммасы:

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


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

print(trace)
# Output: 5.0

Партиялык матрицаны көбөйтүү

Einsum партиялык операциялар үчүн өзгөчө пайдалуу. Бизде А жана В матрицаларынын партиясы бар дейли, жана биз партиядагы тиешелүү матрицаларды көбөйтүүнү каалайбыз:


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" партия өлчөмүн билдирет.

Einsum нотасынын артыкчылыктары

1. Кыскасы: Einsum нотасы компакттуу жана татаал операцияларды кыскача көрсөтө алат

2. Ийкемдүүлүк: Ал массивдерди ачык түрдө өзгөртпөстөн же транспозиясыз эле ар кандай тензордук операцияларды аткара алат

3. Натыйжалуулугу: Көптөгөн китепканалар einsum операцияларын ички оптималдаштырып, жакшыраак иштөөгө алып келиши мүмкүн.


Career Services background pattern

Карьера кызматтары

Contact Section background image

байланышта бололу

Code Labs Academy © 2025 Бардык укуктар корголгон.