R PCA ile boyutsallık azaltma nasıl yapılır


30

Büyük bir veri kümem var ve boyutsallık azaltma yapmak istiyorum.

Şimdi her yerde bunun için PCA kullanabileceğimi okudum. Bununla birlikte, PCA'yı hesapladıktan / uyguladıktan sonra ne yapacağımı hala anlamadım. R'de bu komutla kolayca yapılabilir princomp.

Fakat PCA'yı hesapladıktan sonra ne yapmalı? İlk ana bileşeni kullanmak istediğime karar verirsem , veri setimi tam olarak nasıl azaltabilirim?100


Bu soru (100 PC'ler çok net değil olan azaltılmış boyutluluk sizin veri kümesi), ancak özellikle de orijinal değişkenleri (kabul cevabın konusu) bkz yeniden hakkında: PCA ters ve birkaç temel bileşenlerden orijinal değişkenleri yeniden nasıl?
amip diyor Reinstate Monica

Yanıtlar:


35

Sorunuzda ne elde edeceğinize, daha az sayıda ana bileşen (PC) kullanarak verilerin kesilmesiyle ilgili olduğuna inanıyorum. Bu tür işlemler için, prcompyeniden yapılanmada kullanılan matris çarpımını görselleştirmenin daha kolay olması nedeniyle fonksiyonun daha açıklayıcı olduğunu düşünüyorum.

İlk önce, sentetik bir veri seti verin Xt, PCA'yı uygulayın (tipik olarak PC'leri bir kovaryans matrisi ile ilgili tanımlamak için numuneleri ortalarsınız:

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

Sonuçlarda veya prcompPC'lerin ( res$x), res$sdevher bir bilgisayarın büyüklüğü ve yükler ( res$rotation) hakkında bilgi veren özdeğerlerini ( ) görebilirsiniz.

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

Özdeğerleri karelerek, her bir PC tarafından açıklanan varyansı elde edersiniz:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

Son olarak, yalnızca önde gelen (önemli) bilgisayarları kullanarak verilerinizin kesilmiş bir sürümünü oluşturabilirsiniz:

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

Küçük ölçek özellikleri filtrelenmiş olarak, sonucun biraz daha yumuşak bir veri matrisi olduğunu görebilirsiniz:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

görüntü tanımını buraya girin

Ve burada prcomp işlevinin dışında yapabileceğiniz çok basit bir yaklaşım var:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

Şimdi, hangi bilgisayarları tutacağınıza karar vermek ayrı bir soru - bir süre önce ilgilendiğim bir soru . Umarım yardımcı olur.


2
Marc, merkezi kaydetmene ve net bir şekilde ölçeklendirmene gerek yok, prcompbunu senin için yapıyor. Göz at res$centerve res$scale. IMHO bu (için açık çağrısı arasında ortalama veya olmasın / ölçekleme veya olmasın hakkında hiçbir kazara fark kullanmak daha az hata eğilimli scaleve prcompçağrı).
cbeleites destekler Monica

1
Yaklaşık OP'ın sorulara cevap vermez, çünkü bu cevap genişleme ihtiyacı what to do after calculating the PCAya how do I reduce my dataset exactly? OP'nin PCA'yı numunesi üzerinde yürüttüğü göz önüne alındığında, sorusu onunla ne yapılacağı ve gerçekte bu alt örneklerle olanları; PCA nasıl yapılır. E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsAyrıca puanları almak için başka bir yol daha elde etmeyi önerebiliriz (bu aslında princomp'un yaptığı şeydir stats:::princomp.default).
usεr11852 Reinstate Monic diyor

1
@ user11852 - soru özellikle veri setinin azaltılmasına atıfta bulunuyor (yani burada gösterdiğim kısma). Aradığı şeyin bu olup olmadığına karar vermesini ona bırakacağım.
Marc,

1
@Marc, cevap için teşekkürler. Geri adım atıp her şeyi tekrar okumam gerekebileceğini düşünüyorum, çünkü yukarıdaki yanıtlardan herhangi birinin boyutsallığı azaltma ile nasıl başa çıktığı konusunda sıkışıp kaldım. Çünkü gösterdiğiniz gibi, dim (trunc) = dim (Xt). Bunun faydası neydi, boyutlar azalmadı.
B_Miner

2
@B_Miner - Kısaltmanın verilerdeki ana kalıplara odaklanmak ve küçük ölçekli kalıpları ve gürültüyü filtrelemek için kullanıldığını unutmayın. Kesilmiş veriler boyut bakımından daha küçük değil, "temizleyici". Bununla birlikte, kesme, tüm matrisin yalnızca birkaç vektörle yeniden oluşturulabileceği veri miktarını azaltır. Güzel bir örnek, görüntü sıkıştırma için PCA kullanımındadır, burada görüntüyü yeniden oluşturmak için daha az sayıda bilgisayar kullanılabilir. Bu daha küçük vektör alt kümesi daha az bellek kaplar ancak yeniden yapılanma küçük ölçekli ayrıntılarda bir miktar kayba neden olur.
Marc kutuda

