Як виконати зменшення розмірності за допомогою PCA в R


30

У мене великий набір даних, і я хочу виконати зменшення розмірності.

Зараз скрізь я читаю, що для цього можу використовувати PCA. Однак я все ще не можу отримати, що робити після розрахунку / виконання ПКС. У R це легко зробити за допомогою команди princomp.

Але що робити після розрахунку PCA? Якщо я вирішив використати перші основних компонентів, як точно зменшити свій набір даних?100


Це питання не дуже зрозуміло (100 ПК - це ваш набір даних зі зменшеною розмірністю), але конкретно про реконструкцію вихідних змінних (тема прийнятої відповіді) див. Також: Як повернути PCA та реконструювати оригінальні змінні з кількох основних компонентів?
амеба каже: Відновіть Моніку

Відповіді:


35

Я вважаю, те, що ви отримуєте у своєму запитанні, стосується обрізання даних за допомогою меншої кількості основних компонентів (ПК). Для таких операцій я вважаю, що функція prcompє більш наочною тим, що легше візуалізувати множення матриці, що використовується для реконструкції.

По-перше, дайте синтетичний набір даних, Xtви виконуєте PCA (як правило, ви б центрирували зразки, щоб описати зв'язки ПК з коваріаційною матрицею:

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

В результатах або prcomp, ви можете побачити ПК ( res$x), власні значення ( res$sdev), що дають інформацію про величину кожного ПК та навантаження ( res$rotation).

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

Шматуючи власні значення, ви отримуєте дисперсію, пояснювану кожним ПК:

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

Нарешті, ви можете створити усічену версію своїх даних, використовуючи лише провідні (важливі) ПК:

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)

Ви можете бачити, що результат - це трохи плавніша матриця даних із відфільтрованими функціями невеликого масштабу:

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

введіть тут опис зображення

І ось дуже базовий підхід, який ви можете виконувати поза функцією 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

Тепер, вирішити, які ПК зберігати, - це окреме питання - те, що мене цікавило ще деякий час . Сподіваюся, що це допомагає.


2
Марку, вам не потрібно чітко записувати центр і масштаб, prcompце робить для вас. Погляньте res$centerі res$scale. IMHO менше використовувати схильність до помилок (відсутність випадкових різниць щодо центрування чи не / масштабування чи не між явним викликом scaleта prcompвикликом).
cbeleites підтримує Моніку

1
Ця відповідь потребує розширення, оскільки вона не відповідає на питання ОП щодо what to do after calculating the PCAчи how do I reduce my dataset exactly? Зважаючи на те, що ОП проводила PCA за його зразком, його питання полягає в тому, що з цим робити, і що насправді відбувається з цією підпробою; не як робити PCA. Ми можемо також запропонувати зробити E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsще один спосіб отримати оцінку (що насправді і робить princomp stats:::princomp.default).
usεr11852 повідомляє Відновити Моніку

1
@ user11852 - питання конкретно посилається на скорочення набору даних (тобто усікання, яке я продемонстрував тут). Я залишу його вирішити, чи це було те, що він шукав.
Марк у коробці

1
@Marc, дякую за відповідь. Я думаю, що мені може знадобитися відступити і перечитати все заново, бо я застряг у тому, як будь-яка відповідь вище стосується зменшення розмірності. Тому що, як показуєш, dim (trunc) = dim (Xt). Яка користь від цього, розміри не зменшувалися.
B_Miner

2
@B_Miner - Пам’ятайте лише про те, що усічення використовується для орієнтації на основні шаблони даних та для фільтрації шаблонів невеликих масштабів та шуму. Урізані дані не менші за своїми розмірами, але "чистішими". Однак усічення дійсно зменшує кількість даних, оскільки всю матрицю можна реконструювати лише за допомогою декількох векторів. Гарний приклад - використання PCA для стиснення зображення, де для реконструкції зображення можна використовувати меншу кількість ПК. Цей менший підмножина векторів займає менше пам’яті, але реконструкція матиме певні втрати в дрібних масштабах деталей.
Марк у коробці

3

