SVD ve PCA büyük verilerle nasıl yapılır?


29

Çok büyük miktarda veriye sahibim (yaklaşık 8GB). Analiz etmek için makine öğrenmeyi kullanmak istiyorum. Bu nedenle, verimlilik için veri boyutsallığını azaltmak için önce SVD'yi, sonra PCA'yı kullanmam gerektiğini düşünüyorum. Ancak, MATLAB ve Octave, bu kadar büyük bir veri setini yükleyemiyor.

SVD'yi bu kadar büyük miktarda veriyle yapmak için hangi araçları kullanabilirim?


Merhaba ve DS'ye hoş geldiniz! Belki veri kümenizi biraz detaylandırabilirsiniz. Kaç tane satır ve sütununuz var? Bunun olası çözümler üzerinde etkisi olabilir.
S. Kolassa - Monica

23711341 satır ve 8 sütun. 1-2 sütunu çıkarmayı deneyebilirim. Benim sorunumla alakalı görünmüyorlar.
David S.

Buradaki sütunlardan önce satırları örneklemelisiniz. Veri boyutunu küçültmek için rastgele satırları örneklememenin bir nedeni var mı? Buradaki satırların kullanıcılarla veya bir şeyle ilgili olduğunu farz ediyorum
cwharland

Üzgünüm kendimi netleştirmediysem. Amacım PCA yapmak. Örnek verilerdeki SVD'nin PCA yapmamda bana yardımcı olamayacağını düşünüyorum.
David S.

PCA genellikle kovaryans matrisi üzerindeki SVD hesaplanarak uygulanır. Kovaryans matrisinin hesaplanması utanç verici derecede paralel bir iştir, bu nedenle kayıt sayısı ile kolayca ölçeklendirilmelidir.
Anony-Mousse

Yanıtlar:


41

Her şeyden önce, çok değişkenli boyutlara sahipseniz ve veri noktalarını yeni ortogonal temellere döndürerek ve yalnızca en büyük varyansa sahip eksenleri alarak sorun boyutunu azaltmak istediğinizde , boyutluluk azaltma kullanılır . 8 değişkenle (sütunlar) alanınız zaten düşük boyutludur, değişken sayısını azaltmak, bellek boyutuyla teknik sorunları çözme olasılığı düşüktür, ancak veri kümesi kalitesini çok fazla etkileyebilir. Somut durumda, çevrimiçi öğrenmeye bakmak daha umut vericiyöntemleri. Kabaca konuşmak gerekirse, tüm veri kümesiyle çalışmak yerine, bu yöntemler bir zamanlar (genellikle "küçük gruplar" olarak adlandırılır) bir kısmını alır ve adım adım bir model oluşturur. (Şahsen "çevrimiçi" kelimesini İnternet üzerinden Twitter üzerinden veri aktarımı yapmak için sonsuz uzun veri kaynaklarına referans olarak yorumlamayı seviyorum, ki burada tüm veri kümesini bir kerede yükleyemezsiniz).

Peki ya PCA gibi boyutsallık azaltma tekniğini belleğe sığmayan bir veri setine gerçekten uygulamak istiyorsanız? Normal olarak, bir veri kümesi, bir veri matrisi olarak temsil edilir X boyutu arasında n x m , n, gözlem (satırlar) ve sayısı olan m değişkenleri (sütun) bir sayıdır. Tipik olarak hafıza ile ilgili problemler bu iki sayının sadece birinden gelir.

Çok fazla gözlem (n >> m)

Eğer varsa çok fazla gözlemleri , ancak değişken sayısı orta küçük arasındadır yapabilirsiniz aşamalı kovaryans matrisi oluşturmak . Gerçekten de, tipik bir PCA boyutu bir kovaryans matrisi inşa oluşur m x m ve buna tekil değer ayrışımı uygulanması. İle m türü float64 ait = 1000 değişken bir kovaryans matrisi SVD ile kullanılabilecek belleğe kolayca uyan ve büyüklüğü 1000 * 1000 x 8 ~ 8 MB sahiptir. Bu nedenle, kovaryans matrisini sadece tüm veri setini belleğe yüklemeden oluşturmak yeterlidir - oldukça izlenebilir bir görev .

Alternatif olarak, veri kümenizden küçük bir temsilci örneği seçebilir ve kovaryans matrisini yaklaşık olarak belirleyebilirsiniz . Bu matris normal olarak aynı özelliklere sahip olacak, sadece biraz daha az doğru.

Çok fazla değişken (n << m)

Diğer yandan, bazen çok fazla değişkeniniz olduğunda, kovaryans matrisinin kendisi belleğe sığmayacaktır. Örneğin, 640x480 görüntülerle çalışıyorsanız, her gözlem 640 * 480 = 307200 değişkenine sahiptir, bu 703 Gb'lik bir kovaryans matrisine yol açar! Bu kesinlikle bilgisayarınızın hafızasında, hatta kümenizin hafızasında saklamak istediğiniz şey değildir. Bu yüzden, bir kovaryans matrisi oluşturmadan boyutları küçültmemiz gerekiyor.

Bunu yapmak için en sevdiğim yöntem Rastgele Projeksiyon . Eğer veri kümesi varsa Kısacası, X boyutu , n x m , bazı seyrek rasgele matris ile çarpın olabilir R büyüklüğü m x k ile ( k << m ve) yeni matris elde X' bir çok daha küçük boyutta , n x k orijinali ile yaklaşık aynı özelliklere sahip . Neden çalışıyor Öyleyse, PCA'nın ortogonal eksenler kümesini (temel bileşenler) bulmayı ve verilerinizi ilk önce k üzerine yansıtmayı hedeflediğini bilmelisiniz.Bunların Seyrek rastgele vektörlerin neredeyse dik olduğu ve dolayısıyla yeni bir temel olarak kullanılabileceği ortaya çıktı.

