Python'un bilim-kurgu LDA'sı neden doğru çalışmıyor ve LDA'yı SVD üzerinden nasıl hesaplıyor?


26

scikit-learnMakine öğrenim kütüphanesinden (Python) Doğrusal Ayrımcılık Analizi'ni (LDA) boyutsallığın azaltılması için kullanıyordum ve sonuçları biraz merak ediyordum. Şimdi, LDA'nın ne scikit-learnyaptığını merak ediyorum , böylece sonuçlar R'de yapılan bir manuel yaklaşımdan veya LDA'dan farklı görünecek şekilde farklı görünebilir. Biri bana burada bazı bilgiler verebilirse harika olur.

Temel olarak en çok ilgisini çeken şey, scikit-plotilişkilerin 0 olması gereken iki değişken arasında bir korelasyon göstermesidir.

Bir test için, Iris veri setini kullandım ve ilk 2 doğrusal ayrımcı şöyle göründü:

IMG-1. Scikit-learn ile LDA

görüntü tanımını buraya girin

Bu temelde, burada bulunan scikit-learn belgelerinde bulduğum sonuçlarla tutarlı .

Şimdi adım adım LDA’dan geçtim ve farklı bir projeksiyon aldım. Neler olup bittiğini bulmak için farklı yaklaşımlar denedim:

IMG-2. Ham verilere ilişkin LDA (merkezleme yok, standardizasyon yok)

görüntü tanımını buraya girin

Ve eğer ilk önce veriyi standartlaştırsaydım (z-puan normalizasyonu; birim varyans). Aynı şeyi sadece ortalama merkezlemeyle yaptım, bu aynı göreceli projeksiyon görüntüsüne (ve gerçekten de yaptığı gibi) yol açmalıdır.

IMG-3. Ortalama merkezleme veya standardizasyondan sonra adım adım LDA

görüntü tanımını buraya girin

IMG-4. R'deki LDA (varsayılan ayarlar)

Verileri ortaladığım IMG-3'teki LDA (ki bu tercih edilen yaklaşım olacaktır), aynı zamanda R’de LDA’yı yapan biri tarafından bir Yazı’da bulduğum ile aynı görünüyor görüntü tanımını buraya girin


Referans için kod

Tüm kodu buraya yapıştırmak istemedim, ancak LDA projeksiyonu için kullandığım birkaç adıma (aşağıya bakınız) ayrılmış olan bir IPython not defteri olarak yükledim .

  1. Adım 1: d-boyutlu ortalama vektörlerinin
    mi=1nixDinxk
  2. Adım 2: Dağılım Matrislerinin Hesaplanması

    2.1 Sınıf içi dağılım matrisi , aşağıdaki denklem ile hesaplanır:SW

    SW=i=1cSi=i=1cxDin(xmi)(xmi)T

    2.2 Sınıflar arası dağılım matrisi , aşağıdaki denklem ile hesaplanır: burada genel ortalamadır.SB

    SB=i=1cni(mim)(mim)T
    m
  3. Adım 3. matrisi için genelleştirilmiş özdeğer problemini çözmeSW1SB

    3.1. Özdeğerleri azaltarak özvektörleri sıralama

    3.2. En büyük özdeğerlere sahip k özvektörleri seçmek . boyutlu eigenvector matrix iki özvektörün en yüksek öz değerlerle birleştirilmesid×kW

  4. Adım 5: Örnekleri yeni alt alana

    y=WT×x.

Farklılıkları aramaya devam etmedim, ancak scikit-learn'ın kaynakta ne yaptığını tam olarak görebilirsiniz .
Dougal

Aynı zamanda standartlaşıyorlarmış gibi görünüyor (merkezleme ve ardından standart sapma ile bölünerek ölçeklendirme). Bu, benim üçüncü

Tuhaf: scikit ile elde ettiğiniz arsa (ve belgelerinde gösterdikleri) bir anlam ifade etmiyor. LDA her zaman korelasyonu sıfır olan projeksiyonlar verir, ancak açıkçası, scikit'in diskriminant eksen 1 ve 2 üzerindeki projeksiyonları arasında çok güçlü bir korelasyon var.
amip diyor Reinstate Monica

@ameoba Evet, ben de öyle düşünüyorum. Ayrıca garip olan şey, scikit için gösterdiğim aynı arsa örnek dokümantasyonunda: scikit-learn.org/stable/auto_examples/decomposition/… Bu, scikit kullanımımın doğru olduğunu, ancak garip bir şey olduğunu düşündürüyor. LDA işlevi hakkında

@SebastianRaschka: Evet, farkettim. Gerçekten de çok garip. Bununla birlikte, kendi (ilk olmayan) LDA grafiklerinin ilkinin sıfır olmayan bir korelasyon gösterdiğini ve bu nedenle bir şeylerin de yanlış olması gerektiğini unutmayın. Verileri ortaladınız mı? İkinci eksen üzerindeki projeksiyonun sıfır ortalaması yok gibi görünüyor.
amip Reinstate Monica diyor

