Dasar-dasar

Aljabar Linier - Perlengkapan Bertahan Hidup untuk Pembelajaran Mesin

Panduan referensi singkat tentang konsep paling umum dengan contoh di NumPy

Aljabar linier sering dianggap sebagai ‘matematika data’ dan salah satu pilar dasar pembelajaran mesin. Namun, ini adalah lahan yang luas untuk ditutupi dan menyimpan bahaya terjatuh ke dalam lubang kelinci terlalu cepat.

Pada bagian berikut, kita akan membahas beberapa konsep aljabar linier paling umum yang relevan dengan pembelajaran mesin untuk membangun intuisi yang kuat dan landasan yang kokoh. Kami tidak hanya akan membahas teori yang mendasarinya tetapi juga mempelajari cara mengimplementasikan beberapa komputasi dengan python dengan menggunakan NumPy.

Penafian: Artikel dan topik yang dibahas, bertujuan semata-mata untuk memberikan pedoman umum — referensi singkat — tentang konsep yang relevan dengan pembelajaran mesin. Oleh karena itu, teori terkadang hanya dijelaskan secara singkat dan beberapa konsep telah diabaikan sama sekali. Jika perlu, kami selalu dapat mendalami lebih dalam, menggunakan artikel ini sebagai peta jalan topik yang akan dibahas.

Objek Matematika

Skalar

Skalar hanyalah sebuah bilangan tunggal. Disebut demikian karena merenggangkan atau menskalakan, vektor, atau matriks tanpa mengubah arahnya.

Kita dapat merepresentasikan skalar dengan variabel sederhana dengan python.

vektor

Secara geometris, kita dapat menganggap vektor sebagai garis, yang ditentukan oleh besaran (panjang) dan arah. Namun definisi vektor tidak mencakup posisi awal dan akhir.

Sebuah vektor v=[1, 2], misalnya, hanya memberi tahu kita bahwa ia bergerak satu satuan pada dimensi pertama dan dua satuan pada dimensi kedua. Berdasarkan konvensi, kita paling sering menganggap sebuah vektor berada pada posisi standar — ini berarti ekornya terletak di titik asal [0, 0].

Kita juga dapat menganggap vektor sebagai deretan angka. Berpikir seperti ini memungkinkan kita untuk merepresentasikan vektor di NumPy seperti berikut:

Matriks

Matriks adalah susunan bilangan 2 dimensi. Secara sederhana, kita juga dapat membayangkan matriks sebagai sekumpulan vektor kolom yang berdiri bersebelahan.

Misalkan contoh matriks (A) kita berisi bilangan bernilai real dan kita ingin mendeskripsikan bentuknya. Kita dapat melakukannya dengan cara berikut:

Dimana mmendefinisikan tinggi (baris) suatu matriks dan nmenunjukkan lebar (kolom) suatu matriks. Dalam contoh kita, mdan nsama dengan tiga, maka kita mempunyai matriks berukuran 3 x 3.

Kita dapat mendefinisikan matriks dengan beberapa cara menggunakan NumPy, beberapa metode yang berguna dapat dilihat pada kode di bawah ini. Kita juga dapat mencetak dimensi matriks dengan menggunakan numpy.shape(a)

Catatan: Matriks dalam dimensi yang lebih tinggi dengan jumlah sumbu yang bervariasi disebut tensor.

Matriks dapat digunakan dengan berbagai cara, beberapa di antaranya adalah:

  1. Representasi transformasi linier
  2. Representasi sistem persamaan
  3. Menyimpan dan merepresentasikan data (pengamatan x fitur)
  4. Menyimpan kernel yang digunakan misalnya dalam konvolusi

Transpos

Konsep operasi transpose dapat dianggap sebagai berikut: menukar baris dengan kolom dan sebaliknya.

Saat kita mengubah urutan vektor kolom, kita mendapatkan vektor baris. Jika kita melakukan transposisi matriks, kita mendapatkan bayangan cermin melintasi diagonal utama.

Mari kita visualisasikan beberapa contoh untuk mendapatkan pemahaman yang lebih baik.

Operasi transpos mudah diterapkan dalam kode.

Penambahan Matriks

Penjumlahan matriks cukup sederhana, pada dasarnya kita hanya perlu menjumlahkan atau mengurangkan setiap elemen yang bersesuaian pada kedua matriks. Kita juga dapat menyebutnya sebagai operasi berdasarkan elemen. Namun satu hal yang harus kita ingat adalah kedua matriks harus mempunyai bentuk yang sama.

Catatan: Kita juga dapat menjumlahkan dua vektor — konsepnya tetap sama seperti penjumlahan matriks.

