Menghitung Nilai Eigen dan Vektor Eigen dengan Python
Desember 04, 2024
Bab 1 Tugas 10 (Linear Algebra)
Dataset Bunga Iris mencakup kolom-kolom berikut:
1.1 Persiapan Data
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
2 | 4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
3 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5 | 5 | 3.6 | 1.4 | 0.2 | Iris-setosa |
6 | … | … | … | … | … |
147 | 6.3 | 2.5 | 5 | 1.9 | Iris-virginica |
148 | 6.5 | 3 | 5.2 | 2 | Iris-virginica |
149 | 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
150 | 5.9 | 3 | 5.1 | 1.8 | Iris-virginica |
Kita akan normalisasi kolom Sepal Length (Cm) untuk baris pertama (\(x = 5.1\)). Tujuannya adalah mengubah nilai ini jadi z-score, yaitu angka yang menunjukkan seberapa jauh nilai \(x\) dari rata-rata kolom, diukur dalam satuan standar deviasi.
1.1.1 Langkah 1 : Hitung Rata-Rata (\(\mu\))
Rata-rata adalah nilai tengah data, yang didapat dengan menjumlahkan semua angka di kolom lalu bagi jumlah datanya.
Ambil semua nilai di kolom Sepal Length (Cm): Contoh nilai: 5.1, 4.9, 4.7, 4.6, 5.0, …, 5.9.
Jumlah totalnya: \[ \sum x_i = 876.5 \]
Hitung rata-rata: Bagi jumlah total dengan jumlah data (\(n = 150\)):
\[ \mu = \frac{\sum x_i}{n} = \frac{876.5}{150} = 5.8433333 \]
Jadi, rata-rata kolom Sepal Length (Cm) adalah 5.8433333. Ini yang nantinya menjadi “patokan” buat ngecek apakah nilai \(x\) lebih besar atau lebih kecil dari rata-rata.
1.1.2 Langkah 2 : Hitung Standar Deviasi (\(\sigma\))
Standar deviasi itu buat ngukur seberapa jauh data menyebar dari rata-rata. Kalau datanya dekat rata-rata, standar deviasinya kecil. Kalau tersebar jauh, standar deviasinya besar.
Kurangi setiap nilai dengan rata-rata (\(\mu\)): Ambil nilai dari kolom Sepal Length (Cm) satu per satu, lalu kurangi rata-rata.
Contoh:
\(5.1 - 5.8433333 = -0.7433333\)
\(4.9 - 5.8433333 = -0.9433333\)
\(4.7 - 5.8433333 = -1.1433333\)
Kuadratkan hasil selisihnya:
\((-0.7433333)^2 = 0.5525371\)
\((-0.9433333)^2 = 0.8898709\)
\((-1.1433333)^2 = 1.3072094\)
Jumlahkan semua hasil kuadrat: \[ \sum (x_i - \mu)^2 = 102.945862 \]
Bagi jumlahnya dengan \(n - 1\): Karena ini data sampel (bukan populasi penuh), bagi hasil tadi dengan \(n - 1\) (di sini \(n = 150\), jadi \(n - 1 = 149\)):
\[ \frac{\sum (x_i - \mu)^2}{n - 1} = \frac{102.945862}{149} = 0.6910981 \]
Ambil akar kuadrat hasilnya: \[ \sigma = \sqrt{0.6910981} = 0.8280661 \]
Standar deviasi kolom Sepal Length (Cm) adalah 0.8280661. Ini buat ngukur jarak data ke rata-rata.
1.1.3 Langkah 3 : Hitung Z-Score untuk Baris Pertama
Z-Score menunjukkan seberapa jauh nilai \(x\) (data mentah) dari rata-rata \(\mu\), diukur dengan standar deviasi \(\sigma\). Rumusnya:
\[ z = \frac{x - \mu}{\sigma} \]
Masukkan nilai pertama (\(x = 5.1\)), rata-rata (\(\mu = 5.8433333\)), dan standar deviasi (\(\sigma = 0.8280661\)):
\[ z = \frac{5.1 - 5.8433333}{0.8280661} \]
Hitung step by step: - \(x - \mu = 5.1 - 5.8433333 = -0.7433333\) - \(\frac{-0.7433333}{0.8280661} = -0.8976739\)
Hasil: Z-Score untuk baris pertama di kolom Sepal Length (Cm) adalah -0.8976739.
Kenapa Normalisasi Penting?
Membandingkan Fitur yang Skalanya Beda: Misalnya, panjang sepal dihitung dalam cm, tapi jumlah kelopak bisa jadi cuma angka utuh. Tanpa normalisasi, fitur dengan angka besar bakal lebih dominan.
Persiapan Analisis Statistik: Analisis seperti PCA atau regresi butuh data yang “seimbang”. Kalau nggak, hasilnya tidak sistematis.
1.1.4 Kesimpulan
Langkah normalisasi ini bisa diaplikasikan ke semua kolom data, tapi setiap kolom harus dihitung rata-rata (\(\mu\)) dan standar deviasinya (\(\sigma\)) masing-masing. Untuk kolom lain seperti Sepal Width (Cm) atau Petal Length (Cm), ulang langkah-langkah di atas dengan nilai datanya masing-masing. Berikut data tabel yang sudah dilakukan normalisasi sehingga setiap fitur memiliki nilai rata-rata 0 dan deviasi standar 1.
import pandas as pd
data_bunga = pd.read_csv('data/data_bunga.csv')
normalisasi = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
# Normalisasi (X - mean)
data_bunga[normalisasi] = (data_bunga[normalisasi] - data_bunga[normalisasi].mean()) / data_bunga[normalisasi].std()
# Menampilkan 4 data pertama dan 3 data terakhir
output = pd.concat([data_bunga[normalisasi].head(4), data_bunga[normalisasi].tail(3)])
print(output)
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## 0 -0.897674 1.028611 -1.336794 -1.308593
## 1 -1.139200 -0.124540 -1.336794 -1.308593
## 2 -1.380727 0.336720 -1.393470 -1.308593
## 3 -1.501490 0.106090 -1.280118 -1.308593
## 147 0.793012 -0.124540 0.816888 1.050019
## 148 0.430722 0.797981 0.930239 1.443121
## 149 0.068433 -0.124540 0.760212 0.787951
1.2 Hitung Matriks Kovariansi
Data Normalisasi yang Diberikan
\[ Z = \begin{bmatrix} -0.897674 & 1.028611 & -1.336794 & -1.308593 \\ -1.139200 & -0.124540 & -1.336794 & -1.308593 \\ -1.380727 & 0.336720 & -1.393470 & -1.308593 \\ -1.501490 & 0.106090 & -1.280118 & -1.308593 \end{bmatrix} \]
Jumlah data (\(n = 4\)).
Rumus Matriks Kovarians
Rumus Dasar
Untuk menghitung kovarians antara dua variabel (misalnya, Sepal Length dan Sepal Width), kita gunakan rumus:
\[ \text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} X_i Y_i \]
Karena data sudah dinormalisasi, rata-rata \(\bar{X}\) dan \(\bar{Y}\) = 0.
- \(X_i\) dan \(Y_i\): nilai masing-masing variabel
- \(n\): jumlah data (di sini \(n = 150\)).
1.2.1 Produk Deviasi
Contoh 1: Kovarians Sepal Length (\(X\)) dengan Sepal Length (\(X\)) Ini sebenarnya adalah variansi, karena kita menghitung hubungan variabel dengan dirinya sendiri. Rumusnya:
\[ S = \sum_{i=1}^{n} (X_i)^2 \]
Data Normalisasi Sepal Length (\(X\)):
\[ X = \{-0.897674, -1.139200, \dots, 0.068430\} \]
Langkah:
Kuadratkan setiap nilai \(X_i\):
\[ (-0.897674)^2 = 0.805813, \quad (-1.139200)^2 = 1.297804, \dots \]
Jumlahkan hasil kuadrat:
\[ S = 0.805813 + 1.297804 + \dots + (0.068430)^2 = 149 \]
Bagi hasilnya dengan \(n-1\):
\[ \text{Cov}(X, X) = \frac{S}{n-1} = \frac{149}{149} = 1 \]
Hasil: Kovarians untuk Sepal Length dengan Sepal Length adalah \(1\).
Contoh 2: Kovarians Sepal Length (\(X\)) dengan Sepal Width (\(Y\))
Rumusnya:
\[ S = \sum_{i=1}^{n} (X_i \cdot Y_i) \]
Data Normalisasi:
\[ X = \{-0.897674, -1.139200, \dots, 0.068430\}, \quad Y = \{1.028611, -0.124540, \dots, -0.124540\} \]
Langkah:
Kalikan setiap pasangan \(X_i\) dan \(Y_i\):
\[ (-0.897674 \cdot 1.028611) = -0.922967, \quad (-1.139200 \cdot -0.124540) = 0.141846, \dots \]
Jumlahkan hasilnya:
\[ S = -0.922967 + 0.141846 + \dots + (0.068430 \cdot -0.124540) = -16.29601824 \]
Bagi hasilnya dengan \(n-1\):
\[ \text{Cov}(X, Y) = \frac{S}{n-1} = \frac{-16.29601824}{149} = -0.109369 \]
Hasil: Kovarians untuk Sepal Length dengan Sepal Width adalah \(-0.109369\).
1.2.2 Ulangi untuk Semua Pasangan Variabel
Lakukan langkah yang sama untuk setiap kombinasi variabel lainnya (Sepal Length vs Petal Length, Petal Length vs Petal Width, dan sebagainya). Gunakan rumus:
\[ \text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} X_i Y_i \]
Setelah selesai, Anda akan mendapatkan matriks kovariansi seperti ini:
\[ \text{Cov}(Z) = \begin{bmatrix} 1.000000 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1.000000 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1.000000 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1.000000 \end{bmatrix} \] —
import pandas as pd
import numpy as np
import sys
# Memuat dataset
file_path = 'data/data_bunga.csv'
data = pd.read_csv(file_path)
features = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
data_relevant = data[features]
# Normalisasi manual (z-score): (x - mean) / std
means = data_relevant.mean()
stds = data_relevant.std(ddof=1)
data_normalized = (data_relevant - means) / stds
# Menghitung matriks kovarians
cov_matrix = data_normalized.cov()
# Membulatkan hasil untuk memastikan presisi
cov_matrix = cov_matrix.round(7)
print(cov_matrix)
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## SepalLengthCm 1.000000 -0.109369 0.871754 0.817954
## SepalWidthCm -0.109369 1.000000 -0.420516 -0.356544
## PetalLengthCm 0.871754 -0.420516 1.000000 0.962757
## PetalWidthCm 0.817954 -0.356544 0.962757 1.000000
1.3 Hitung Nilai Eigen dan Vektor Eigen
Rumus Dasar
Nilai eigen (\(\lambda\)) dan vektor eigen (\(v\)) dihitung menggunakan persamaan dasar berikut:
\[ A \cdot v = \lambda \cdot v \]
\(A\) adalah matriks kovariansi.
\(\lambda\) adalah nilai eigen.
\(v\) adalah vektor eigen.
Artinya, vektor eigen adalah vektor yang ketika dikalikan dengan matriks kovariansi, hasilnya akan sama dengan vektor itu sendiri, hanya saja diskalakan dengan nilai eigen \(\lambda\).
1.3.1 Bentuk Persamaan
Langkah pertama adalah mencari persamaan karakteristik untuk matriks kovariansi \(A\). Kita mendapatkan persamaan ini dengan mengurangkan \(\lambda\) yang diskalakan pada matriks identitas \(I\) dari matriks kovariansi \(A\). Matriks identitas \(I\) adalah matriks yang memiliki nilai 1 di diagonal utama dan 0 di elemen lainnya.
Matriks kovariansi \(A\) yang diberikan adalah:
\[ A = \begin{bmatrix} 1.000000 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1.000000 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1.000000 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1.000000 \end{bmatrix} \]
Untuk menemukan persamaan karakteristik, kita kurangi matriks identitas yang diskalakan oleh \(\lambda\):
\[ A - \lambda I = \begin{bmatrix} 1 - \lambda & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1 - \lambda & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1 - \lambda & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1 - \lambda \end{bmatrix} \]
1.3.2 Menghitung Determinan Matriks \(A - \lambda I\)
Selanjutnya, kita harus menghitung determinannya dan menyelesaikan persamaan untuk mencari nilai eigen \(\lambda\). Determinannya dihitung menggunakan aturan ekspansi Laplace (untuk matriks 4x4, ini membutuhkan perhitungan yang lebih panjang). Namun, untuk menyederhanakan, kita akan menunjukkan bahwa hasil determinan ini memberikan persamaan karakteristik:
\[ \text{det}(A - \lambda I) = 0 \]
Setelah menyelesaikan persamaan ini, kita mendapatkan nilai eigen \(\lambda\):
\[ \lambda_1 = 2.91081808, \quad \lambda_2 = 0.92122093, \quad \lambda_3 = 0.14735328, \quad \lambda_4 = 0.02060771 \]
1.3.3 Menghitung Vektor Eigen
Sekarang kita akan menghitung vektor eigen untuk setiap nilai eigen \(\lambda\). Vektor eigen dapat dihitung dengan menggantikan \(\lambda\) yang telah ditemukan ke dalam persamaan:
\[ (A - \lambda I) \cdot v = 0 \]
Ini adalah sistem persamaan linier yang bisa diselesaikan untuk \(v\), vektor eigen.
Contoh: Menghitung Vektor Eigen untuk \(\lambda_1 = 2.91081808\)
Substitusikan \(\lambda_1 = 2.91081808\) ke dalam persamaan:
\[ (A - 2.91081808 I) \cdot v = 0 \]
Kita akan mendapatkan sistem persamaan linier:
\[ \begin{bmatrix} 1 - 2.91081808 & -0.109369 & 0.871754 & 0.817954 \\ -0.109369 & 1 - 2.91081808 & -0.420516 & -0.356544 \\ 0.871754 & -0.420516 & 1 - 2.91081808 & 0.962757 \\ 0.817954 & -0.356544 & 0.962757 & 1 - 2.91081808 \end{bmatrix} \cdot \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ v_4 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \end{bmatrix} \]
Solusi dari sistem persamaan linier ini memberikan vektor eigen \(v_1\):
\[ v_1 = \begin{bmatrix} 0.52237162 \\ -0.26335492 \\ 0.5810 \\ 0.566 \end{bmatrix} \]
Lakukan Hal yang Sama untuk \(\lambda_2\), \(\lambda_3\), \(\lambda_4\)
- Untuk \(\lambda_2 = 0.92122093\), kita akan mendapatkan vektor eigen \(v_2\):
\[ v_2 = \begin{bmatrix} -0.372 \\ -0.926 \\ -0.021 \\ -0.065 \end{bmatrix} \]
- Untuk \(\lambda_3 = 0.14735328\), kita akan mendapatkan vektor eigen \(v_3\):
\[ v_3 = \begin{bmatrix} -0.721 \\ 0.242 \\ 0.141 \\ 0.634 \end{bmatrix} \]
- Untuk \(\lambda_4 = 0.02060771\), kita akan mendapatkan vektor eigen \(v_4\):
\[ v_4 = \begin{bmatrix} 0.262 \\ -0.124 \\ -0.801 \\ 0.524 \end{bmatrix} \]
1.3.4 Matriks Vektor Eigen
Terakhir, kita dapat menggabungkan semua vektor eigen menjadi satu matriks \(P\):
\[ P = \begin{bmatrix} 0.52237162 & -0.372 & -0.721 & 0.262 \\ -0.26335492 & -0.926 & 0.242 & -0.124 \\ 0.5810 & -0.021 & 0.141 & -0.801 \\ 0.566 & -0.065 & 0.634 & 0.524 \end{bmatrix} \]
Matriks \(P\) ini adalah matriks yang berisi vektor-vektor eigen sebagai kolom-kolomnya.
import pandas as pd
import numpy as np
data = pd.read_csv('data/data_bunga.csv')
features = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
data_features = data[features]
# Normalisasi data menggunakan Z-Score
normalized_data = (data_features - data_features.mean()) / data_features.std()
# Menghitung matriks kovarians
cov_matrix = np.cov(normalized_data.T)
# Menghitung nilai eigen dan vektor eigen
eigen_values, eigen_vectors = np.linalg.eig(cov_matrix)
# Menampilkan hasil
print(f"Eigenvalues: {eigen_values}")
## Eigenvalues: [2.91081808 0.92122093 0.14735328 0.02060771]
## Eigenvectors: [[ 0.52237162 -0.37231836 -0.72101681 0.26199559]
## [-0.26335492 -0.92555649 0.24203288 -0.12413481]
## [ 0.58125401 -0.02109478 0.14089226 -0.80115427]
## [ 0.56561105 -0.06541577 0.6338014 0.52354627]]
1.4 Transformasi Data
## PC1 PC2 Species
## 0 -2.264542 0.505704 Iris-setosa
## 1 -2.086426 -0.655405 Iris-setosa
## 2 -2.367950 -0.318477 Iris-setosa
## 3 -2.304197 -0.575368 Iris-setosa
## 4 -2.388777 0.674767 Iris-setosa
## .. ... ... ...
## 145 1.870522 0.382822 Iris-virginica
## 146 1.558492 -0.905314 Iris-virginica
## 147 1.520845 0.266795 Iris-virginica
## 148 1.376391 1.016362 Iris-virginica
## 149 0.959299 -0.022284 Iris-virginica
##
## [150 rows x 3 columns]