Yanıtlar:


20

Güncelleme: Bu tartışma sayesinde scikit-learnşimdi güncellendi ve doğru çalışıyor. LDA kaynak kodu burada bulunabilir . Asıl mesele küçük bir hatadan kaynaklanıyordu ( bu tartışma konusuna bakın ) ve cevabım aslında doğru bir şekilde işaret etmiyordu (karışıklıktan dolayı özür dilemedi). Tüm bunlar artık önemli olmadığından (hata giderildi), cevabımı, LDA'nın varsayılan algoritma olan SVD ile nasıl çözülebileceğine odaklanmak için düzenledim scikit-learn.


Sınıf içi ve arasındaki dağılım matrislerini ve , belirtildiği gibi standart LDA hesaplama, ayırt edici eksen olarak ( örneğin buraya bakınız ). Bununla birlikte, aynı eksenler beyazlatma matrisinden yararlanarak biraz farklı bir şekilde hesaplanabilir:ΣWΣBΣW1ΣB

  1. Hesapla . Bu, sınıf içi kovaryansa göre havuzlanmış beyazlatıcı bir dönüşümdür (ayrıntılar için bağlantılı cevabımı inceleyin).ΣW1/2

    -ayrıştırma , o zaman . Ayrıca, sınıf içi veri havuzunda SVD yaparak birinin aynı olduğunu hesaplayın: .ΣW=USUΣW1/2=US1/2UXW=ULVΣW1/2=UL1U

  2. özvektörlerini bulun , bize diyelim .ΣW1/2ΣBΣW1/2A

    Yine, bir sınıf içi veri , , yani sınıf içi ile ilgili beyazlatılmış sınıflar arası veriler arasında SVD yaparak bunu hesaplayabileceğinizi unutmayın. kovaryans.XBΣW1/2

  3. Diskriminant eksenleri , tarafından verilecektir, yani dönüştürülen verilerin ana eksenleri tarafından tekrar dönüştürülecektir .AΣW1/2A

    Aslında, eğer yukarıdaki matrisin bir özvektörü ise, ve soldan ile ve tanımlayarak hemen elde ederiz :a

    ΣW1/2ΣBΣW1/2a=λa,
    ΣW1/2a=ΣW1/2a
    ΣW1ΣBa=λa.

Özetle, LDA, sınıf içi kovaryansa göre sınıf araçlarının matrisini beyazlatmaya, sınıf araçlarında PCA yapmaya ve sonuçta ortaya çıkan ana eksenleri orijinal (boşluksuz) alana geri dönüştürmeye eşdeğerdir.

Bu, örneğin İstatistiksel Öğrenmenin Öğeleri , bölüm 4.3.3'te belirtilmiştir. Olarak scikit-learn, bu veri matrisi SVD sayısal daha stabil hale kovaryans matrisinin eigen-bozunma daha uzun olduğundan LDA hesaplamak için varsayılan yöntemdir.

yerine herhangi bir beyazlatma dönüşümü kullanabileceğini ve her şeyin tamamen aynı şekilde çalışacağını unutmayın. Gelen kullanılır (yerine ) ve gayet iyi çalışıyor (cevabımda orjinalinde yazılanların aksine).ΣW1/2scikit-learn L1UUL1U


1
Bu güzel cevap için teşekkürler. Bunu güzelce yazmak için zaman ayırdığınız için teşekkür ederim. Belki GitHub tartışmasında bundan bahsedebilirsin; Bunun,

@SebastianRaschka: GitHub'da bir hesabım yok. Ama istersen, bu konuya bir link verebilirsin.
amip diyor Reinstate Monica

@ amoeba: Ders kitapları genellikle LDA'yı sizin yaptığınız gibi tarif eder - . İlginç bir şekilde, tanıdığım birkaç LDA uygulaması farklı bir yaklaşım benimsiyor. Eksenleri ile dönüştürülmüş sınıf araçlarına vektörlerdir . LDA çözümünüz bu vektörlerin ortonormal bir temelidir. Scikit-learn'ın LDA'sı bu uygulamalarla aynı sonuçları veriyor, bu yüzden aslında bir hata olduğunu sanmıyorum. ΣW1ΣBΣW1
kazemakase


2
@kazemakase: Tabii ki, eğer sadece iki sınıf varsa, o zaman 1 rütbe aldı ve her şey çok basitleştirildi, çünkü nin tek özvektörü verildi. , burada sınıf anlamına gelir. Sanırım daha önce demek istediğin bu muydu? Bu, örneğin Bishop's ML ders kitabında, bölüm 4.1.4'te ele alınmıştır. Ancak, daha fazla sınıfa genelleme öz-analiz gerektirir (Ibid, 4.1.6). Ayrıca, scikit en kodu (burada ele alıyorlar!) Yapar , iki kez aslında, kullanım SVD. ΣBΣW1ΣBΣW1(μ1μ2)μi
amip Reinstate Monica

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.