Dekomposisi matriks

Mengurai struktur matriks dengan dekomposisi nilai eigen eig dan nilai singular svd.

Daftar isi

Dekomposisi mengurai satu matriks menjadi hasil kali matriks-matriks yang strukturnya lebih sederhana, sehingga sifat tersembunyi seperti arah tetap dan sebaran energi dapat dibaca langsung. Topik ini membahas dekomposisi nilai eigen dengan eig beserta verifikasi pasangan nilai dan vektornya, serta diagonalisasi matriks simetrik. Dekomposisi nilai singular dengan svd dibahas untuk matriks persegi panjang, lengkap dengan makna nilai singular sebagai energi dan penerapannya pada kompresi peringkat rendah sebuah matriks data. Setelah membaca topik ini, struktur sebuah matriks dapat diperiksa, diverifikasi, dan diringkas berdasarkan hasil dekomposisinya.

Nilai dan vektor eigen#

Nilai eigen menyatakan arah yang tidak berubah ketika matriks bekerja. Sebuah vektor v\mathbf{v} disebut vektor eigen dari AA dengan nilai eigen λ\lambda apabila

Av=λ v A\mathbf{v} = \lambda\,\mathbf{v}

artinya perkalian oleh AA hanya meregangkan v\mathbf{v} dengan faktor λ\lambda tanpa memutar arahnya. Pemanggilan [V, D] = eig(A) menghasilkan kedua hal sekaligus, yaitu matriks V yang kolom-kolomnya adalah vektor eigen dan matriks diagonal D yang elemen diagonalnya adalah nilai eigen. Pasangannya ketat, yaitu kolom ke-kk dari V berpasangan dengan elemen diagonal ke-kk dari D, sehingga verifikasi cukup mengalikan A dengan satu kolom lalu membandingkannya dengan hasil kali skalar kolom tersebut.

matlab Nilai dan vektor eigen matriks simetrik 2 x 2
A = [2 1; 1 2];
[V, D] = eig(A);
d = diag(D)
disp('matriks V:')
disp(V)
disp('ruas kiri, A * V(:, 1):')
disp(A * V(:, 1))
disp('ruas kanan, d(1) * V(:, 1):')
disp(d(1) * V(:, 1))
fprintf('norm(A*V - V*D) = %.2e\n', norm(A*V - V*D));
text Keluaran
d =

   1
   3

matriks V:
  -0.7071   0.7071
   0.7071   0.7071
ruas kiri, A * V(:, 1):
  -0.7071
   0.7071
ruas kanan, d(1) * V(:, 1):
  -0.7071
   0.7071
norm(A*V - V*D) = 0.00e+00

Matriks AA memiliki nilai eigen 1 dan 3 dengan vektor eigen [−0,70710,7071]\begin{bmatrix} -0{,}7071 \\ 0{,}7071 \end{bmatrix} dan [0,70710,7071]\begin{bmatrix} 0{,}7071 \\ 0{,}7071 \end{bmatrix}, yaitu arah diagonal bidang. Ruas kiri A v1A\,\mathbf{v}_1 dan ruas kanan λ1v1\lambda_1 \mathbf{v}_1 tampil identik, dan pemeriksaan serentak norm(A*V - V*D) bernilai nol membuktikan seluruh kolom terpenuhi sekaligus. Rumus Av=λvA\mathbf{v} = \lambda\mathbf{v} karena itu dapat digunakan sebagai uji mutu hasil eig pada matriks apa pun, sebagaimana sisa Ax−bA\mathbf{x} - \mathbf{b} menjadi uji mutu penyelesaian sistem.

Diagonalisasi matriks simetrik#

Matriks simetrik memenuhi A=A′A = A'. Dekomposisi eigen matriks semacam ini sangat rapi, yaitu seluruh nilai eigen merupakan bilangan riil dan seluruh vektor eigen saling tegak lurus. Kumpulan vektor eigen yang saling tegak lurus membentuk matriks ortogonal WW dengan W′W=IW' W = I, sehingga matriks simetrik dapat ditulis sebagai

A=WΛWT A = W \Lambda W^{\mathsf{T}}

dengan Λ\Lambda matriks diagonal nilai eigen. Bentuk ini disebut diagonalisasi, dan memanfaatkannya berarti membongkar AA menjadi urutan peregangan murni pada arah-arah vektor eigennya. Kedua identitas tersebut dapat diperiksa langsung dari hasil eig.