Ve tabii ki, tüm veri kümesi çarpma gerekmez X ile Ar - her gözlem çevirebilir x ayrı ayrı ya da mini gruplar halinde yeni bazda içine.

Rastgele SVD adı verilen benzer bir algoritma da var . Bununla ilgili gerçek bir deneyimim yok, ancak burada açıklamalarla birlikte örnek kod bulabilirsiniz .


Sonuç olarak, büyük veri setlerinin boyutsallığı azaltma için kısa bir kontrol listesi:

  1. Çok fazla boyutunuz (değişkeniniz) yoksa, sadece çevrimiçi öğrenme algoritmalarını kullanın.
  2. Çok sayıda gözlem varsa, ancak makul sayıda değişken varsa (kovaryans matrisi belleğe uyar), matrisi adım adım yapılandırın ve normal SVD kullanın.
  3. Değişkenlerin sayısı çok yüksekse, artımlı algoritmalar kullanın.

3
Genel olarak, cevabınızı beğendim ancak açılış cümlesi pek doğru değil. PCA düşük varyanslı birçok boyut için uygun değildir; aksine, korelasyonlu varyanslı birçok boyut için uygundur . Belirli bir veri seti için, varyans tüm boyutlarda yüksek olabilir, ancak yüksek kovaryans olduğu sürece, PCA hala önemli boyutsallık azalması sağlayabilir.
bogatron

1
@bogatron: iyi yakalar, teşekkürler. Aslında, bazı boyutlarda yüksek / düşük varyansa değiniyordum, muhtemelen orijinal olanları değil. Örneğin, bu resimde bu boyutlar orijinal x / y eksenleri yerine 2 okla tanımlanmıştır. PCA bu yeni eksenleri bulmaya çalışır ve bunları her eksen boyunca varyansın değerine göre sıralar. Her neyse, belirttiğin gibi, kötü bir ifade oldu, bu yüzden fikrimi yeniden düzenlemeye çalıştım. Umarım, şimdi daha açıktır.
Arkadaş

Bu bana mantıklı geliyor. +1.
bogatron

7

Rahatsız etme.

Veri biliminde de geçerli olan ilk programlama kuralı: küçük bir test problemi üzerinde çalışan her şeyi elde edin.

bu nedenle 100.000 satır gibi verilerinizin rastgele bir örneğini alın. Farklı algoritmalar vb. deneyiniz. Her şey sizin memnuniyetinize göre çalışıyorsa, daha büyük (ve daha büyük) veri setlerini deneyebilirsiniz - ve daha fazla veri ekledikçe test hatasının nasıl azaldığını görün.

ayrıca svd'yi yalnızca 8 sütuna uygulamak istemezsiniz: çok fazla sütunuz olduğunda uygularsınız.


1
+1, svd'yi yalnızca 8 sütuna uygulamak istemez: çok fazla sütunuz olduğunda uygularsınız.
S. Kolassa - Monica

6

PCA genellikle kovaryans matrisi üzerindeki SVD hesaplanarak uygulanır.

Kovaryans matrisini hesaplamak utanç verici derecede paralel bir görevdir, bu nedenle kayıt sayısı ile doğrusal ölçeklenir ve birden fazla makineye dağıtmak çok önemlidir!

Sadece araçları hesaplamak için verilerinizi iletin. Sonra kovaryans matrisini hesaplamak için ikinci bir geçiş. Bu, harita azaltma işlemiyle kolayca yapılabilir - temel olarak araçların tekrar hesaplanması ile aynıdır. Kovaryanstaki gibi toplam terimler paralelleştirmek için çok önemlidir! Benzer büyüklükteki değerleri toplarken yalnızca sayısal değerlere dikkat etmeniz gerekebilir.

Çok sayıda değişkeniniz olduğunda işler farklılaşır . Ancak 8 GB'lık bir sistemde, PCA'yı BLAS kütüphaneleriyle 20.000 boyutta bellekte çalıştırabilmelisiniz. Ancak, PCA'nın artık bu kadar güvenilir olmaması sorununa girebilirsiniz, çünkü çok fazla serbestlik derecesine sahiptir. Başka bir deyişle: Kolayca donuyor. En az 10 * d * d kayıt yaptırma önerisini gördüm (ya da d ^ 3 idi). Dolayısıyla, 10000 boyut için, sonucun istatistiksel olarak güvenilir olması için en az bir milyar kaydın (10000 boyutun ... çok fazla!) Olması gerekir.


1

Tek bir makinede yapmanıza izin verecek bazı araçlar bulabilmenize rağmen, özellikle veri setinizin büyüyeceğini düşünüyorsanız, Spark gibi "büyük veri" araçlarını göz önünde bulundurmanın mantıklı olduğunu düşünüyorsunuz. Spark, PCA ve SVD'yi destekleyen MLlib adlı bir bileşene sahiptir. Belgelerin örnekleri var .


1

SVD'yi PySpark kullanarak daha büyük bir veri setine uyguladık. Farklı paketlerde tutarlılığı da karşılaştırdık. İşte link.


0

Dosyayı tembelce değerlendirirseniz, minik bir hafıza alanına sahip olacaksınız ve numpy / scipy, Octave / Matlab'ın kullanacağı tüm araçlara erişiminizi sağlayacak.

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.