Çok yüksek boyutsal veriler için PCA nasıl yapılır?


12

Temel bileşen analizi (PCA) yapmak için, her bir sütunun ortalamalarını verilerden çıkarmanız, korelasyon katsayı matrisini hesaplamanız ve sonra özvektörleri ve özdeğerleri bulmanız gerekir. Daha doğrusu, Python'da uygulamak için yaptığım şey, sadece korelasyon katsayısı matrisini (corrcoef) bulma yöntemi yüksek boyutsallığa sahip bir dizi kullanmama izin vermediği için sadece küçük matrislerle çalışıyor. Görüntüler için kullanmam gerektiğinden, mevcut uygulamam bana gerçekten yardımcı olmuyor.

Veri matrisi nizi almanın ve yerine hesaplamanın mümkün olduğunu okudum , ama bu benim için çalışmıyor. Ne anlama geldiğimi tam olarak bilmiyorum, bunun yanında yerine matrisi olması gerekiyor (benim durumumda ). Özyüz derslerinde olanlar hakkında okudum ama hiçbiri bunu gerçekten anlayabileceğim şekilde açıklamıyordu.D D / n D D / nDDD/nDD/np × p p nnxnpxpp»n

Kısacası, takip edebilmem için bu yöntemin basit bir algoritmik açıklaması var mı?


Okuduğunuz doğru. Matris gram matris olarak adlandırılır. Özvektörleri (ölçeklendirilmiş) ana bileşenlerdir. Özdeğerleri faktörüne kadar kovaryans matrisi özdeğerleriyle tam olarak aynıdır . 1 / n D D / nDD1/nDD/n
amip

Yanıtlar:


10

Standart PCA yapmanın en kolay yolu, sütun araçlarını çıkararak veri matrisinizin sütunlarını ortalamak (sütunların farklı değişkenlere karşılık geldiği varsayılarak) ve ardından bir SVD gerçekleştirmektir. Sol tekil vektörler, karşılık gelen tekil değerle çarpılarak, (tahmini) ana bileşenlere karşılık gelir. Sağ tekil vektörler (tahmini) ana bileşen yönlerine karşılık gelir - bunlar PCA tarafından verilen özvektörlerle aynıdır. Tekil değerler, ana bileşenlerin standart sapmalarına karşılık gelir (n kökünün bir faktörü ile çarpılır, burada n, veri matrisinizdeki satır sayısıdır) - PCA tarafından verilen özdeğerlerin kare kökü ile aynıdır.

Korelasyon matrisinde PCA yapmak istiyorsanız, SVD'yi uygulamadan önce veri matrisinizin sütunlarını standartlaştırmanız gerekir. Bu, araçların çıkarılması (merkezleme) ve daha sonra standart sapmalara (ölçeklendirme) bölünmesi anlamına gelir.

Tam PCA'yı istiyorsanız bu en verimli yaklaşım olacaktır. Bazı cebirlerle bunun örnek kovaryans matrisinin spektral ayrışmasını yapmakla aynı cevabı verdiğini doğrulayabilirsiniz.

Ayrıca, yalnızca birkaç PC'ye ihtiyacınız olduğunda, kısmi bir SVD'yi hesaplamak için etkili yöntemler de vardır. Bunlardan bazıları güç yinelemesinin varyantlarıdır. Lanczos algoritması da kısmi en küçük kareler ile ilgilidir bir örnektir. Matrisiniz çok büyükse, yaklaşık bir yöntemle daha iyi olabilirsiniz. Bu durumda PCA'nın düzenli olmasının istatistiksel nedenleri de vardır.


Yanılıyorsam beni düzeltin, ama bence Lanczos algoritması SVD'yi değil özdeğerlendirme yapıyor.
amoeba

1
İlgilenen bir okuyucu, SVD aracılığıyla PCA gerçekleştirme hakkında daha fazla ayrıntı için buraya bakabilir: SVD ve PCA arasındaki ilişki. PCA gerçekleştirmek için SVD nasıl kullanılır?
amip

10

Ne şu anda yaptığınız yakındır, ancak emin sen çarpın öz vektörleri yapmak gerekir (data . data.T) / linesbıraktığı üzerinde data.Tvektörlerini elde etmek için, (data.T . data) / lines. Buna bazen "devrik numara" denir.

İşte biraz daha detay. PCA'yı gerçekleştirmek istediğiniz matrisiniz olduğunu varsayalım ; Basitlik için, sütunları varsayalım A biz sadece kovaryans matrisi vektörlerini hesaplamamız gerekir böylece, zaten sıfır ortalamaya sahip normalize edilmiş bir T A .birbirbirTbir

Şimdi ise is an m x n matris, n > > m , o zaman A , T bir çok büyük olduğu , n x n matrisi. Bu nedenle, A T A'nın özvektörlerini hesaplamak yerine , daha küçük m × m matris A A T'nin özvektörlerini hesaplamak isteyebiliriz - bu ikisi arasında bir ilişki olduğunu anlayabiliriz. Peki özvektörleri A T A özvektörlerinde ilişkin bir A T ?birmxnn>>mbirTbirnxnbirTbirmxmbirbirTbirTbirbirbirT

, öz değeri λ olan bir A T'nin özvektörü olsun . SonravbirbirTλ

  • birbirTv=λv
  • birT(birbirTv)=birT(λv)
  • (birTbir)(birTv)=λ(birTv)

vbirbirTbirTvbirTbirbirbirTbirvbirbirTbirTbirTvbirTbir


1
Bu, PCA'ya uygulanan "çekirdek numarası" gibi geliyor. en.wikipedia.org/wiki/Kernel_PCA Bazı büyük matrisleri işlemenin çok iyi bir yoludur.
Gilead

birbir

8

PCA gerçekleştirmek için NIPALS algoritmasıdır. İstatistikçiler arasında çok popüler bir algoritma. Birçok avantajı vardır:

  • Yalnızca ilk birkaç bileşen gerekiyorsa SVD veya özdeğer ayrışma yöntemlerinden hesaplamalı olarak daha ucuzdur.
  • Kovaryans matrisi asla oluşmadığından genel olarak daha mütevazı depolama gereksinimlerine sahiptir. Bu çok büyük veri kümeleri için çok önemli bir özelliktir.
  • Veri kümesindeki eksik verileri işleyebilir (bu, resimlerle uğraştığınız için sorununuzda bir sorun değildir).

Açıklama
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

Algoritma
İşte algoritmanın basit ve mükemmel açıklaması (bölüm 1.2'de)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

PCA yapmadan önce ölçeğe duyarlı olduğu için ortalama merkez ölçeğini ifade etmeyi unutmayın.


4

Gilead'in cevabına eklemek için, kesilmiş PCA'lar için hesaplamalı olarak daha ucuz algoritmalardır. NIPALS gerçekten çok popüler, ancak kısmi verilere (rasgele projeksiyon ile PCA olarak adlandırılan) arka arkaya uyum sağlayan yaklaşık yöntemlerle çok başarılı oldum. Bu bir metaoptimize iş parçacığında tartışıldı .

Python'dan bahsettiğiniz gibi, algoritmanın scikit-learn : PCA sınıfında uygulandığını belirteyim . Özellikle, özyüzleri gösteren bir örnekte kullanılır .

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.