Persetujuan dan einsum Einstein

Anehnya, di segmen bahasa Rusia di Internet, hampir tidak ada materi yang menjelaskan persetujuan penjumlahan Einstein dalam bahasa yang dapat dimengerti . Tidak kalah mengejutkan bahwa ada lebih sedikit materi untuk memahami cara kerja fungsi einsum di Internet berbahasa Rusia. Dalam bahasa Inggris ada jawaban yang agak rinci tentang pekerjaan einsum pada stack overflow, dan dalam bahasa Rusia hanya ada beberapa situs yang menyediakan terjemahan kurva untuk jawaban ini. Saya ingin memperbaiki masalah ini dengan kurangnya materi, dan mengundang semua orang yang tertarik untuk membacanya!






Membahas Perjanjian Einstein

Pertama-tama, saya ingin mencatat bahwa persetujuan Einstein paling sering digunakan dalam analisis tensor dan aplikasinya, oleh karena itu, selanjutnya dalam artikel ini akan ada beberapa referensi tentang tensor.

Ketika Anda baru mulai bekerja dengan tensor, Anda mungkin bingung bahwa selain subskrip biasa, superskrip juga digunakan, yang pada awalnya umumnya dapat diambil untuk eksponen. Contoh:

"a dengan superskrip i" akan ditulis sebagai a ^ i, dan "a dalam kotak dengan superskrip i" akan ditulis (a ^ i) ^ 2. Ini mungkin membingungkan dan tidak nyaman pada awalnya, tetapi Anda dapat terbiasa seiring waktu.





Perjanjian: selanjutnya dalam artikel, objek dari tipe a_ix_iatau a_ix ^ isaya akan menyebutnya istilah .





Tentang apa kesepakatan Einstein?

Kesepakatan Einstein dirancang untuk mengurangi jumlah tanda penjumlahan dalam sebuah ekspresi. Ada tiga aturan sederhana yang menentukan seberapa benar sebuah ekspresi dituliskan dalam notasi Einstein.





Aturan # 1: Penjumlahan dilakukan pada semua indeks yang diulangi dua kali dalam satu suku.



Contoh: Pertimbangkan ekspresi seperti ini:





\ sum_ {i = 1} ^ 3 a_ix_i = a_1x_1 + a_2x_2 + a_3x_3

Menggunakan konvensi Einstein, ekspresi ini dapat ditulis ulang seperti ini:





a_ix_i \ text {atau} a_ix ^ i

Jadi, kita menghilangkan tanda penjumlahan, dan hanya menulis satu suku. Perhatikan bahwa dalam istilah ini indeks i diulang dua kali, yang berarti, sesuai dengan aturan pertama, kita memahami bahwa penjumlahan dilakukan pada indeks i, atau lebih tepatnya, pada semua kemungkinan nilai yang diambil indeks ini.







: A \ in \ mathbb {R} ^ {m \ times n} v \ in \ mathbb {R} ^ {n}. b \ in \ mathbb {R} ^ {m}. :





b_i = \ jumlah \ batas_ {j = 1} ^ n A_ {ij} v_j, ~ i = 1, \ ldots, m

:





b_i = A_ {ij} v_ {j} = A_ {ij} v ^ {j}

, i , j , , j.





1. , , .





2. , .





, , ,





  1. .





  2. , .





, Python:





for i in range(M):
    for j in range(N):
        b[i] += A[i, j] * v[j]
      
      



, , . j , i โ€“ . . j .





โ„– 2. .





, a_ {ij} b_ {ij}, a_ {ii} b_ {ij} a_ {ij} b_ {jj}, , .

:





a_i ^ iโ€“ i , .. ;





a_i ^ {jj}โ€“ i , j โ€“ ;





a_ {ii} ^ {jj}โ€“ i, j ;





a_ {ij} ^ {ij}โ€“ i, j ;





a_ {ii} ^ {ij}โ€“ ( i );





, , , . :





a_ {ij} b_ {i} + a_ {ji} b_ {j}

, , . , , , i 3 , j, , , ( ), , .





โ„– 3. , .





:





b_i = A_ {ij} v_ {j}โ€“ , i , ;





a_i = A_ {ki} B_ {kj} x_ {j} + C_ {ik} u_ {k}โ€“ . : k j , , , i , , . k , i โ€“ , , k โ€“ , i โ€“ . i , , . : i , , 3 .





, :





x_i = A_ {ij}โ€“ i , i j;





x_j = A_ {ik} u_kโ€“ j, i. ;





x_i = A_ {ik} u_k + c_jโ€“ i, i, j;





:

SEBUAH โ€“ . , :