Melakukan penjumlahan matriks di NumPy dapat dilakukan dengan menggunakan operator aritmatika dasar atau fungsi numpy.add(a,b).

Kita juga dapat menambah atau mengurangi satu skalar ke matriks. Skalar hanya akan ditambahkan berdasarkan elemen.

Dalam beberapa kasus, kami mengizinkan penjumlahan matriks-vektor meskipun kedua bentuknya tidak persis sama. Dengan demikian, vektor akan ditambahkan ke setiap baris matriks, dengan penyalinan implisit atau penyiaran.

Catatan: Panjang vektor harus sama dengan jumlah kolom dalam matriks. Jika tidak maka tidak dapat disiarkan.

Perkalian Matriks dan Vektor

Sekarang, kita sampai pada salah satu operasi paling penting, bahkan paling penting: perkalian dua matriks.

Sebelum mendalami detail komputasinya, mari kita kenali beberapa properti yang berguna:

Perkalian matriks bersifat distributif (1), asosiatif (2),dan tidak komutatif (3):

Agar perkalian matriks menjadi operasi yang valid, 'dimensi dalam' (n) harus cocok. Matriks yang dihasilkan akan ditentukan oleh 'dimensi luar' (m, p).

Mari kita pikirkan sebuah contoh untuk memahami hal ini dengan lebih baik.

Matriks (A) didefinisikan oleh suatu bentuk (2 x 3), sedangkan matriks (B) berisi 3 baris dan 2 kolom, sehingga disebut bentuk (3 x 2). Karena 'dimensi dalam' cocok, perkalian matriks ditentukan— hasilnya adalah matriks 2 kali 2.

Sekarang setelah kita mengetahui beberapa sifat dasar dan kapan perkalian matriks valid— kita masih perlu mengetahui cara melakukan penghitungan.

Pada dasarnya kita dapat menganggap perkalian matriks sebagai perkalian titik antara vektor baris matriks kiri dan vektor kolom matriks kanan. Kita dapat memvisualisasikan mekanismenya seperti berikut:

Mari kita kerjakan contoh numerik untuk memperluas pemahaman kita.

Catatan: Perkalian matriks tidak dilakukan berdasarkan elemen. Operasi ini disebut “perkalian Hadamard” yang sering dilambangkan dengan A ⨀ B.

Perkalian matriks dapat dilakukan dengan berbagai cara dengan fungsi NumPy bawaan seperti yang dapat kita lihat pada contoh kode di bawah.

Perkalian matriks-vektor juga didefinisikan dan mengikuti konsep yang sama, memungkinkan kita untuk merepresentasikan sistem persamaan dengan cara yang lebih ringkas.

Ambil contoh persamaan berikut

yang dapat ditulis ulang sebagai beberapa persamaan tetapi kurang padat dan elegan.

Matriks Invers dan Identitas

Invers matriks memungkinkan kita menyelesaikan persamaan Ax = b secara analitis untuk x. Tetapi pertama-tama, kita perlu mengetahui apa itu matriks identitas.

Matriks identitas tidak mengubah vektor atau matriks dengan perkalian. Elemen pada diagonal utama hanya bernilai 1, sedangkan elemen di luar diagonal hanya diberi angka 0. Selain itu, matriks identitas selalu berbentuk persegi (MxM).

Memvisualisasikan matriks identitas 2 kali 2, kita mendapatkan yang berikut:

Sebaliknya, invers matriks adalah matriks yang menghasilkan matriks identitas jika dikalikan dengan matriks aslinya.

Karena pembagian matriks tidak ada, sekarang kita dapat menggunakan invers matriks untuk menyelesaikan persamaan x.

Catatan: Kita hanya dapat menggunakan invers matriks jika sudah didefinisikan. Agar suatu matriks mempunyai invers, matriks tersebut harus berbentuk persegi dan berpangkat penuh.

Kita dapat memanfaatkan fungsi bawaan NumPy untuk membuat matriks identitas dengan ukuran berapa pun dan menghitung invers matriks.

Ketergantungan dan Rentang Linier

Pada bagian sebelumnya, kita menghitung invers matriks untuk menyelesaikan Ax=b untuk x.

Agar invers matriks dapat terdefinisi, harus terdapat tepat satu solusi untuk setiap b. Namun, ada kemungkinan persamaan tersebut tidak memiliki satu pun atau banyak solusi yang terdefinisi.

Jika kita membayangkan kolom-kolom matriks (A) sebagai arah yang berbeda dalam ruang, kita dapat mengetahui berapa banyak cara untuk mencapai b. Vektor (x) dalam contoh kita menentukan seberapa jauh kita harus melakukan perjalanan dalam setiap arah tersebut.