matlab Diagonalisasi matriks simetrik 3 x 3
S = [4 1 0; 1 4 1; 0 1 4];
[W, E] = eig(S);
e = diag(E)
fprintf("norm(W' * W - I)     = %.2e\n", norm(W' * W - eye(3)));
fprintf("norm(W' * S * W - E) = %.2e\n", norm(W' * S * W - E));
text Keluaran
e =

   2.5858
   4.0000
   5.4142

norm(W' * W - I)     = 1.10e-15
norm(W' * S * W - E) = 3.07e-15

Nilai eigen 2.5858, 4, dan 5.4142 adalah 4−24-\sqrt{2}, 4, dan 4+24+\sqrt{2}. Norma W' * W - I berorde 10−1510^{-15} menegaskan kolom-kolom W saling tegak lurus hingga batas pembulatan, dan norma W' * S * W - E pada orde yang sama menegaskan hasil kali tersebut memang diagonal. Angka 10−1510^{-15} ini bukan kegagalan melainkan jejak pembulatan bilangan floating point yang wajar, dan membandingkan norma selisih dengan toleransi kecil adalah cara baku memverifikasi identitas numerik.

Dekomposisi nilai singular#

Matriks persegi panjang tidak memiliki nilai eigen karena vektor masukan v\mathbf{v} dan hasil kali AvA\mathbf{v} berada pada ruang berdimensi berbeda, sehingga persamaan Av=λvA\mathbf{v} = \lambda\mathbf{v} tidak dapat dipenuhi. Peran struktural dekomposisi nilai eigen digantikan oleh dekomposisi nilai singular. Pemanggilan [U, S, V] = svd(A) untuk matriks (m×n)(m \times n) menghasilkan

A=UΣVT A = U \Sigma V^{\mathsf{T}}

dengan U matriks ortogonal (m×m)(m \times m), V matriks ortogonal (n×n)(n \times n), dan S matriks persegi panjang (m×n)(m \times n) yang hanya berisi diagonal tak negatif σ1≥σ2≥⋯≥0\sigma_1 \geq \sigma_2 \geq \cdots \geq 0 yang disebut nilai singular. Nilai singular menyatakan energi karena jumlah kuadrat seluruh elemen AA sama dengan jumlah kuadrat nilai singularnya,

∥A∥F2=σ12+σ22+⋯+σr2 \|A\|_F^2 = \sigma_1^2 + \sigma_2^2 + \cdots + \sigma_r^2

dengan ∥⋅∥F\| \cdot \|_F norma Frobenius, sehingga nilai singular terbesar menyimpan porsi energi terbesar dari matriks tersebut.

matlab svd_energi.m
% svd_energi.m: mengurai matriks persegi panjang dengan svd dan memeriksa energinya

A = [2 1;
     1 3;
     2 2;
     4 1];                                  % 4 x 2

[U, S, V] = svd(A);
s = diag(S);
disp('nilai singular:')
disp(s)
fprintf('ukuran U: %s, ukuran S: %s, ukuran V: %s\n', ...
        mat2str(size(U)), mat2str(size(S)), mat2str(size(V)));
fprintf('energi A, jumlah kuadrat elemen : %.4f\n', sum(A(:).^2));
fprintf('energi nilai singular           : %.4f\n', sum(s.^2));
fprintf("norm(A - U*S*V')                : %.2e\n", norm(A - U*S*V'));
text Keluaran
nilai singular:
   5.8248
   2.4641
ukuran U: [4 4], ukuran S: [4 2], ukuran V: [2 2]
energi A, jumlah kuadrat elemen : 40.0000
energi nilai singular           : 40.0000
norm(A - U*S*V')                : 1.72e-15

Matriks (4×2)(4 \times 2) pada contoh memiliki dua nilai singular, 5.8248 dan 2.4641, karena hanya ada paling banyak dua arah bebas pada kolomnya. Ukuran S mengikuti bentuk A sedangkan U dan V persegi, dan rekonstruksi U*S*V' mengembalikan A hingga norma selisih 10−1510^{-15}. Kedua nilai energi yang sama, yaitu 40, menegaskan hubungan norma Frobenius dengan nilai singular. Penggunaan kata energi menjadi konkret karena σ12\sigma_1^2 menyimpan sekitar 85 persen dari total kuadrat elemen matriks ini.

Kompresi peringkat rendah#

Nilai singular yang menurun tajam menyediakan cara meringkas matriks, yaitu buang suku-suku bernilai kecil dan simpan sisanya. Rekonstruksi peringkat kk menggunakan kk nilai singular teratas,

Ak=∑i=1kσi ui viT A_k = \sum_{i=1}^{k} \sigma_i\, \mathbf{u}_i\, \mathbf{v}_i^{\mathsf{T}}

yang dalam kode ditulis sebagai U(:, 1:k) * S(1:k, 1:k) * V(:, 1:k)'. Hasilnya adalah aproksimasi peringkat kk terbaik terhadap AA dalam arti norma Frobenius, sehingga error relatifnya dapat dihitung sebagai norm(A - Ak, 'fro') / norm(A, 'fro'). Matriks data yang saling berkorelasi antar kolomnya adalah kasus yang cocok karena informasinya berulang sehingga sebagian kecil nilai singular menangkap hampir seluruh isi.

Contoh berikut menggunakan matriks data (6×3)(6 \times 3) berisi catatan tiga saluran suhu. Ketiga saluran mencatat tren yang sama dengan ofset dan deviasi tetap yang berbeda. Kolom-kolom yang hampir sejajar membuat energi terpusat pada nilai singular pertama, sehingga aproksimasi peringkat satu diharapkan sudah mewakili hampir seluruh matriks.

matlab kompresi_peringkat.m
% kompresi_peringkat.m: merekonstruksi matriks data dengan sebagian nilai singular
%
% tiga saluran pengukuran suhu mencatat tren yang sama tiap menit,
% sehingga matriks data mendekati peringkat rendah

waktu  = (0:5)';
sinyal = 20 + 2*waktu;                      % tren suhu dasar
A = [sinyal, sinyal + 0.5, sinyal - 0.5];   % tiga saluran dengan ofset
A = A + [ 0.0  0.2 -0.1;
         -0.1  0.0  0.2;
          0.1 -0.2  0.0;
          0.2  0.1 -0.2;
         -0.2  0.0  0.1;
          0.1  0.2  0.0];                  % deviasi tetap tiap sel
disp('matriks data A:')
disp(A)

[U, S, V] = svd(A);
s = diag(S);
disp('nilai singular:')
disp(s)

for k = 1:3
  Ak = U(:, 1:k) * S(1:k, 1:k) * V(:, 1:k)';
  error_relatif = norm(A - Ak, 'fro') / norm(A, 'fro');
  energi = sum(s(1:k).^2) / sum(s.^2);
  fprintf('peringkat %d: energi %.6f, error relatif %.4f\n', k, energi, error_relatif);
end
text Keluaran
matriks data A:
   20.000   20.700   19.400
   21.900   22.500   21.700
   24.100   24.300   23.500
   26.200   26.600   25.300
   27.800   28.500   27.600
   30.100   30.700   29.500
nilai singular:
   107.1658
     0.4696
     0.3347
peringkat 1: energi 0.999971, error relatif 0.0054
peringkat 2: energi 0.999990, error relatif 0.0031
peringkat 3: energi 1.000000, error relatif 0.0000

Nilai singular pertama, 107.1658, menonjol jauh dibandingkan dua nilai sisanya yang berorde sepersepuluh, sehingga satu arah saja menangkap 99.997 persen energi. Aproksimasi peringkat satu menghasilkan error relatif hanya 0.0054, artinya matriks (6×3)(6 \times 3) berisi 18 angka dapat diwakili oleh satu kolom 66 elemen, satu kolom 33 elemen, dan satu skalar. Peringkat dua memperbaiki sedikit karena ofset antar saluran ikut tertangkap, dan peringkat tiga mengembalikan matriks asalnya secara penuh karena pangkat matriksnya memang tiga. Prinsip yang sama bekerja pada matriks data yang jauh lebih besar, misalnya matriks citra dan matriks pengukuran bertahun-tahun, ketika sebagian kecil nilai singular menyimpan hampir seluruh informasi.

Kesalahan umum#

  • Mengandaikan urutan nilai eigen menaik atau menurun. Fungsi eig tidak menjanjikan urutan tertentu, sehingga urutan pada satu implementasi atau satu versi dapat berbeda dari yang lain. Nilai singular dari svd selalu menurun, tetapi untuk nilai eigen, gunakan d = sort(diag(D)) ketika urutan memang dibutuhkan.
  • Mengambil baris V sebagai vektor eigen. Vektor eigen adalah kolom V, sehingga V(k, :) tidak berpasangan dengan D(k, k) dan perbandingannya menyesatkan. Selalu verifikasi dengan A * V(:, k) dibandingkan D(k, k) * V(:, k).
  • Tertukar antara vektor nilai singular dan matriksnya. Pemanggilan s = svd(A) mengembalikan vektor nilai singular, sedangkan [U, S, V] = svd(A) mengembalikan matriks diagonal di S. Keduanya berbeda bentuk meskipun berisi angka yang sama, dan diag(S) menjadi jembatan antara keduanya.

Ringkasan#

  • [V, D] = eig(A) menghasilkan vektor eigen pada kolom V dan nilai eigen pada diagonal D, dengan pasangan kolom ke-kk dan elemen diagonal ke-kk yang diverifikasi lewat Av=λvA\mathbf{v} = \lambda\mathbf{v}.
  • Matriks simetrik memiliki vektor eigen ortogonal sehingga A=WΛWTA = W \Lambda W^{\mathsf{T}} dengan verifikasi norm(W' * W - eye(n)) dan norm(W' * S * W - E) berorde pembulatan.
  • [U, S, V] = svd(A) berlaku untuk matriks persegi panjang, dan jumlah kuadrat nilai singularnya sama dengan energi ∥A∥F2\|A\|_F^2.
  • Rekonstruksi dengan kk nilai singular teratas memberi aproksimasi peringkat kk terbaik, dan error relatifnya memutuskan berapa nilai singular yang layak disimpan.

Referensi#

  • eig — MathWorks — Rujukan resmi dekomposisi nilai eigen beserta struktur keluarannya.
  • svd — MathWorks — Rujukan resmi dekomposisi nilai singular untuk matriks persegi dan persegi panjang.
  • norm — MathWorks — Rujukan norma vektor dan matriks, termasuk norma Frobenius yang digunakan untuk mengukur error relatif.