A_ {i_1i_2i_3i_4i_5} = \ sum_ {j_4 = 1} ^ {R_4} \ sum_ {j_3 = 1} ^ {R_3} \ sum_ {j_2 = 1} ^ {R_2} \ sum_ {j_1 = 1} ^ {R_1} G ^ {(1)} _ {i_1j_1} G ^ {(2)} _ {j_1i_2j_2} G ^ {(3)} _ {j_2i_3j_3} G ^ {(4)} _ {j_3i_4j_4} G ^ {(5)} _ {j_4i_5}

, G ^ {(k)}, R_i. โ€“ . , .

, i_1, i_2, i_3, i_4, i_5, , j_1, j_2, j_3, j_4. , , , , . , G ^ {(k)}, (k). , , . :





A_ {i_1i_2i_3i_4i_5} = \ kiri (G ^ {(1)} \ kanan) _ {i_1j_1} \ kiri (G ^ {(2)} \ kanan) _ {i_2j_2} ^ {j_1} \ kiri (G ^ {( 3)} \ kanan) _ {i_3j_3} ^ {j_2} \ kiri (G ^ {(4)} \ kanan) _ {i_4j_4} ^ {j_3} \ kiri (G ^ {(5)} \ kanan) _ { i_5} ^ {j_4}

, !





einsum

einsum , Python (NumPy, TensorFlow, PyTorch). , , ( , ), , einsum . NumPy. einsum . , , , , .





: A \ dalam \ mathbb {R} ^ {3 \ times5}, B \ dalam \ mathbb {R} ^ {5 \ times2} โ€“ , . M \ in \ mathbb {R} ^ {3 \ times2}, , :





M_ {ij} = \ sum_ {k = 1} ^ {5} A_ {ik} B_ {kj} = A_ {ik} B_ {kj}

. , :





M = np.zeros((3, 2))
for i in range(3):
    for j in range(2):
        for k in range(5):
            M[i, j] += A[i, k] * B[k, j]
      
      



, einsum :





M = np.einsum("ik,kj->ij", A, B)
      
      



, . einsum : , . :





"{, },{, }->{, }"





einsum :





  • ( ), ;





  • , ;





  • 3 ;





, einsum , , , . , , , , einsum . , einsum.





, einsum:





einsum,

1. :





vector = np.array([1, 2, 3, 4, 5])
result = np.einsum("i->", vector)
print(result)
      
      



Output

15





2. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->", matrix)
print(result)
      
      



Output

21





3. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->j", matrix)
print(result)
      
      



Output

[9, 12]





4. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->i", matrix)
print(result)
      
      



Output

[3, 7, 11]





5. ( , , , ):





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->ji", matrix)
print(result)
      
      



Output

[[1, 3, 5], [2, 4, 6]]





6. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
vector = np.array([[1, 2]])
result = np.einsum("ij,kj->ik", matrix, vector)
print(result)
      
      



, 1 \ kali 2, , . einsum , , , .





Output

[[5], [11], [17]]





7. :





matrix1 = np.array([[1, 2], [3, 4], [5, 6]])
matrix2 = np.array([[1, 0], [0, 1]])
result = np.einsum("ik,kj->ij", matrix1, matrix2)
print(result)
      
      



Output

[[1, 2], [3, 4], [5, 6]]





8. :





vector1 = np.array([[1, 2, 3]])
vector2 = np.array([[1, 1, 1]])
result = np.einsum("ik,jk->", vector1, vector2)
print(result)
      
      



Output

6





9. :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.einsum("ii->", matrix1)
print(result)
      
      



Output

15





10. () :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
result = np.einsum("ij,ij->ij", matrix1, matrix2)
print(result)
      
      



, , : , einsum โ€“ :





result = np.zeros(matrix1.shape, dtype="int32")
for i in range(result.shape[0]):
    for j in range(result.shape[1]):
        result[i, j] += matrix1[i, j] * matrix2[i, j]
print(result)
      
      



Output

[[1, 0, 0], [0, 5, 0], [0, 0, 9]]





11. () :





vector1 = np.array([1, 2, 3])
vector2 = np.array([1, 0, 0])
result = np.einsum("i,j->ij", vector1, vector2)
print(result)
      
      



Output

[[1, 0, 0], [2, 0, 0], [3, 0, 0]]





12. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
result = np.einsum("ijk->jki", A)
print(result)
      
      



Output

[[[0, 1, 2], [1, 2, 3]], [[1, 2, 3], [2, 3, 4]], [[2, 3, 4], [3, 4, 5]]]





13. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
U = np.array([[1, 2], [2, 3]])
result = np.einsum("ijk,nk->ijn", A, U)
print(result)
      
      



Output

[[[2, 3], [5, 8], [8, 13]], [[5, 8], [8, 13], [11. 18]], [[8, 13], [11, 18], [14, 23]]]





, einsum . , (np.dot, np.outer, np.tensordot, np.transpose, np.cumsum ..), einsum. , , , , , .





einsum ( ).





Perjanjian Einstein (dasar)





Persetujuan Einstein (bagian lanjutan)








All Articles