Rentang suatu himpunan vektor — kolom matriks (A) — mendefinisikan semua titik yang dapat diperoleh dengan kombinasi linier Ax. Oleh karena itu menanyakan apakah Ax=b mempunyai solusi, pada dasarnya sama dengan menanyakan apakah bterletak dalam rentang tersebut. Subruang yang direntang oleh vektor-vektor disebut ruang kolom.

Sekarang, bayangkan salah satu vektor merupakan kombinasi linier dari vektor lainnya, sehingga membentuk satu garis. Subruang yang terbentang kini direduksi menjadi 1 dimensi dan Ax=b hanya memiliki solusi jika b terletak tepat pada garis tersebut. Jika b tidak berada pada jalur tersebut, kami tidak mempunyai cara untuk mencapainya.

Suatu himpunan vektor bersifat bergantung linier jika setidaknya satu vektor dalam himpunan tersebut dapat dinyatakan sebagai kombinasi linier dari vektor-vektor lainnya — dan inilah yang kita dapatkan dalam contoh kita.

Sebaliknya, independensi linier adalah kebalikannya — tidak ada vektor yang dapat dinyatakan dengan kombinasi linier dari vektor lainnya.

Norma

Secara sederhana, norma mengukur ukuran atau panjang suatu vektor. Secara lebih formal, norma dapat diartikan sebagai fungsi yang memetakan vektor ke nilai non-negatif.

Salah satu norma yang umum digunakan adalah norma euclidean atau ℓ2:

Contoh norma berguna lainnya adalah norma ℓ1, norma ℓ∞, atau norma Frobenius.

Dalam kode kita dapat menggunakan fungsi numpy.linalg.norm() dan menentukan urutan norma melalui parameter ord=None

Catatan: Secara default, kita akan menghitung norma Frobenius untuk matriks dan norma ℓ2 untuk vektor.

Matriks dan Vektor Khusus

Beberapa matriks mempunyai keistimewaan dalam hal elemen atau bentuknya dan oleh karena itu sangat berguna.

Matriks diagonal hanya berisi angka nol, kecuali elemen-elemen yang melintasi diagonal utama.

Kita telah menemukan matriks diagonal ketika kita mempelajari tentang matriks identitas.

Matriks diagonal berguna karena efisien secara komputasi. Misalnya, untuk menghitung invers, kita hanya perlu menghitung kebalikan diagonal utama.

Kita dapat membuat matriks diagonal dengan menentukan vektor dan cukup menerapkan fungsi numpy.diag(v)

Artinya, matriks simetris adalah matriks apa pun yang sama dengan transposnya sendiri

Kita dapat memikirkan contoh matriks, yang terlihat seperti berikut:

Misalkan kita mempunyai vektor v dan vektor w. Sekarang bayangkan kedua vektor berjalan dalam arah yang berbeda — faktanya, keduanya tegak lurus, dengan sudut 90°. Vektor-vektor tersebut juga dapat disebut ortogonal— jika kedua vektor mempunyai norma satuan, panjangnya satu, maka disebut ortonormal.

Sebaliknya, matriks ortogonal adalah matriks persegi yang baris dan kolomnya saling ortonormal. Ini menyiratkan dua properti yang berguna

Matriks ortogonal menarik karena memungkinkan kita menghitung invers dengan sangat murah dan efisien karena ditentukan oleh transposnya.

Dekomposisi eigen

Mengurai atau secara sederhana, memecah suatu objek matematika, terkadang memungkinkan kita untuk lebih memahaminya dengan mengungkapkan sifat-sifat yang tidak jelas.

Dekomposisi eigen menguraikan matriks menjadi nilai eigen dan vektor eigen. Vektor eigen, karena invarian terhadap rotasi, menunjukkan kepada kita arah matriks sedangkan nilai eigen adalah faktor penskalaan, yang menggambarkan besaran vektor eigen.



Kita dapat mengambil nilai eigen dan vektor eigen dengan bantuan fungsi NumPy bawaan. Untuk merekonstruksi matriks asli, kita hanya perlu menghitung hasil kali vektor eigen, nilai eigen yang didiagonalisasi, dan invers dari vektor eigen.

Dekomposisi eigen berguna karena merupakan elemen kunci dalam analisis komponen utama.



Dekomposisi Nilai Tunggal

Dekomposisi nilai tunggal (SVD) dan dekomposisi eigend berkaitan erat karena dalam kedua kasus kita menguraikan atau memfaktorkan suatu matriks.

