PCA ve TruncatedSVD'nin scikit-learn uygulamaları arasındaki fark


12

Temel Bileşen Analizi ile Tekil Değer Ayrışması arasındaki ilişkiyi cebirsel / tam düzeyde anlıyorum. Benim sorum scikit-learn uygulaması hakkında .

Dokümantasyonda: " [TruncatedSVD] PCA'ya çok benzer, ancak her iki yaklaşım arasındaki cebirsel farkı yansıtan örnek vektörler üzerinde bir kovaryans matrisi yerine doğrudan çalışır. " Ancak, daha sonra şöyle der: " Bu tahminci [TruncatedSVD] iki algoritmayı destekler: hızlı rasgele bir SVD çözücü ve ARPACK'i (X * XT) veya (XT * X) üzerinde bir özdeyici olarak kullanan“ saf ”bir algoritma, hangisi daha fazlaysa verimli. ". PCA ile ilgilidiyor ki: "Verileri yansıtmak için Tekil Değer Ayrışımı kullanarak doğrusal boyutsal azalma ...". Ve PCA uygulaması aynı iki algoritmayı (randomize ve ARPACK) çözücülerin yanı sıra başka bir algoritmayı da destekler, LAPACK. Kod bakarak hem PCA hem de TruncatedSVD hem ARPACK ve LAPACK örnek veri X svd yapmak görebilirsiniz, ARPACK seyrek matrisler (svds kullanarak) başa çıkmak mümkün.

Bu nedenle, farklı özellikler ve yöntemlerin yanı sıra, PCA ek olarak LAPACK, PCA ve TruncatedSVD scikit-öğrenim uygulamaları kullanarak tam tekil değer ayrışması da tam olarak aynı algoritma gibi görünebilir. İlk soru: Bu doğru mu?

İkinci soru: LAPACK ve ARPACK scipy.linalg.svd (X) ve scipy.linalg.svds (X) kullanıyor olsalar da, X örnek matrisi olarak, veya X'in tekil değer ayrışmasını veya öz-ayrışmasını hesaplarlar X T dahili olarak. "Rasgele" çözücünün ürünü hesaplaması gerekmez. (Bu, sayısal kararlılıkla bağlantılıdır, bkz . Verilerin SVD'si yoluyla neden veri PCA? ). Bu doğru mu?XT*XX*XT

İlgili kod: PCA hattı 415. Kesik SD hattı 137.


1
koda bir bağlantı ekleyebilir misiniz
seanv507

1
drake - Sanırım ilk Q'da sana katılıyorum. ikinciyi anlamıyorum. 'dahili olarak XT ∗ XXT ∗ X veya X ∗ XTX ∗ XT'nin tekil değer ayrışmasını veya öz ayrışmasını hesaplıyorlar' - X üzerinde SVD kullanılarak yapılan kodu yeni gösterdiniz mi? - sayısal sorunlar önce bilgi işlem kovaryans matrisine (C olarak adlandırın) sonra C'nin özvektörlerini bulur
seanv507

@ seanv507 2. soru ile ilgili olarak - sanırım scipy.linalg.svd (X), veya X ve X X T'nin öz ayrışmasını yaparak svd'yi hesaplar . Aynı şey linalg.svds (X) için. Alıntı: "hızlı bir randomize SVD çözücü ve (X * XT) veya (XT * X) üzerinde bir eigensolver olarak ARPACK kullanan bir" naif "algoritma". Ayrıca docs.scipy.org/doc/scipy/reference/generated/… adresindeki son satıra bakın . İlk alıntıyı anlamanın tek yolu, randomize algoritmanın kovaryans / gram matrisini hesaplamayan tek algoritma olmasıdırXT*XX*XT
drake

1
XXtimes()Xt_times()

@ GeoMatt22 Yorumunuzu biraz ayrıntılandırabilir misiniz? ARPACK veya LAPACK yaklaşımlarının kovaryans matrisini hesaplamaları gerekmediği için sayısal kararsızlıktan muzdarip olduğunu mu söylüyorsunuz?
drake

Yanıtlar:


13

PCA ve TruncatedSVD scikit-learn uygulamaları tamamen aynı algoritma gibi görünüyor.

Hayır: PCA ortalanmış verilerde (kesilmiş) SVD'dir (özellik başına ortalama çıkarma ile). Veriler zaten ortalanmışsa, bu iki sınıf da aynısını yapar.

Pratikte TruncatedSVD, bellek kullanımını patlatmadan ortalanamayan büyük seyrek veri kümelerinde yararlıdır.

  • numpy.linalg.svdve scipy.linalg.svdher ikisi de burada açıklanan LAPACK _GESDD'ye güveniyor: http://www.netlib.org/lapack/lug/node32.html (bölme ve fethetme sürücüsü)

  • scipy.sparse.linalg.svdsXT'nin öz değeri ayrışması için ARPACK'e dayanır. X veya X. Arnoldi iterasyon yöntemi ile XT (verilerin şekline bağlı olarak). ARPACK'in HTML kullanıcı kılavuzunda, hesaplama ayrıntılarını gizleyen kırık bir biçimlendirme vardır, ancak Arnoldi yinelemesi wikipedia'da iyi açıklanmıştır: https://en.wikipedia.org/wiki/Arnoldi_iteration

Scipy'de ARPACK tabanlı SVD'nin kodu:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (kaynak kodda satır değişikliği durumunda "def svds" dizesini arayın ).


2
Biri seyrek verileri verimli bir şekilde destekleyebilir (TruncatedSVD), diğeri (PCA) destekleyemez. Bu yüzden 2 dersimiz var.
ogrisel

1
Sebep bu ise, karışıklığı önlemek için onlara SVD ve SparseSVD (veya benzeri) diyebilirim.
drake

2
Ancak insanlar PCA istiyor ve PCA'nın sadece merkezlenmiş verilerde SVD olduğunu bilmiyor olabilirler.
ogrisel

5
@ drake "Prosedürler farklıdır (PCA kovaryans matrisi ve SVD veri matrisi kullanır)" fikrine katılmıyorum. PCA, analiz türü için bir isimdir. Bunu gerçekleştirmek için farklı algoritmalar ve uygulamalar kullanılabilir. Cov matrisinin EIG bir yöntemidir, ortalanmış veri matrisinin SVD'si başka bir yöntemdir ve daha sonra EIG ve SVD çeşitli yöntemlerle de gerçekleştirilebilir. Önemli değil - hepsi PCA.
amip

1
@amoeba Terminolojiye ilişkin açıklama / düzeltme için teşekkür ederiz. SVD ve EIG'nin PCA'dan daha geniş bir kapsama sahip cebirsel teoremler / yöntemler olduğu söylediklerim bana daha anlamlı geliyor
drake
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.