Cara melakukan pengurangan dimensionalitas dengan PCA di R

30

Saya memiliki dataset besar dan saya ingin melakukan pengurangan dimensionalitas.

Sekarang di mana-mana saya membaca bahwa saya dapat menggunakan PCA untuk ini. Namun, saya masih belum mendapatkan apa yang harus dilakukan setelah menghitung / melakukan PCA. Dalam R ini mudah dilakukan dengan perintah princomp.

Tetapi apa yang harus dilakukan setelah menghitung PCA? Jika saya memutuskan ingin menggunakan komponen utama pertama , bagaimana cara mengurangi dataset saya dengan tepat?100

Floris Devriendt
sumber
Pertanyaan ini tidak terlalu jelas (100 PC adalah set data dengan dimensi yang diperkecil), tetapi secara khusus tentang merekonstruksi variabel asli (topik jawaban yang diterima) lihat juga: Bagaimana membalikkan PCA dan merekonstruksi variabel asli dari beberapa komponen utama?
Amuba kata Reinstate Monica

Jawaban:

35

Saya percaya apa yang Anda maksudkan dalam pertanyaan Anda berkaitan dengan pemotongan data menggunakan sejumlah kecil komponen utama (PC). Untuk operasi seperti itu, saya pikir fungsinya prcomplebih ilustratif karena lebih mudah untuk memvisualisasikan perkalian matriks yang digunakan dalam rekonstruksi.

Pertama, berikan dataset sintetis Xt,, Anda melakukan PCA (biasanya Anda akan memusatkan sampel untuk menggambarkan PC terkait dengan matriks kovarians:

#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)

Di hasil atau prcomp, Anda dapat melihat PC ( res$x), nilai eigen ( res$sdev) yang memberikan informasi tentang besarnya masing-masing PC, dan pemuatan ( res$rotation).

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

Dengan mengkuadratkan nilai eigen, Anda mendapatkan perbedaan yang dijelaskan oleh setiap PC:

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

Terakhir, Anda dapat membuat versi data terpotong dengan hanya menggunakan PC terkemuka (penting):

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)

Anda dapat melihat bahwa hasilnya adalah matriks data yang sedikit lebih halus, dengan fitur skala kecil disaring:

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()

masukkan deskripsi gambar di sini

Dan berikut ini adalah pendekatan yang sangat mendasar yang dapat Anda lakukan di luar fungsi prcomp:

#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

Sekarang, memutuskan PC mana yang akan dipertahankan adalah pertanyaan terpisah - yang saya tertarik beberapa waktu lalu . Semoga itu bisa membantu.

Marc di dalam kotak
sumber
2
Marc, Anda tidak perlu mencatat pusat dan skala secara eksplisit, prcompapakah itu untuk Anda. Lihatlah res$centerdan res$scale. IMHO, lebih sedikit kesalahan cenderung untuk menggunakan ini (tidak ada perbedaan tidak disengaja tentang pemusatan atau tidak / penskalaan atau tidak antara panggilan eksplisit ke scaledan prcomppanggilan).
cbeleites mendukung Monica
1
Jawaban ini perlu diperluas karena tidak menjawab pertanyaan OP tentang what to do after calculating the PCAatau how do I reduce my dataset exactly? Mengingat bahwa OP telah melakukan PCA pada sampelnya, pertanyaannya adalah apa yang harus dilakukan dengannya, dan apa yang sebenarnya terjadi dengan subsampel ini; bukan bagaimana melakukan PCA. Kami mungkin juga mengusulkan melakukan E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsuntuk mendapatkan cara lain untuk mendapatkan skor juga (yang sebenarnya apa yang dilakukanompomp stats:::princomp.default).
usεr11852 mengatakan Reinstate Monic
1
@ user11852 - pertanyaannya secara khusus mengacu pada pengurangan set data (yaitu pemotongan yang telah saya tunjukkan di sini). Saya akan menyerahkannya kepadanya untuk memutuskan apakah ini yang ia cari atau tidak.
Marc di dalam kotak
1
@ Mark, terima kasih atas tanggapannya. Saya pikir saya mungkin perlu melangkah mundur dan membaca kembali semuanya lagi, karena saya terjebak pada bagaimana salah satu jawaban di atas berkaitan dengan pengurangan dimensi. Karena ketika Anda menunjukkan, redup (trunc) = redup (Xt). Apa manfaatnya, dimensi tidak berkurang.
B_Miner
2
@ B_Miner - Perlu diingat bahwa pemotongan digunakan untuk fokus pada pola utama dalam data dan untuk menyaring pola skala kecil dan kebisingan. Data terpotong tidak lebih kecil dalam hal dimensi itu, tetapi "bersih". Namun, pemotongan memang mengurangi jumlah data sehingga seluruh matriks dapat direkonstruksi hanya dengan beberapa vektor. Contoh yang bagus adalah dalam penggunaan PCA untuk kompresi gambar, di mana sejumlah kecil PC dapat digunakan untuk merekonstruksi gambar. Subset vektor yang lebih kecil ini membutuhkan lebih sedikit memori, tetapi rekonstruksi akan memiliki beberapa kehilangan dalam detail skala kecil.
Marc di dalam kotak
3