Namun SVD lebih dapat diterapkan secara umum. Misalnya, dekomposisi eigend tidak terdefinisi jika suatu matriks tidak berbentuk persegi, sedangkan SVD masih dapat diterapkan.

Dekomposisi nilai tunggal memfaktorkan suatu matriks menjadi nilai tunggal dan vektor tunggal. Saat diterapkan, kami menguraikan satu matriks menjadi produk dari tiga matriks khusus.

Matriks (U) dan (V) keduanya ortogonal dan masing-masing memuat vektor tunggal kiri dan vektor tunggal kanan. Matriks (D) adalah matriks diagonal yang memuat nilai-nilai singular pada diagonal utama.

SVD berguna karena memungkinkan kita menerapkan dekomposisi matriks secara lebih umum dibandingkan dekomposisi eigend dan juga memungkinkan kita menggeneralisasi sebagian inversi matriks ke matriks non-persegi.

Kita dapat mengandalkan penggunaan numpy.linalg.svd(a) untuk menerapkan SVD.

Kebalikan Semu Moore-Penrose

Invers matriks tidak terdefinisi untuk matriks non-persegi. Namun, Pseudoinverse Moore-Penrose memungkinkan kita menghitung atau memperkirakan invers untuk matriks tinggi dan lebar.

Algoritme praktis mengandalkan SVD saat menghitung pseudoinverse.

Persamaan di atas seharusnya terlihat familiar karena mengambil tiga matriks yang sama dengan SVD - pseudoinvers dari matriks diagonal (D) diperoleh dengan menghitung kebalikan dari elemen bukan nol dan mengambil transpos dari matriks yang dihasilkan.

Dalam kode, kita cukup menggunakan fungsi NumPy untuk menghitung pseudoinverse. Karena perkalian matriks dengan invers akan menghasilkan matriks identitas, kita dapat menggunakan fakta ini untuk memeriksa hasil kita.

Operator Jejak

Jumlah semua entri diagonal suatu matriks dapat dihitung dengan operator jejak.

Operator jejak berguna karena memungkinkan notasi yang lebih sederhana. Norma Frobenius misalnya dapat dinyatakan dengan menggunakan operator jejak sebagai berikut:

Misalkan kita mempunyai matriks identitas berukuran 5 kali 5. Jumlah semua elemen diagonal harus sama dengan 5 dan dapat dihitung menggunakan NumPy seperti yang kita lihat pada contoh kode di bawah.

Penentu

Penentu pada dasarnya adalah fungsi yang memetakan matriks ke skalar dan ditentukan oleh produk dari semua nilai eigen.

Geometris juga dapat diartikan sebagai luas atau volume masing-masing. Secara sederhana, determinan memberikan ukuran seberapa besar perkalian suatu matriks memperluas atau memperkecil ruang.



Penentunya dapat dihitung dengan menggunakan fungsi NumPy bawaan numpy.linalg.det(a)

Kesimpulan

Dalam artikel ini, kami mencoba membahas banyak hal. Kami menguraikan secara singkat teori di balik beberapa konsep aljabar linier paling umum yang relevan dengan pembelajaran mesin. Selain itu, kami telah mengimplementasikan sebagian besar konsep dalam python dengan bantuan NumPy.

Tujuan kami adalah memberikan pedoman umum dan gambaran singkat tentang topik-topik penting untuk dijelajahi. Oleh karena itu, kami harus sepenuhnya menghindari atau hanya dapat menggores permukaan beberapa aspek aljabar linier.

Namun demikian, artikel yang ada harus memberi kita sarana untuk membangun intuisi pertama dan memiliki peta jalan topik, yang dapat kita jelajahi lebih jauh bila diperlukan.

Memahami dasar-dasar aljabar linier dan memiliki intuisi yang baik akan terbukti sangat berharga ketika kita mempelajari, menerapkan, dan menerapkan algoritme pembelajaran mesin dalam praktik.

Terima kasih telah membaca! Pastikan untuk tetap terhubung & ikuti saya di sini di Medium, Kaggle, atau cukup ucapkan 'Hai' di LinkedIn

Menikmati artikelnya? Menjadi Medium member dan terus belajar tanpa batas. Saya akan menerima sebagian dari biaya keanggotaan Anda jika Anda menggunakan tautan berikut, tanpa biaya tambahan untuk Anda.



Referensi / Materi Lebih Lanjut:

  • Pembelajaran Mendalam (Ian J. Goodfellow, Yoshua Bengio dan Aaron Courville), Bab 2, MIT Press, 2016.
  • Mike X Cohen, PhD. Aljabar Linier: Teori, Intuisi, Kode.