Genel Bakış
Bu makale temel olarak boyutsallık azaltma yöntemi olan PCA'yı (Temel Bileşen Analizi) tanıtmaktadır. Boyut azaltma, üç tür sorunu çözmeye kendini adamıştır:
Aşağıda, PCA'nın boyut azaltma etkisini üç açıdan anlayacağız: giriş, hesaplama adımları ve uygulama.
PCA tanıtımı
Özellik çıkarma ve işlemeyi anlarken, yüksek boyutlu özellik vektörlerini içeren problemler genellikle boyutsallık felaketine düşmeye eğilimlidir. Veri setinin boyutsallığı arttıkça, algoritma öğrenimi için gerekli örnek sayısı katlanarak artmaktadır. Bazı uygulamalarda bu kadar büyük veriyle karşılaşmak çok dezavantajlıdır ve büyük veri setinden öğrenmek daha fazla bellek ve işlem gücü gerektirir. Ek olarak, boyutsallık arttıkça, verilerin seyrekliği de gittikçe artacaktır. Aynı veri kümesini yüksek boyutlu bir vektör uzayında incelemek, aynı seyrek veri kümesine göre daha zordur.
Ana bileşen analizi, Karhunen-Loeve Dönüşümü (Karhunen-Loeve Dönüşümü) olarak da adlandırılır. , Yüksek boyutlu veri yapılarını keşfetmek için kullanılan bir teknolojidir. PCA genellikle yüksek boyutlu veri setlerinin araştırılması ve görselleştirilmesi için kullanılır. Ayrıca veri sıkıştırma, veri ön işleme vb. İçin de kullanılabilir. PCA, potansiyel olarak ilişkilendirilmiş yüksek boyutlu değişkenleri, ana bileşenler adı verilen doğrusal bağımsız düşük boyutlu değişkenlere sentezleyebilir. Yeni düşük boyutlu veri seti, orijinal veri değişkenlerini olabildiğince koruyacaktır.
PCA, boyut azaltımı sağlamak için verileri düşük boyutlu bir alt uzaya yansıtır. Örneğin, iki boyutlu bir veri setinin boyutsallık azaltımı, noktaları bir çizgiye yansıtmaktır Veri setinin her örneği bir değerle temsil edilebilir ve iki değer gerekli değildir. Üç boyutlu veri seti iki boyutluya indirgenebilir, yani değişkenler bir düzleme eşlenir. Genel olarak, nn boyutlu veri seti haritalama yoluyla kk boyutlu alt uzaya indirgenebilir, burada kn.
Bir çiçek yetiştirme aletleri broşürü için bir fotoğrafçı olduğunuzu ve bir su şişesini fotoğrafladığınızı varsayalım. Su ısıtıcısı üç boyutlu, ancak fotoğraflar iki boyutludur Su ısıtıcısını müşterilere daha kapsamlı göstermek için farklı açılardan birkaç fotoğraf çekmeniz gerekir. Aşağıdaki resim, dört yönden çektiğiniz bir resimdir:
İlk resimde, su ısıtıcısının arkası görülebiliyor, ancak önü görünmüyor. İkinci resim çekimin önüdür, musluğu görebilirsiniz, bu resim ilk resimdeki eksik bilgileri sağlayabilir ancak tencere sapı görünmez. Üçüncü üstten görünümden potun yüksekliği görülemez. Dördüncü resim gerçekten istediğiniz şeydir, su ısıtıcısının yüksekliği, üst kısmı, musluğu ve tutacağı açıkça görülebilir.
PCA'nın tasarım konsepti buna benzer: Mümkün olduğunca çok değişkeni korurken yüksek boyutlu veri setlerini düşük boyutlu uzaya eşleyebilir. PCA rotasyon veri seti, ana bileşenleri ile hizalanır ve çoğu değişken, birinci temel bileşende tutulur. Aşağıdaki şekilde gösterilen veri kümesine sahip olduğumuzu varsayalım:
Veri seti, başlangıç noktasından sağ üst köşeye uzanan uzun ve ince bir elips gibi görünür. Tüm veri kümesinin boyutsallığını azaltmak için noktaları bir doğruya eşlemeliyiz. Aşağıdaki şekildeki iki çizginin tümü veri kümesi tarafından eşlenebilir. En çok hangi örnekle hangi çizgi eşleştirilir?
Açıktır ki, siyah noktalı çizgiye eşlenen numunenin değişimi, kırmızı noktalı çizgiye eşlenen değişiklikten çok daha büyüktür. Aslında, bu siyah kesikli çizgi ilk temel bileşendir. İkinci temel bileşen, birinci temel bileşene dik olmalıdır; bu, ikinci temel bileşenin istatistiksel olarak bağımsız olması gerektiği ve aşağıdaki şekilde gösterildiği gibi, birinci ana bileşene dik yönde görüneceği anlamına gelir:
Sonraki her bir temel bileşen, mümkün olduğu kadar çok sayıda kalan değişkeni de tutacaktır Tek gereksinim, her bir ana bileşenin bir önceki ana bileşene ortogonal olması gerektiğidir. Şimdi veri setinin üç boyutlu olduğunu varsayarsak, dağılım grafiği bir eksen boyunca dönen bir disk gibi görünür.
Bu noktalar, diski tamamen iki boyutlu hale getirmek için döndürülebilir ve dönüştürülebilir. Şimdi bu noktalar bir elips gibi görünüyor.Üçüncü boyutta temelde değişken yoktur ve göz ardı edilebilir. Veri setinin farklı boyutlarındaki varyans dağılımı eşit olmadığında PCA en kullanışlı olanıdır. (Küresel kabuk şeklinde bir veri kümesiyse, PCA etkili bir şekilde çalışamaz, çünkü tüm yönlerdeki varyanslar eşittir; çok fazla bilgi kaybetmeden boyutların hiçbiri göz ardı edilemez).
PCA hesaplama adımları
PCA'yı anlamak için üç önemli temel kavram vardır: Varyans, kovaryans ve kovaryans matrisi
varyans (Varyans), bir veri kümesinin dağılma derecesinin bir ölçüsüdür. Varyans, her bir örnek ile örnek ortalaması arasındaki farkların karelerinin toplamının ortalamasıdır:
Kovaryans (Kovaryans), iki değişkenin değişikliklerinin senkronizasyon derecesini ölçmek, yani iki değişken arasındaki doğrusal korelasyon derecesini ölçmektir.
İki değişkenin kovaryansı 0 ise, istatistiksel olarak iki değişkenin doğrusal olarak bağımsız olduğu kabul edilir. İki ilişkisiz değişkenin tamamen bağımsız olmadığını, ancak doğrusal bir korelasyon olmadığını unutmayın. Aşağıdaki şekilde hesaplanmıştır:
Kovaryans 0'dan büyükse, bir değişkenin arttığı ve bir başka değişkenin de artacağı, yani pozitif bir korelasyon olduğu anlamına gelir, kovaryansın 0'dan küçük olması bir değişkenin arttığı ve bir diğerinin azalacağı anlamına gelir, yani negatif bir korelasyon.
Kovaryans matrisi (Kovaryans matrisi), veri setindeki iki değişkenin kovaryansından oluşur. Matrisin (i, j) (i, j). Elemanı, veri setindeki iith ve jjth elemanlarının kovaryansıdır. Örneğin, üç boyutlu verilerin kovaryans matrisi aşağıdaki gibidir:
Aşağıdaki tablodaki verilerin kovaryans matrisini hesaplayalım:
Python'daki numpy paketi, ortalama ve kovaryansı hesaplar:
numpy'yi np olarak içe aktar
X =
baskı (np.ortalama (X, eksen = 0))
baskı (np.cov (np.array (X) .T))
Üç değişkenin örnek ortalama değerleri sırasıyla 2.125, 0.075 ve -1.275'tir; kovaryans matrisi:
Özvektör ve özdeğer
vektör Büyüklüğü ve yönü olan geometrik bir kavramdır.
Özellik vektörü (Özvektör), aşağıdaki formülü sağlayan bir matristen elde edilen sıfır olmayan bir vektördür:
V özvektör olduğunda, A kare matristir ve özdeğerdir. A dönüşümünden sonra, özvektörün yönü değişmeden kalır, ancak boyutu özdeğerin katları halinde değişmiştir. Başka bir deyişle, bir matris ile çarpılan bir özvektör, özvektörü ölçeklendirmeye eşittir. Almanca eigen kelimesi "ait veya tuhaf" anlamına gelir; matrisin özellik vektörü, veri setine ait olan ve yapısını açıklayan bir vektördür.
Özvektörler ve özdeğerler yalnızca kare matrislerden türetilebilir ve tüm kare matrislerin özvektörleri ve öz değerleri yoktur. Bir matrisin özvektörleri ve özdeğerleri varsa, matrisin her boyutunun bir çift özvektör ve özdeğer vardır. Matrisin temel bileşenleri, karşılık gelen özdeğerlere göre kovaryans matrisinin özvektörlerinin sıralanmasıyla elde edilir. En büyük özdeğer ilk temel bileşendir, ikinci en büyük özdeğer ikinci temel bileşendir ve bu böyle devam eder.
Aşağıdaki matrisin özvektörlerini ve özdeğerlerini hesaplayın:
Özellik vektörü ile çarpılan önceki AA formülüne göre, özellik vektörü ile çarpılan özellik değerine eşit olmalıdır. Çözülecek karakteristik denklemi oluşturuyoruz:
Karakteristik denklemden matrisin çarpımının matris determinantının ve özdeşlik matrisinin ve özdeğerinin 0 olduğu görülebilir:
Matrisin her iki öz değeri de -1'e eşittir. Şimdi özvektörü çözmek için özdeğerini kullanın. = 1'i şuraya getirin:
Almak:
F:
Denklemi karşılayan her şey
Sıfır olmayan vektör (alma
) Özellik vektörleri olarak kullanılabilir:
PCA, L2 normu olan birim özellik vektörünü gerektirir
Özellik vektörü 1'e eşittir.
Daha sonra birim özellik vektörü:
Daha sonra birim özellik vektörü:
Burada, elle hesaplanan özellik vektörünün doğru olup olmadığını kontrol etmek için numpy'yi kullanabilirsiniz. Eig işlevi, bir özdeğer ve özvektör demeti döndürür:
> > > numpy'yi np olarak içe aktar
> > > w, v = np.linalg.eig (np.array ())
> > > print ('Karakteristik değer: {} \ nKarakteristik vektör: {}'. format (w, v))
Çıktı (buradaki özellik değeri, kayan nokta verileri için python derleyicisinin doğruluk gereksinimleri nedeniyle 1'den farklıdır):
Özdeğerler:
Özellik vektörü: >
Boyutsallığı azaltmak için PCA kullanın
Aşağıdaki tablodaki iki boyutlu verileri tek boyutlu hale getirmek için PCA yöntemini kullanalım:
PCA'nın ilk adımı, örnek ortalamasını örnek verilerinden çıkarmaktır:
Ardından, verilerin temel bileşenlerini hesaplıyoruz. Daha önce de belirtildiği gibi, Matrisin temel bileşeni, kovaryans matrisinin özvektörlerinin karşılık gelen öz değerlere göre sıralanmasıyla elde edilir. Temel bileşenler iki şekilde hesaplanabilir: İlk yöntem, veri kovaryans matrisini hesaplamaktır. Kovaryans matrisi bir kare matris olduğundan, özdeğerleri ve özvektörleri hesaplamak için önceki yöntemi kullanabiliriz. İkinci yöntem, kovaryans matrisinin özvektörlerini ve özdeğerlerinin kareköklerini bulmak için veri matrisinin tekil değer ayrışımını kullanmaktır. İlk önce ilk yöntemi tanıtıyoruz, ardından ikinci yöntem olan scikit-learn'ün PCA uygulamasını tanıtıyoruz. Yukarıdaki veri setinin açıklayıcı değişken kovaryans matrisi aşağıdaki gibidir:
Yukarıda açıklanan yöntemi kullanarak, özdeğerler 1.25057433 ve 0.03398123'dür ve birim özvektör:
Aşağıda verileri temel bileşenlerle eşleştiriyoruz. İlk temel bileşen, en büyük öz değere karşılık gelen özvektördür, bu nedenle her bir sütunu ana bileşenin özvektörü olan bir dönüşüm matrisi oluşturmalıyız. 5 boyutlu veriyi 3 boyutluya düşürmek istiyorsak, dönüşüm matrisi olarak 3 boyutlu bir matris kullanmamız gerekir. Bu örnekte, iki boyutlu verilerimizi tek boyutlu olarak eşleyeceğiz, bu nedenle özellik vektöründeki ilk temel bileşeni dönüşüm matrisi olarak kullanmamız gerekiyor. Son olarak, dönüşüm matrisini veri matrisiyle çarpıyoruz. Aşağıdaki, ilk temel bileşen eşlemesinin sonucudur:
Numpy paketindeki matrix çağrısı aracılığıyla uygulama süreci aşağıdaki gibidir:
numpy'yi np olarak içe aktar
x = np.mat (,
>)
x = x.T
T = x-x.ortalama (eksen = 0)
C = np.cov (x.T)
w, v = np.linalg.eig (C)
v_ = np.mat (v) # Her özellik değeri, özellik matrisinin her bir sütun vektörüne karşılık gelir
v_ = v_.T # Varsayılan olarak, bir satır vektörü olarak kaydedilir ve formülde sütun vektör formuna dönüştürülür
y = T * v_
baskı (y)
PCA kullanımı
Yüksek boyutlu veri görselleştirme
İki boyutlu veya üç boyutlu veriler, görselleştirme yoluyla desenleri keşfetmek daha kolaydır. Yüksek boyutlu bir veri seti grafiksel olarak gösterilemez, ancak onu iki boyutlu veya üç boyutlu verilere indirgeyerek, boyut azaltma yöntemleriyle görselleştirebiliriz. Fisher, 1936'da üç çeşit süsen (Iris Data) topladı: Setosa, Virginica ve Versicolour. Açıklayıcı değişken, yaprakların ve çanak yaprakların uzunluk ve genişliğinin ölçülen değeridir ve yanıt değişkeni çiçeğin türüdür. İris veri seti genellikle sınıflandırma modeli testi için kullanılır ve ayrıca scikit-learn'de de mevcuttur. Kolay görselleştirme için iris veri setini iki boyutlu verilere indirelim:
% matplotlib satır içi
matplotlib.pyplot dosyasını plt olarak içe aktar
sklearn.decomposition'dan içe aktarma PCA
sklearn.datasets'den import load_iris
İlk olarak, iris çiçeği veri setini ve PCA tahmincisini içe aktarıyoruz. PCA sınıfı, ana bileşenlerin sayısını hiperparametre olarak alır. Diğer tahmin ediciler gibi, PCA da azaltılmış boyutluluk veri matrisini döndürmek için fit_transform () kullanır:
data = load_iris ()
y = data.target
X = data.data
pca = PCA (n_components = 2)
azaltılmış_X = pca.fit_transform (X)
Son olarak grafiği çiziyoruz:
red_x, red_y =,
blue_x, blue_y =,
green_x, green_y =,
aralıktaki i için (len (azaltılmış_X)):
eğer y == 0:
red_x.append (indirimli_X )
red_y.append (indirimli_X )
elif y == 1:
blue_x.append (indirimli_X )
blue_y.append (indirimli_X )
Başka:
green_x.append (indirimli_X )
green_y.append (indirimli_X )
plt.scatter (red_x, red_y, c = 'r', işaretçi = 'x')
plt.scatter (blue_x, blue_y, c = 'b', işaretçi = 'D')
plt.scatter (green_x, green_y, c = 'g', işaretçi = '.')
plt.show ()
Boyut azaltma verileri yukarıdaki şekilde gösterilmektedir. Her veri setindeki üç sınıf farklı sembollerle işaretlenmiştir. Bu iki boyutlu veri grafiğinden, bir sınıfın diğer iki örtüşen sınıftan tamamen ayrıldığı açıktır. Bu sonuç, bir sınıflandırma modeli seçmemize yardımcı olabilir.
Yüz tanıma
Şimdi bir yüz tanıma problemini çözmek için PCA kullanalım. Yüz tanıma, bir kişiyi bir fotoğraftan tanımak için kullanılan denetimli bir sınıflandırma görevidir. Bu örnekte, Cambridge Üniversitesi ATT Laboratuvarı'ndan Yüzler Veritabanımız veri kümesini ( kullanıyoruz. Set, 40 kişinin her birinin 10 fotoğrafını içeriyor. Bu fotoğraflar farklı ışık koşullarında çekilmiştir ve her fotoğraftaki ifadeler farklıdır. Fotoğrafların tamamı siyah beyaz ve boyutları 92 x 112 piksel. Bu resimler büyük olmamakla birlikte her resmin piksel yoğunluğuna göre düzenlenen öznitelik vektörü de (92 x 112 =) 10304 boyutuna sahiptir. Bu yüksek boyutlu verilerin eğitimi, fazla uydurmayı önlemek için çok sayıda örnek gerektirebilir. Ve örneklem boyutumuz büyük değil, bu yüzden bu fotoğrafları temsil edecek bazı temel bileşenleri hesaplamak için PCA kullanıyoruz.
Fotoğrafın piksel yoğunluğu matrisini bir vektöre dönüştürebilir ve ardından bir matris oluşturmak için eğitim fotoğraflarının tüm vektörlerini kullanabiliriz. Her bir fotoğraf, veri setinin temel bileşenlerinin doğrusal bir kombinasyonudur. Yüz tanıma teorisinde, bu temel bileşenlere özyüzler denir. Özyüz, yüzün standartlaştırılmış bir bileşeni olarak kabul edilebilir. Veri setindeki her yüz, bazı standart yüzlerin bir kombinasyonu veya özyüzlerin en önemli doğrusal kombinasyonunun bir yaklaşımı ile oluşturulabilir.
os içe aktarma yürüyüşünden, yol
numpy'yi np olarak içe aktar
mahotaları mh olarak içe aktar
sklearn.cross_validation'dan içe aktarma train_test_split
sklearn.cross_validation'dan içe aktarma cross_val_score
sklearn.preprocessing ithalat ölçeğinden
sklearn.decomposition'dan içe aktarma PCA
sklearn.linear_model'den import LogisticRegression
sklearn.metrics'den sınıflandırma içe aktarma
X =
y =
Aşağıda fotoğrafları bir Numpy dizisine aktarıyoruz ve ardından piksel matrisini bir vektöre dönüştürüyoruz:
dir_path, dir_names, file_names in walk ('C: / Users / HLB / Desktop / first blog / att_faces /'):
#Walk () işlevi verilerin mutlak yolunu saklar ve eğik çizginin yönüne dikkat eder.
file_names içindeki fn için:
fn == 'pgm' ise:
image_filename = yol.join (dir_path, fn)
X.append (ölçek (mh.imread (resim_dosyaadı, as_grey = Doğru) .reshape (10304) .astype ('float32')))
y.append (dir_path)
X = np.array (X)
Ardından, eğitim setini ve test setini oluşturmak için çapraz kontrolü kullanırız ve eğitim setinde PCA'yı kullanırız:
X_train, X_test, y_train, y_test = train_test_split (X, y)
pca = PCA (n_components = 150)
Tüm numuneleri 150 boyuta indirip ardından lojistik regresyon sınıflandırıcı eğitiyoruz. Veri seti 40 sınıf içerir; scikit-learn'ün alt katmanı, ikili sınıflandırıcı oluşturmak için otomatik olarak bire karşı tüm stratejiyi kullanır:
X_train_reduced = pca.fit_transform (X_train)
X_test_reduced = pca.transform (X_test)
print ('Eğitim seti verilerinin orijinal boyutu: {}'. format (X_train.shape))
print ('PCA boyutsallığının azaltılmasından sonraki eğitim seti verileri: {}'. format (X_train_reduced.shape))
sınıflandırıcı = LogisticRegression ()
doğruluklar = cross_val_score (sınıflandırıcı, X_train_reduced, y_train)
Eğitim seti verilerinin orijinal boyutu: (300, 10304) PCA boyutsallığının azaltılmasından sonraki eğitim seti verileri: (300, 150)
Son olarak, sınıflandırıcının performansını değerlendirmek için çapraz doğrulama ve test setleri kullanıyoruz. Sınıflandırıcının ortalama kapsamlı değerlendirme indeksi (F1 puanı) 0.88'dir, ancak eğitilmesi daha fazla zaman alır ve daha fazla eğitim örneği içeren uygulamalarda daha yavaş olabilir.
print ('Çapraz doğrulama doğruluk oranı: {} \ n {}'. format (np.ortalama (doğruluklar), doğruluklar))
classifier.fit (X_train_reduced, y_train)
tahminler = sınıflandırıcı.predict (X_test_reduced)
baskı (sınıflandırma_raporu (y_test, tahminler))
Nihai analiz sonucu:
Özet
Bu makale temel olarak PCA boyutsallığı azaltma problemini tanıtmaktadır. Yüksek boyutlu veriler kolayca görselleştirilemez. Tahminci yüksek boyutlu veri setleri üzerinde eğitim aldığında boyutsal felaketler de meydana gelebilir. Bu problemleri hafifletmek için temel bileşen analizi yöntemi kullanılır ve olası açıklayıcı değişkenlerin korelasyonlu yüksek boyutlu veri seti, verilerin düşük boyutlu bir altuzay ile eşleştirilmesiyle doğrusal olarak bağımsız düşük boyutlu bir veri setine indirgenir. Son olarak, PCA, görselleştirme için dört boyutlu iris veri setini iki boyutlu verilere indirgemek için kullanılır ve PCA, bir yüz tanıma sisteminde kullanılır.