Mengapa hasil nilai eigen berbeda antara matlab dan numpy?

By | July 30, 2024
2,372 Views

Sinopsis

Bila kalian bekerja dengan principal component analyst (PCA ) dialih bahasakan menjadi analisis komponen utama (AKU) maka akan ada perhitungan sebuah eigen value dan eigen vector. Tools yang sering digunakan untuk perhitungan PCA biasanya menggunakan matlab ataupun Python-Numpy. Nah pembahasan kali ini mengenai hasil yang didapatkan mengapa berbeda antara matlab dan python-numpy.

Apa itu nilai eigen

Perhatikan persamaan matematika dibawah ini bahwa jika suatu matriks bujur sangkar, dikali dengan sebuah vektor bukan nol, diatur sedimikian rupa sehingga hasilnya sama dengan perkalian sebuah bilangan skalar dengan vektor tak nol itu sendiri, inilah yang dinamakan Nilai Eigen dan Vektor Eigen.

jika A=\begin{pmatrix} a & b \\ c & d \end{pmatrix} adalah matrix

v=\begin{pmatrix} x \\ y \\ \end{pmatrix} adalah vektor eigen

k adalah nilai eigen maka

Sehingga

    \[\begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \\ \end{pmatrix} = k \begin{pmatrix} x \\ y \\ \end{pmatrix}\]

dapat dilambangkan menjadi v= vector eigen,  \lambda = nilai eigen

    \[Av=\lambda v\]

nilai eigen dikalikan  dengan matrix identitas, maka

    \[Av=\lambda I v\]

    \[(\lambda I - A)v=0\]

Contoh perhitungan manual eigen

Berikut adalah 2 contoh soal bagaimana menentukan nilai dan vektor Eigen suatu matriks:

Tentukan nilai dan vektor eigen dari matrix A=\begin{pmatrix} 1 & -2 \\ 1 & 4\end{pmatrix} ?

Nilai eigen \lambda

    \[(\lambda I-A)v=0\]

    \[\bigg( \lambda \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} -  \begin{pmatrix} 1 & -2 \\ 1 & 4 \end{pmatrix} \bigg ) v=0\]

    \[\bigg( \begin{pmatrix} \lambda & 0 \\ 0 & \lambda \end{pmatrix} -  \begin{pmatrix} 1 & -2 \\ 1 & 4 \end{pmatrix} \bigg) v=0\]

    \[\begin{pmatrix} \lambda-1 & 2\\ -1 & \lambda - 4 \end{pmatrix}v=0\]

untuk menentukan nilai lambda yang skalar, berlaku:

    \[det(\lambda I-A)=0\]

    \[det\begin{pmatrix} \lambda-1 & 2\\ -1 & \lambda - 4  \end{pmatrix}=0\]

    \[((\lambda-1)(\lambda -4)-(2)(-1))=0\]

    \[(\lambda^2-5\lambda +4+2)=0\]

    \[\lambda^2-5\lambda+6=0\]

    \[(\lambda-2)(\lambda-3)=0\]

sehingga \lambda =2 atau \lambda=3

didapatkan eigen\, value = [2, 3]

Perhatikan persamaan berikut untuk menguji vektor eigen

    \[(\lambda I - A)v=0\]

    \[\begin{pmatrix} \lambda-1 & 2 \\ -1 & \lambda-4 \end{pmatrix} v = 0\]

    \[\begin{pmatrix} \lambda-1 & 2 \\ -1 & \lambda-4 \end{pmatrix} \begin{pmatrix} v_1 \\ v_2\end{pmatrix} = 0\]

Untuk nilai \lambda=2 maka:

    \[\begin{pmatrix} 1 & 2 \\ -1 & -2\end{pmatrix} \begin{pmatrix} v_1 \\ v_2 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix}\]

terbentuk sistem persamaan linear

    \[v_1+2v_2=0\]

    \[-v_1-2v_2=0\]

diperoleh v_1=-2 dan v2=1

pembuktian

    \[Av=\lambda v\]

    \[ \begin{pmatrix} 1 & -2 \\ 1 & 4\end{pmatrix} \begin{pmatrix} -2 \\ 1 \end{pmatrix} = 2 \begin{pmatrix} -2 \\ 1 \end{pmatrix} \]

    \[ \begin{pmatrix} -4 \\ 2 \end{pmatrix} = 2 \begin{pmatrix} -2 \\ 1\end{pmatrix} \, terbukti \]

Untuk nilai \lambda=3 maka:

    \[ \begin{pmatrix} 2 & 2 \\ -1 & -1\end{pmatrix} \begin{pmatrix} v_1 \\ v_2 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} \]

terbentuk sistem persamaan linear

    \[2v_1+2v_2=0\]

    \[-v_1-v_2=0\]

diperoleh v_1=1 dan v2=-1

pembuktian

    \[Av=\lambda v\]

    \[ \begin{pmatrix} 1 & -2 \\ 1 & 4\end{pmatrix} \begin{pmatrix} 1 \\ -1 \end{pmatrix} = 3 \begin{pmatrix} 1\\ -1 \end{pmatrix} \]

    \[ \begin{pmatrix} 3 \\ -3 \end{pmatrix} = 3 \begin{pmatrix} 1 \\ -1\end{pmatrix} \, terbukti \]

Hasil dari Matlab dan Python-Numpy

Penulis disini bukan membahas mengenai cara diatas, akan tetapi mengungkap persoalan hasil perhitungan eigen di Matlab dan Numpy (Pustaka matrix di python) koq berbeda??Coba perhatikan berikut. Jika kalian gunakan code matlab berikut

clc;clear all;close all;
A = [1,-2;1,4]
[vektor_eigen,nilai_eigen] = eig(A);
vektor_eigen
nilai_eigen = diag(nilai_eigen)

Menghasilkan

A =

     1    -2
     1     4


vektor_eigen =

   -0.8944    0.7071
    0.4472   -0.7071


nilai_eigen =

     2
     3

Mari kita uji apakah masih berlaku?

    \[ \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \\ \end{pmatrix} = k \begin{pmatrix} x \\ y \\ \end{pmatrix} \]

Kita akan menggunakan nilai eigen ke 1 yaitu bernilai 2

%lakukan uji
no_uji = 1;
sisi_kiri = A*vektor_eigen(:,no_uji)
sisi_kanan = nilai_eigen(no_uji)*vektor_eigen(:,no_uji)

Ternyata menghasilkan yang sama

sisi_kiri =

   -1.7889
    0.8944


sisi_kanan =

   -1.7889
    0.8944

Kalaupun no_uji diganti dengan nilai eigen ke 2 yaitu bernilai 3, pun akan sama hasil nya

sisi_kiri =

    2.1213
   -2.1213


sisi_kanan =

    2.1213
   -2.1213

Menghasilkan vektor_eigen = [-0.8944, 0.7071; 0.4472,  -0.7071] dan Nilai_eigen = [2,3]

Mari kita coba versi python dengan numpy sebagai pustaka nya!

import numpy as np
A = np.array([[1,-2],[1,4]])
[nilai,vektor] = np.linalg.eig(A)
print('A = ',A)
print('nilai = ',nilai)
print('vektor = ', vektor)
index = 0
sisi_kiri = np.dot(A,vektor[:,index])
sisi_kanan = nilai[index]*vektor[:,index]
print ('sisi_kiri\n',sisi_kiri)
print ('sisi_kanan\n',sisi_kanan)

Menghasilkan nilai yang sama

A =  [[ 1 -2]
 [ 1  4]]
nilai =  [2. 3.]
vektor =  [[-0.89442719  0.70710678]
 [ 0.4472136  -0.70710678]]
sisi_kiri
 [-1.78885438  0.89442719]
sisi_kanan
 [-1.78885438  0.89442719]

Itu artinya bisa solusi non trivial (kebetulan saja menggunakan data ukuran 2*2, bila saja menggunakan ukuran data yang agak besar, maka hasil di matlab dan numpy-python bisa berbeda!) tapi sebetulnya itu sama bila mengacu definisi berikut:

    \[ \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \\ \end{pmatrix} = k \begin{pmatrix} x \\ y \\ \end{pmatrix} \]