Jawaban-jawaban lain ini sangat bagus dan terperinci, tetapi saya bertanya-tanya apakah Anda benar-benar mengajukan pertanyaan yang jauh lebih mendasar: apa yang Anda lakukan setelah memiliki PC?

Setiap PC hanya menjadi variabel baru. Katakanlah PC1 menyumbang 60% dari total variasi dan PC2 menyumbang 30%. Karena 90% dari total variasi yang dicatat, Anda bisa menggunakan dua variabel baru ini (PC) sebagai versi sederhana dari variabel asli Anda. Ini berarti menyesuaikannya dengan model, jika itu yang Anda minati. Ketika tiba saatnya untuk menginterpretasikan hasil Anda, Anda melakukannya dalam konteks variabel asli yang berkorelasi dengan setiap PC.

Maaf jika saya meremehkan ruang lingkup pertanyaan!

atrichornis
sumber
2

sayaλsayaΣk=1halλkhalhal=784λ

Praktis dengan PCA Anda menggunakan proyeksi PC ("skor") sebagai data pengganti untuk sampel asli Anda. Anda melakukan semua analisis Anda pada skor, dan setelah itu Anda merekonstruksi sampel asli Anda kembali menggunakan PC untuk mencari tahu apa yang terjadi pada ruang asli Anda (itu pada dasarnya Komponen Utama Regresi ). Jelas, jika Anda dapat menerjemahkan juru eigen Anda dengan bermakna ("memuat") maka Anda berada dalam posisi yang lebih baik: Anda dapat menggambarkan apa yang terjadi pada sampel Anda dalam mode variasi yang disajikan oleh pemuatan tersebut dengan melakukan inferensi pada pemuatan itu secara langsung dan sama sekali tidak peduli dengan rekonstruksi. :)

Secara umum apa yang Anda "setelah menghitung PCA" tergantung pada target analisis Anda. PCA hanya memberi Anda sub-sampel yang bebas linear dari data Anda yang optimal berdasarkan kriteria rekonstruksi RSS. Anda mungkin menggunakannya untuk klasifikasi, atau regresi, atau keduanya, atau seperti yang saya sebutkan, Anda mungkin ingin mengenali mode variasi ortogonal yang bermakna dalam sampel Anda.

Sebuah komentar : Saya pikir cara naif terbaik untuk memutuskan jumlah komponen yang akan dipertahankan adalah dengan mendasarkan estimasi Anda pada beberapa ambang batas variasi sampel yang ingin Anda pertahankan dalam sampel dimensi yang diperkecil daripada hanya beberapa nomor acak misalnya. 3, 100, 200. Seperti yang dijelaskan oleh user4959, Anda dapat memeriksa variasi kumulatif itu dengan memeriksa bidang yang relevan dari daftar di bawah $loadingsbidang dalam objek daftar yang dihasilkan oleh princomp.

usεr11852 kata Reinstate Monic
sumber
1
Seperti yang Anda sebutkan Regresi Komponen Utama, dalam R yang disediakan oleh paket pls. Adapun jumlah komponen untuk mempertahankan, saya tidak melihat keuntungan nyata dari memutuskan% varians daripada tidak. komponen (mungkin itu karena saya bekerja dengan data yang memiliki tingkat kebisingan yang sangat berbeda. Seperti yang disebutkan oleh @ Marc-in-the-box, ada banyak pendekatan yang berbeda untuk menentukan jumlah PC yang sesuai, dan strateginya akan ( harus) tergantung pada tipe data dan pada tipe analisis data yang akan diikuti
cbeleites mendukung Monica
plsprincomp {stats}KKDD
1
ya, itu naif. Saya tidak setuju bahwa pengaturan% sewenang-wenang dari varians yang dijelaskan memiliki keunggulan intrinsik dari setiap cut-off sewenang-wenang lainnya. Tapi bagaimanapun juga tidak layak diperjuangkan tentang hal ini karena) OP tidak pernah meminta saran tentang memilih no. untuk menjaga PC dan b) Saya pikir kami setuju bahwa inspeksi yang tepat untuk model PCA harus dilakukan.
cbeleites mendukung Monica
Tidak masalah; itu hanya komentar yang saya buat sebelum jawaban saya. (Saya akan menempatkan paragraf komentar saya terakhir karena saya pikir itu membingungkan daripada mengklarifikasi apa yang ingin saya katakan)
usεr11852 mengatakan Reinstate Monic
0

Setelah melakukan PCA maka Anda dapat memilih dua komponen pertama dan plot .. Anda dapat melihat variasi komponen menggunakan plot scree di R. Juga menggunakan fungsi ringkasan dengan memuat = T Anda dapat membuat sirip variasi fitur dengan komponen.

Anda juga dapat melihat http://www.statmethods.net/advstats/factor.html ini dan http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Cobalah untuk memikirkan apa yang Anda inginkan. Anda dapat menafsirkan banyak hal dari analisis PCA.

Abhik terbaik

pengguna4959
sumber