CPP Eigen ve Python Numpy ile PCA Gerçeklemesi

Sıddık Açıl
May 19, 2019 · 4 min read
Filter’ın harika şarkılarından

Bu yazımızda CPP dilinin sıkça kullanılan lineer cebir kütüphanesi Eigen ile çalışıp Principal Component analizini gerçekleyeceğiz. Eigen kütüphanesi, PCL gibi robotik ve bilgisayarlı görü alanında çokca kullanılan kütüphanelerin lineer cebir altyapısını sağlıyor. Bu bağlamda bir çok araştırıcı tarafından kullanılmış ve test edilmiş bir kütüphanedir. Bu yazıda Eigen kütüphanesinin yeteneklerini sizlerle paylaşmak istedim. Bunun için de PCA algoritmasının gerçeklemesini, içinde bir çok temel lineer cebir operasyonunu içerdiğinden örnek olarak seçtim.

Eigen ile Çalışmak

Kurulum

VCPKG kurulumunuz mevcutsa aşağıdaki komutlarla Eigen kütüphanesini projenize dahil edebilirsiniz.

vcpkg integrate install
vcpkg install eigen3

Kurulumu Deneyelim

Karmaşık bir örneğe geçmeden temel bir örnek üzerinde kütüphaneyi deneyelim:

2x2'lik bir matris

PCA

PCA, istatistik, ekonometri ve veri bilimi alanlarında çokca kullanılan bir tekniktir. Bu teknikteki asıl amaç veriyi ifade eden Principal Component (PC) ismi verilen vektörlerin hesabıdır. Analiz sonucu elde edilen her vektöre karşılık gelen bir eigenvalue bulunmaktadır. Eigenvalue değerinin büyüklüğü o PC doğrultusundaki varyansın bir ölçüsüdür. Yani eigenvalue ne kadar büyükse o doğrultuda veri kümenizin yayılımı o kadar fazladır.

PCA ile indirgeme PC ve karşılık gelen eigenvalue’lara bağlı olarak veri kümesinin boyutunu indirgemeye denir. Bilgi teorisinden varyans, çeşitlilik ve dağılım gibi ölçütler bilginin ayırt edilebilirliğine işaret eder. Misalen, İstanbul’da havanın güneşli olması bir haber değeri taşırken Sahra Çölü’nde havanın güneşli olması o kadar da önemli bir durum değildir. Bunun sebebi İstanbul içindeki hava durumunun çeşitliliğinin ve varyansının çöle göle daha fazla olmasıdır. Yani varyansın fazla olduğu yerler daha önemli bilgi niteliği taşırlar. Veri kümesi içindeki sütunlar için de durum böyledir. Varyansın fazla olduğu sütunlar bizim için ayırt ediciliği sağlayan sütunlardır. Bu durumu veri kümesini indirgeyip veri işleme hızımızı arttırmak için kullanabiliriz. Verinin toplam varyansına en çok katkıda bulunan sütunlara ait PC vektörlerini alıp veri kümesini daha az boyutlu bir uzaya projekte edecek matrisi oluşturabiliriz.

Algoritmanın aşamalarını ve her aşamadaki sonuçları kodları ve ekran görüntüleri ile paylaştım.

Aşama 1: Aritmetik Ortalama

Elimizdeki verideki her sütunun ortalamasını çıkarmalıyız.

Eigen ile aritmetik ortalama işlemi

Aşama 2: Centering(Merkezleme)

Verideki her sütundan sütunun ortalamasını çıkaralım:

Veri temizleme aşamasında sıkça kullanılan Merkezleme işlemi

Aşama 3: Kovaryans Matrisi

Oluşan verinin sütunlarının kovaryans matrisini çıkaralım. Kovaryans matris, matrisin adjoint matrisi ile kendisinin çarpımının satır sayısına bölümünden eldesidir.

Kovaryans matrisinin hesaplanması

Aşama 4: Eigenvector Ayrıştırması

Kovaryans matrisinin eigenvector ve eigenvalue değerlerini bulalım. Eigen bize bir çok EigenSolver sunuyor. Burada SelfAdjointEigenSolver çözücüsünü kullandık. Elimizdeki matris Hermisyen, yani Self Adjoint, bir matris olduğu için bu çözücü ile hızlıca eigenayrıştırması hesaplaması yapabiliriz.

Hermisyen matris tanımı için:

Eigenvektör ve eigenvalue hesabı

Aşama 5: Eigenvector Seçimi ve Projeksiyon Matrisinin Oluşturulması

Bu aşama PCA algoritmasının en can alıcı kısmı. Kovaryans matrisinin eigenvalue değerleri o sütunun verideki toplam varyansa katkısının bir ölçütü. PCA’in boyut indirgemede kullanılma amacı da en çok varyansa sahip k kadar özniteliği(sütun) seçmektir. En önemli Eigenvectorler seçildikten sonra bu vektörlerden oluşan bir matris ile veri matrisimizi çarparak indirgemeyi gerçekleştirebiliriz. Bu işleme projeksiyon, matrise de projeksiyon matrisi denir.

Aşama 6: Projeksiyon işlemi ve PCA ile Boyut İndirgemenin Tamamlanması

auto result = centered * projection_matrix;

Matris çarpımının yapılması yeterlidir. Sonuç:

Colab üzerinden aynı PCA indirgemesini deneyip sonucu teyit edelim. Sonra bu aşamaları Python ve Numpy kullanarak gerçekleyelim.

Bir başka yazıda görüşmek üzere.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade