Saya menggunakan Linear Discriminant Analysis (LDA) dari scikit-learn
perpustakaan pembelajaran mesin (Python) untuk pengurangan dimensi dan sedikit ingin tahu tentang hasilnya. Sekarang saya bertanya-tanya apa yang dilakukan LDA scikit-learn
sehingga hasilnya terlihat berbeda dari, misalnya, pendekatan manual atau LDA yang dilakukan di R. Akan lebih bagus jika seseorang bisa memberi saya wawasan di sini.
Apa yang pada dasarnya paling memprihatinkan adalah bahwa scikit-plot
menunjukkan korelasi antara dua variabel di mana harus ada korelasi 0.
Untuk tes, saya menggunakan dataset Iris dan 2 diskriminan linier pertama terlihat seperti ini:
IMG-1. LDA melalui scikit-learn
Ini pada dasarnya konsisten dengan hasil yang saya temukan di dokumentasi scikit-learning di sini.
Sekarang, saya melalui LDA langkah demi langkah dan mendapat proyeksi yang berbeda. Saya mencoba berbagai pendekatan untuk mencari tahu apa yang sedang terjadi:
IMG-2. LDA pada data mentah (tidak ada pemusatan, tidak ada standardisasi)
Dan di sini akan menjadi pendekatan langkah-demi-langkah jika saya menstandarkan (z-skor normalisasi; varian unit) data terlebih dahulu. Saya melakukan hal yang sama hanya dengan pemusatan-kejam saja, yang seharusnya mengarah pada gambar proyeksi relatif yang sama (dan memang memang demikian).
IMG-3. Step-by-step LDA setelah mean-centering, atau standardisasi
IMG-4. LDA dalam R (pengaturan default)
LDA di IMG-3 di mana saya memusatkan data (yang akan menjadi pendekatan yang disukai) terlihat juga persis sama dengan yang saya temukan di Post oleh seseorang yang melakukan LDA di R
Kode untuk referensi
Saya tidak ingin menempelkan semua kode di sini, tetapi saya telah mengunggahnya sebagai notebook IPython di sini dipecah menjadi beberapa langkah yang saya gunakan (lihat di bawah) untuk proyeksi LDA.
- Langkah 1: Menghitung vektor rata-rata d-dimensi
Langkah 2: Menghitung Matriks Sebar
2.1 dalam kelas scatter matrix dihitung dengan persamaan berikut: S W = c Σ i = 1 S i = c Σ i = 1 n Σ x ∈ D i ( x - m i )
2.2 antara kelas scatter matrix dihitung dengan persamaan berikut: S B = c Σ i = 1 n i ( m i - m ) ( m i - m ) T di mana m adalah mean keseluruhan.
Langkah 3. Memecahkan masalah nilai eigen umum untuk matriks
3.1. Menyortir vektor eigen dengan menurunkan nilai eigen
3.2. Memilih k vektor eigen dengan nilai eigen terbesar. Menggabungkan dua vektor eigen dengan nilai eigen tertinggi untuk membangun kami berdimensi vektor eigen matriks W
Langkah 5: Mengubah sampel ke subruang baru
sumber
Jawaban:
Pembaruan: Berkat diskusi ini,
scikit-learn
telah diperbarui dan berfungsi dengan benar sekarang. Kode sumber LDA-nya dapat ditemukan di sini . Masalah aslinya adalah karena bug kecil (lihat diskusi github ini ) dan jawaban saya sebenarnya tidak menunjuk dengan benar (permintaan maaf atas kebingungan yang disebabkan). Karena semua itu tidak masalah lagi (bug diperbaiki), saya mengedit jawaban saya untuk fokus pada bagaimana LDA dapat diselesaikan melalui SVD, yang merupakan algoritma default discikit-learn
.Perhatikan bahwa jika Anda memiliki dekomposisi eigenΣW=USU⊤ Σ−1/2W=US−1/2U⊤ XW=ULV⊤⇒Σ−1/2W=UL−1U⊤
Memang, jika adalah vektor eigen dari matriks di atas, maka Σ - 1 / 2 W Σ B Σ - 1 / 2 Wa∗
Singkatnya, LDA setara dengan memutihkan matriks sarana kelas sehubungan dengan kovarians dalam kelas, melakukan PCA pada sarana kelas, dan mentransformasikan kembali sumbu utama yang dihasilkan ke ruang asli (tanpa dikhawatirkan).
Ini ditunjukkan misalnya dalam The Elements of Statistics Learning , bagian 4.3.3. Dalam
scikit-learn
hal ini adalah cara standar untuk menghitung LDA karena SVD dari matriks data secara numerik lebih stabil daripada dekomposisi eigen dari matriks kovariansnya.scikit-learn
sumber
Hanya untuk menutup pertanyaan ini, masalah yang dibahas dengan LDA telah diperbaiki di scikit-learn 0.15.2 .
sumber