3

Bu diğer cevaplar çok iyi ve ayrıntılı, ama gerçekten çok daha temel bir soru sorup sormadığınızı merak ediyorum: PC'niz varsa ne yaparsınız?

Her PC basitçe yeni bir değişken haline gelir. Diyelim ki PC1 toplam varyasyonun% 60’ını, PC2 ise% 30’unu Hesaplanan toplam varyasyonun% 90'ı olduğu için, bu iki yeni değişkeni (PC) basitçe orijinal değişkenlerinizin basitleştirilmiş bir sürümü olarak kabul edebilirsiniz. Bu, eğer ilgilendiğiniz şeyse, onları modellere sığdırmak anlamına gelir. Sonuçlarınızı yorumlamanın zamanı geldiğinde, bunu her bir PC ile ilişkilendirilen orijinal değişkenler bağlamında yaparsınız.

Sorunun kapsamını hafife aldıysam özür dilerim!


2

iλiΣk=1pλkpp=784λ

Pratik olarak PCA ile PC'lerin projeksiyonlarını ("puanlar") orijinal örneğiniz için yedek veri olarak kullanıyorsunuzdur. Tüm analizlerinizi puanlar üzerinde yaparsınız ve daha sonra, orijinal alanınızda ne olduğunu bulmak için PC'leri kullanarak orijinal örneğinizi yeniden yapılandırırsınız (temelde Temel Bileşen Regresyonu ). Açıkçası, özvektörlerinizi ("yükler") anlamlı bir şekilde yorumlayabiliyorsanız, o zaman daha da iyi bir pozisyondasınız: Örneğinize ne olduğunu doğrudan, o yükleme üzerine çıkarım yaparak ve o yükleme tarafından sunulan varyasyon modunda tanımlayabilirsiniz ve yeniden yapılanmayı hiç umursamıyorum. :)

Genel olarak "PCA'yı hesapladıktan sonra" ne yaparsınız analizinizin hedefine bağlıdır. PCA, verilerinizin bir RSS rekonstrüksiyonu ölçütünde en uygun olan doğrusal olarak bağımsız bir alt örneğini size verir. Sınıflandırma veya regresyon için veya her ikisinde de kullanabilirsiniz veya bahsettiğim gibi, numunenizdeki anlamlı dikey modları tanımak isteyebilirsiniz.

Bir yorum : Tutulacak bileşenlerin sayısına karar vermenin en iyi yolunun, tahminde bulunmanızı, örneğin bazı rastgele sayılardan ziyade, küçültülmüş boyutsallık örneğinizde saklamak istediğiniz bir örnek varyasyon eşiğine dayandırmak olduğunu düşünüyorum. 3, 100, 200. Kullanıcı 5959'da açıklandığı gibi, bu kümülatif varyasyonu, tarafından $loadingsüretilen liste nesnesindeki alanın altındaki listenin ilgili alanını kontrol ederek kontrol edebilirsiniz princomp.


1
Asıl Bileşen Regresyonundan bahsettiğiniz gibi, R'de paket tarafından sağlanan pls. Tutulacak bileşenlerin sayısına gelince, hayır üzerinden% sapma belirlemede gerçek bir avantaj görmüyorum. Bileşenlerin (belki de çok farklı gürültü seviyelerine sahip verilerle çalıştığım için olabilir. Kutudaki Marc'ın da belirttiği gibi, uygun bir PC sayısını belirlemek için pek çok farklı yaklaşım vardır ve strateji gerekir) hem tür verilere hem de takip edilecek veri analiz türüne bağlı olmalıdır.
cbeleites, 10

plsprincomp {stats}KKDD

1
evet, saf. Açıklanan varyansın keyfi bir yüzdesini belirlemenin, herhangi bir keyfi kesme işleminin kendine özgü bir avantajı olduğunu kabul etmiyorum. Ancak yine de bu konuda savaşmaya değmez a) OP, hayır seçilmesi hakkında tavsiye istedi. Tutulması gereken PC'ler ve b) Her halükarda PCA modelinin uygun şekilde denetlenmesi gerektiği konusunda hemfikiriz.
cbeleites, 15

Sorun değil; Yine de cevabımdan önce yaptığım bir yorumdu. (Benim yorum paragrafımı son olarak, ne söylemek istediğimi netleştirmek yerine
şaşırtacağını düşündüğüm gibi koyacağım

0

PCA yaptıktan sonra, ilk iki bileşeni ve arsaları seçebilirsiniz. Bileşenlerin varyasyonunu, R'deki bir kaygan arsa kullanarak görebilirsiniz. Ayrıca, loadings = T ile özet fonksiyonunu kullanarak, özelliklerin varyasyonunu bileşenlerle kaplayabilirsiniz.

Ayrıca bu http://www.statmethods.net/advstats/factor.html ve http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf adresine de bakabilirsiniz.

Ne istediğini düşünmeye çalış. PCA analizinden birçok şeyi yorumlayabilirsiniz.

En İyi Abhik

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.