I componenti di PCA rappresentano davvero la percentuale di varianza? Possono riassumere oltre il 100%?


13

"Machine Learning For Hackers" di O'Reilly afferma che ogni componente principale rappresenta una percentuale della varianza. Ho citato la parte pertinente della pagina seguente (capitolo 8, p. 207). Parlando con un altro esperto, hanno concordato che è la percentuale.

Tuttavia, i 24 componenti si sommano al 133,2095%. Come può essere?

Avendo convinto noi stessi che possiamo usare PCA, come possiamo farlo in R? Ancora una volta, questo è un luogo in cui R brilla: l'intera PCA può essere eseguita in una riga di codice. Usiamo la funzione princomp per eseguire PCA:

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

Se digitiamo pca in R, vedremo un breve riepilogo dei componenti principali:

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.

In questo riassunto, le deviazioni standard ci dicono quanta parte della varianza nel set di dati è rappresentata dai diversi componenti principali. Il primo componente, chiamato Comp.1, rappresenta il 29% della varianza, mentre il componente successivo rappresenta il 20%. Alla fine, l'ultimo componente, Comp.24, rappresenta meno dell'1% della varianza. Ciò suggerisce che possiamo imparare molto sui nostri dati semplicemente guardando il primo componente principale.

[Codice e dati possono essere trovati su github .]


6
Penso che l'interpretazione dell'autore Standard deviationssia leggermente off. Poiché le deviazioni standard sono in realtà deviazioni standard, dobbiamo quadrarle per vedere quanta varianza rappresenta ogni componente. Il primo componente rappresenterebbe percento della varianza totale. 100×29.1001249229.10012492++0.43479832
assunto il

4
Questa domanda nasce da due errori di base, temo: (1) manca l'intestazione che annuncia che i numeri sono "deviazioni standard" e li scambia per varianze e (2) presume che quei numeri siano percentuali, ma non lo sono. (Le loro unità sono in qualunque misura vengono misurate le scorte: dollari o percentuali di variazione all'anno o altro.) Non c'è nessun bug qui: il commento di @Max spiega come trovare la percentuale di varianza totale.
whuber

1
@whuber Forse avrei dovuto usare "typo" invece di "bug"? :-) " Comp.1, rappresenta il 29% della varianza " è sbagliato e dovrebbe leggere " Comp.1, rappresenta il 46% della varianza "
Darren Cook

1
Grazie, Darren: ho frainteso che la confusione era presente nel libro e ho preso "bug" per fare riferimento al Rsoftware stesso. Scoprire quell'errore è stato una buona cattura (spero che tu abbia trovato gratificante scoprire cosa sta realmente succedendo con PCA)!
whuber

5
Sì, questo è senza dubbio un bug nel libro. Ci sono alcuni posti in cui ho abusato delle deviazioni standard invece delle varianze. (Ad esempio, c'è un punto in cui utilizziamo RMSE invece di MSE per calcolare il R-quadrato.) Spero che avremo il tempo di sederci e correggere questo tipo di bug nel prossimo futuro.
John Myles White,

Risposte:


11

Utilizzare summary.princompper visualizzare "Proporzione di varianza" e "Proporzione cumulativa".

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

1
Grazie Giosuè. Quindi il primo componente è in realtà il 46% della varianza. Invierò una segnalazione di bug al libro.
Darren Cook,

Come viene calcolata la "Proporzione della varianza"? Il numero visualizzato è 0.4600083. Ma sqrt(pca$sdev[1]/sum(pca$sdev))(approssimativamente sqrt(29.1/133.2)) dà 0,4673904.
Darren Cook,

3
@DarrenCook: sdevimplica che stai osservando la deviazione standard , ovvero la radice quadrata della varianza (o , usando la notazione della mia risposta), che dovrebbe spiegare la differenza. Provainvece. λipca$sdev[1]^2/sum(pca$sdev^2)
Martedì

2
@DarrenCook: usa il sorgente ... stats:::print.summary.princompti mostra che quadra il sdevcomponente, il che stats:::princomp.defaultmostra è il valore sqrtdi autigeni.
Joshua Ulrich,

11

Dovrebbero riassumere al 100 %.

La varianza totale di una variabile casuale X variata con matrice di covarianza Σ è definita come t r ( Σ ) = σ 11 + σ 22pXΣ

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

λ1λ2λp.

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

eiXeii1λi

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

1
Hai visto il (più recente) commento di @Max alla domanda? Ha inchiodato la risposta.
whuber

@whuber: non l'avevo visto, quindi grazie. Ho fatto un'osservazione simile in un commento alla risposta di Giosuè.
Martedì

4

Ecco un codice R per integrare le risposte precedenti (di pca[["sdev"]]solito è scrittopca$sdev , ma causa una formattazione errata nello snippet di seguito).

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

Quindi, come sottolinea @Max, lavorare con la varianza invece della deviazione standard e non dimenticare di dividere per la varianza totale risolve il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.