Ці інші відповіді дуже хороші та детальні, але мені цікаво, чи ви насправді задаєте набагато більш основне питання: що ви робите, коли у вас є ПК?

Кожен ПК просто стає новою змінною. Скажімо, на PC1 припадає 60% від загальної кількості варіантів, а на PC2 - 30%. Оскільки на це припадає 90% від загальної кількості варіантів, ви можете просто взяти ці дві нові змінні (ПК) як спрощену версію своїх оригінальних змінних. Це означає пристосування їх до моделей, якщо саме це вас цікавить. Коли настає час інтерпретувати свої результати, ви робите це в контексті оригінальних змінних, які співвідносяться з кожним ПК.

Вибачте, якщо я недооцінив обсяг питання!


2

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

Практично з PCA ви використовуєте проекції ПК ("балів") як сурогатні дані для вашого оригінального зразка. Ви робите весь аналіз на балах, а потім реконструюєте свій оригінальний зразок назад за допомогою ПК, щоб дізнатися, що сталося на вашому вихідному просторі (це в основному регресія головного компонента ). Зрозуміло, що якщо ви вмієте осмислено інтерпретувати свої власні вектори ("навантаження"), то ви перебуваєте в ще кращому становищі: ви можете описати, що відбувається з вашим зразком у режимі зміни, представленому цим завантаженням, роблячи висновок про це завантаження і зовсім не піклуватися про реконструкцію. :)

Загалом, що ви робите "після обчислення PCA", залежить від цілі вашого аналізу. PCA просто надає лінійно незалежну підзірку ваших даних, що є оптимальним за критерієм відновлення RSS. Ви можете використовувати його для класифікації, регресії, або обох, або, як я вже згадував, ви можете розпізнати значущі ортогональні варіанти варіацій у вашому зразку.

Коментар : Я думаю, що найкращий наївний спосіб визначити кількість компонентів, які слід зберегти, - це базувати свою оцінку на певному порозі зміни вибірки, який ви хотіли б зберегти у вашій вибірці зменшеної розмірності, а не просто на довільному числі. 3, 100, 200. Як пояснив user4959, ви можете перевірити цю сукупну варіацію, перевіривши відповідне поле списку під $loadingsполем в об'єкті списку, вироблений компанією princomp.


1
Як ви згадуєте регресію головних компонентів, в R, яка надається пакетами pls. Щодо кількості компонентів, які потрібно зберегти, я не бачу реальної переваги вирішення% дисперсії порівняно з ні. компонентів (можливо, це тому, що я працюю з даними, які мають дуже різний рівень шуму. Як зазначає @ Marc-in-the box, існує багато різних підходів до визначення відповідного числа ПК, і стратегія буде ( Потрібно) залежати як від типу даних, так і від типу аналізу даних, який слід виконати.
cbeleites підтримує Моніка

plsprincomp {stats}KKDD

1
так, це наївно. Я не згоден, що встановлення довільної% поясненої дисперсії має внутрішню перевагу перед будь-яким іншим довільним відсіченням. Але з цим все-таки не варто боротися як: а) ОП ніколи не просила поради щодо вибору "ні". ПК, які потрібно зберігати, і б) Я думаю, що ми погоджуємось, що належним чином слід перевірити модель PCA.
cbeleites підтримує Моніку

Без проблем; це був лише коментар, який я все-таки зробив перед своєю відповіддю. (Я поставлю останній пункт коментаря, оскільки я думаю, що це здивує, а не роз'яснює те, що я хочу сказати)
usεr11852 повідомляє Відновити Моніку

0

Після виконання PCA, ви можете вибрати перші два компоненти та графік. Ви можете побачити варіацію компонентів, використовуючи графік екрана в Р. Також, використовуючи підсумкову функцію з завантаженнями = T, ви можете виправити варіації особливостей з компонентами.

Ви також можете подивитися на ці http://www.statmethods.net/advstats/factor.html та http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Спробуйте думати, що ви хочете. Ви можете інтерпретувати багато речей із аналізу PCA.

Найкращий Абхік

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.