Чи дійсно компоненти PCA представляють відсоток дисперсії? Чи можуть вони становити більше 100%?


13

"Машинне навчання хакерам" О'Рейлі говорить, що кожен головний компонент становить відсоток дисперсії. Я цитував відповідну частину сторінки нижче (глава 8, с.207). Розмовляючи з іншим експертом, вони погодилися, що це відсоток.

Однак 24 компоненти складають 133.2095%. Як це може бути?

Переконавшись у тому, що ми можемо використовувати PCA, як це робити в R? Знову ж таки, це місце, де R світить: всю PCA можна виконати в одному рядку коду. Ми використовуємо функцію princomp для запуску PCA:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

Якщо ми просто наберемо pca в R, ми побачимо короткий підсумок основних компонентів:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

У цьому резюме стандартні відхилення вказують на те, яка кількість дисперсії в наборі даних припадає на різні основні компоненти. На перший компонент, який називається Comp.1, припадає 29% дисперсії, а на наступний - 20%. Нарешті, на останній компонент, Comp.24, припадає менше 1% дисперсії. Це говорить про те, що ми можемо багато дізнатися про наші дані, просто переглянувши перший головний компонент.

[Код та дані можна знайти в github .]


6
Я вважаю, що авторська інтерпретація цього фільму Standard deviationsтрохи відхилена. Оскільки стандартні відхилення насправді є стандартними відхиленнями, ми повинні їх квадратизувати, щоб побачити, скільки дисперсії представляє кожен компонент. Перший компонент буде представляти відсотків від загальної дисперсії. 100×29.1001249229.10012492++0.43479832
припускаєтьсянормальне

4
Це питання виникає з двох основних помилок, я боюся: (1) він пропускає заголовок, який оголошує, що числа є "Стандартними відхиленнями" і помиляє їх на відхилення, і (2) він передбачає, що ці числа є відсотками, але вони не є. (Їх одиниці складають те, що оцінюється в запасах: зміна доларів чи відсотків на рік чи інше.) Тут взагалі немає помилок: коментар @Max пояснює, як знайти відсоток загальної дисперсії.
whuber

1
@whuber Можливо, я повинен був використовувати "помилку" замість "помилка"? :-) " Comp.1, припадає на 29% дисперсії " неправильно, і слід читати " Comp.1, припадає на 46% дисперсії "
Darren Cook

1
Дякую, Даррен: Я неправильно зрозумів, що плутанина присутній у книзі, і я взяв "помилку", щоб звернутися до самого Rпрограмного забезпечення. Виявлення цієї помилки було гарним уловом (я сподіваюся, що вам було корисно дізнатися, що насправді відбувається з PCA)!
whuber

5
Так, це безперечно помилка в книзі. Є кілька місць, де я неправильно використовував стандартні відхилення замість дисперсій. (Наприклад, є момент, коли ми використовуємо RMSE замість MSE для обчислення R-квадрата.) Я сподіваюся, що встигнемо сісти і виправити подібні помилки найближчим часом.
Джон Майлз Уайт

Відповіді:


11

Використовуйте summary.princompдля перегляду "Пропорція варіації" та "Сукупна пропорція".

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)

1
Дякую Джошуа. Отже, перший компонент - це фактично 46% дисперсії. Я відправлю звіт про помилку до книги.
Даррен Кук

Як розраховується "Пропорція дисперсії"? Показане число становить 0,4600083. Але sqrt(pca$sdev[1]/sum(pca$sdev))(орієнтовно sqrt(29.1/133.2)) дає 0,4673904.
Даррен Кук

3
@DarrenCook: sdevозначає, що ви дивитесь на стандартне відхилення , тобто квадратний корінь дисперсії (або , використовуючи позначення з моєї відповіді), який повинен пояснити різницю. Спробуйте замість цього. λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT

2
@DarrenCook: використання джерела ... stats:::print.summary.princompпоказує, що він містить квадрат sdevкомпонента, який stats:::princomp.defaultпоказує, є sqrtзначення власних значень.
Джошуа Ульріх

11

Вони повинні100 %.

Загальна дисперсія варіантної випадкової величини з матрицею коваріації визначається якpXΣ

tr(Σ)=σ11+σ22++σpp.

Тепер слід симетричної матриці - це сума її власних значеньТаким чином, загальна дисперсія дорівнює якщо ми використовуємо для позначення власних значень . Зауважте, що оскільки матриці коваріації є позитивно-напівдефінітними , так що загальна дисперсія є негативною.λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

Але основні компоненти задаються , де є власним вектором : th (стандартизованим для довжини ), відповідним власного значення . Її дисперсія - і тому перші основні компоненти складають від загальної дисперсії. Зокрема, вони становлять від загальної дисперсії, коли .e i i 1 λ i V a r ( e i X ) = e i Σ e i = λ i e i e i = λ i k ( λ 1 + + λ keiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k100%k=p
(λ1++λkλ1++λp100) %
100 %k=p

1
Ви бачили (останній) коментар @Max до питання? Він прибив відповідь.
whuber

@whuber: Я цього не бачив, тож дякую. Я зробив аналогічне зауваження в коментарі до відповіді Джошуа.
MånsT

4

Ось декілька код R для доповнення попередніх відповідей ( pca[["sdev"]]зазвичай пишеться pca$sdev, але він спричиняє неправильне форматування у фрагменті нижче).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

Отже, як зазначає @Max, робота з дисперсією замість стандартного відхилення і не забуваючи ділити на загальну дисперсію вирішує питання.

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