PCA - Principal Component Analysis Analiza składowych głównych

Wartości własne macierzy

Skalar \(\lambda\) naywamy wartością własną macierzy A jeżeli istnieje niezerowy wektor \(v\), taki że:

\(Av = \lambda v\)

Wektor \(v\) nazywamy wektorem własnym odpowiadającym wartości własnej \(\lambda\)

Następujące warunki są równoważne:

  1. \(\lambda\) jest wartością własną macierzy A

  2. układ równań \((A-\lambda I)v=0\) ma niezerowe rozwiązanie

  3. \(det(A-\lambda I)=0\)

A <- matrix(c(1,2,0,0,2,0,-2,-2,-1), nrow=3, ncol=3, byrow=TRUE)
A 
##      [,1] [,2] [,3]
## [1,]    1    2    0
## [2,]    0    2    0
## [3,]   -2   -2   -1
eigen(A)
## eigen() decomposition
## $values
## [1]  2 -1  1
## 
## $vectors
##            [,1] [,2]       [,3]
## [1,]  0.6666667    0  0.7071068
## [2,]  0.3333333    0  0.0000000
## [3,] -0.6666667    1 -0.7071068
#Wartości własne: 
lambda<-eigen(A)$values
v<-eigen(A)$vectors


#pierwszaw wartość własna 
A %*% v[,1]
##            [,1]
## [1,]  1.3333333
## [2,]  0.6666667
## [3,] -1.3333333
lambda[1]*v[,1]
## [1]  1.3333333  0.6666667 -1.3333333
det(A - lambda[2]*diag(3))
## [1] 0
#druga wartość własna 
A %*% v[,2]
##      [,1]
## [1,]    0
## [2,]    0
## [3,]   -1
lambda[2]*v[,2]
## [1]  0  0 -1
det(A - lambda[2]*diag(3))
## [1] 0
#trzecia wartość własna 
A %*% v[,3]
##            [,1]
## [1,]  0.7071068
## [2,]  0.0000000
## [3,] -0.7071068
lambda[3]*v[,3]
## [1]  0.7071068  0.0000000 -0.7071068
det(A - lambda[3]*diag(3))
## [1] 0

Ślad macierzy

sum(lambda)
## [1] 2

Macierz kowariancji

Kowariancja dwóch zmiennych:

\(Cov(X,Y) = \frac{1}{n}\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})\)

Estymator nieobciążony:

\(Cov(X,Y) = \frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})\)

#kowariancja pomiędzy pierwszą i drugą kolumną macierzy A 
sum( (A[,1] - mean(A[,1])) * (A[,2] - mean(A[,2])))/(nrow(A)-1)
## [1] 3.333333
#lub 
cov(A[,1], A[,2])
## [1] 3.333333
#kowariancja pomiędzy pierwszą i trzecią kolumną macierzy A 
cov(A[,1], A[,3])
## [1] 0.8333333
cov(A)
##           [,1]     [,2]      [,3]
## [1,] 2.3333333 3.333333 0.8333333
## [2,] 3.3333333 5.333333 1.3333333
## [3,] 0.8333333 1.333333 0.3333333

Ślad macierzy

\(tr(A) = \lambda_{1} + \lambda_{2} + \cdots + \lambda_{p}\)

Przykład

library(ISLR)
df<-USArrests
df.scaled<-scale(df)
mean(df.scaled[,1])
## [1] -7.663087e-17
#macierz kowariancji zmiennych 

S<-cov(df.scaled)
S
##              Murder   Assault   UrbanPop      Rape
## Murder   1.00000000 0.8018733 0.06957262 0.5635788
## Assault  0.80187331 1.0000000 0.25887170 0.6652412
## UrbanPop 0.06957262 0.2588717 1.00000000 0.4113412
## Rape     0.56357883 0.6652412 0.41134124 1.0000000
eigen(S)
## eigen() decomposition
## $values
## [1] 2.4802416 0.9897652 0.3565632 0.1734301
## 
## $vectors
##            [,1]       [,2]       [,3]        [,4]
## [1,] -0.5358995  0.4181809 -0.3412327  0.64922780
## [2,] -0.5831836  0.1879856 -0.2681484 -0.74340748
## [3,] -0.2781909 -0.8728062 -0.3780158  0.13387773
## [4,] -0.5434321 -0.1673186  0.8177779  0.08902432
pca<-prcomp(df.scaled)

PVE - Proportion of variance explained

Całkowita wariancja zmiennych ustandaryzowanych:

\(\sum_{j=1}^{p} Var(X_j) = \sum_{j=1}^{p}\frac{1}{n-1}\sum{x_{ij}^2}\)

#estymator wariancji 
sum(df.scaled^2)/(nrow(df.scaled)-1)
## [1] 4
#wariancja  skladowych atrybutow 
apply(df.scaled,2,var)
##   Murder  Assault UrbanPop     Rape 
##        1        1        1        1

\(\mathbf{S}\) macierz kowariancji z próby

Pierwsza składowa główna to unormowana liniowa kombinacja cech o największej wariancji:

\(z_{1}=\phi_{11}x_1 + \phi_{21}x_2 + \cdots + \phi_{p1}x_p = \mathbf{\Phi'_{1}}\mathbf{X}\)

\(\phi_{11} , \phi_{21} , \cdots , \phi_{p1}\) - ładunki pierszej składowej

Kwadrat długości wynosi 1, zapewnia jednoznaczność składowej głównej:

\(\sum_{j=1}^{p} \phi_{j1}^2=1\) ,czyli \(\mathbf{\Phi^{`}_{1}}\mathbf{\Phi_{1}}=1\)

Wariancja z próby

\(S_{z_{1}}^2 = \mathbf{\Phi^{`}_{1}}\mathbf{S}\mathbf{\Phi_{1}}\)

Wektor, który makysmalizuje wariancję jest wektorem charakterystycznym odpowiadającym największej wartości własnej macierzy \(\mathbf{S}\) lub inaczej największemu pierwiastkowi równiania wyzancznikowego:

\(|\mathbf{S} - \lambda \mathbf{I} |= 0\)

library(ggplot2)
library(ggrepel)
fi<-prcomp(df.scaled)[[2]]
fi1<-as.matrix(fi[,1])

z1<-df.scaled%*%fi1
head(z1)
##                  [,1]
## Alabama    -0.9756604
## Alaska     -1.9305379
## Arizona    -1.7454429
## Arkansas    0.1399989
## California -2.4986128
## Colorado   -1.4993407
plot(z1)

var(z1)
##          [,1]
## [1,] 2.480242
z1df<-data.frame(state<-rownames(z1),z1)
p<- ggplot(z1df, aes(x=z1, y=0))+geom_point() + geom_text_repel(aes(y=0,label=state),size=3)
p

Druga składowa główna:

Kombinacja liniowa:

\(z_{2} = \mathbf{\Phi_{2}}\mathbf{x}\)

taka, że jest nieskorelowana z \(z_{1}\), ma maksymalną wariancję oraz spełnia warunek:

\(Cov(z_{2}, z_{1})=0\)

co implikuje, że: \(\mathbf{\Phi_{2}^{`}}\mathbf{\Phi_{1}}=0\)

Wariancja z próby \(S_{z_{2}}^2 = \mathbf{\Phi^{`}_{2}}\mathbf{S}\mathbf{\Phi_{2}}\)

Poszukujemy wektora maksymalizującego wariancję z próby przy dodatkowych warunkach: \(\mathbf{\Phi^{`}_{2}}\mathbf{\Phi_{2}}=1\)

oraz

\(\mathbf{\Phi^{`}_{2}}\mathbf{\Phi_{1}}=0\)

fi2<-as.matrix(fi[,2])

z2<-df.scaled%*%fi2
head(z2)
##                  [,1]
## Alabama     1.1220012
## Alaska      1.0624269
## Arizona    -0.7384595
## Arkansas    1.1085423
## California -1.5274267
## Colorado   -0.9776297
var(z2)
##           [,1]
## [1,] 0.9897652
z12df<-data.frame(z1, z2)
head(z12df)
##                    z1         z2
## Alabama    -0.9756604  1.1220012
## Alaska     -1.9305379  1.0624269
## Arizona    -1.7454429 -0.7384595
## Arkansas    0.1399989  1.1085423
## California -2.4986128 -1.5274267
## Colorado   -1.4993407 -0.9776297
p<- ggplot(z12df, aes(x=z1, y=z2))+geom_point() + geom_text_repel(aes(label=rownames(z12df)),size=3)
p

Kolejne składowe główne , własności

Składowe główne są wzajemnie ortogonalne t.j.

\(\mathbf{\Phi^{`}_{j}}\mathbf{\Phi_{k}}=0\) dla wszystkich \(j \neq k\)

Wariancja z próby każdej składowej głównej jest równa odpowiedniej wartości własnej

Sumwa wariancji z próby składowych głównych jest równa sumie wariancji z próby zmiennych pierwotnych \(tr(S)\)

Pomijanie składowych głównych

Składowe nieistotne można pominąć: - procent wariancji () - wykres osypiskowy (piargowy)

sd<-pca[[1]]
var<-sd^2
eigen(S)$values
## [1] 2.4802416 0.9897652 0.3565632 0.1734301
variance.pca<-data.frame("var"=var, "cumvar"=cumsum(var) )
variance.pca$pct_total<-var/sum(var)
variance.pca$cum_pct_total<-variance.pca$cumvar/sum(var)

head(variance.pca)
##         var   cumvar  pct_total cum_pct_total
## 1 2.4802416 2.480242 0.62006039     0.6200604
## 2 0.9897652 3.470007 0.24744129     0.8675017
## 3 0.3565632 3.826570 0.08914080     0.9566425
## 4 0.1734301 4.000000 0.04335752     1.0000000
#wykres osypiskowy
plot(var, type="l")

Przykład zastosowania przy zmniejszonym rozmiarze zadania

library(e1071)
data(iris)
iris
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1            5.1         3.5          1.4         0.2     setosa
## 2            4.9         3.0          1.4         0.2     setosa
## 3            4.7         3.2          1.3         0.2     setosa
## 4            4.6         3.1          1.5         0.2     setosa
## 5            5.0         3.6          1.4         0.2     setosa
## 6            5.4         3.9          1.7         0.4     setosa
## 7            4.6         3.4          1.4         0.3     setosa
## 8            5.0         3.4          1.5         0.2     setosa
## 9            4.4         2.9          1.4         0.2     setosa
## 10           4.9         3.1          1.5         0.1     setosa
## 11           5.4         3.7          1.5         0.2     setosa
## 12           4.8         3.4          1.6         0.2     setosa
## 13           4.8         3.0          1.4         0.1     setosa
## 14           4.3         3.0          1.1         0.1     setosa
## 15           5.8         4.0          1.2         0.2     setosa
## 16           5.7         4.4          1.5         0.4     setosa
## 17           5.4         3.9          1.3         0.4     setosa
## 18           5.1         3.5          1.4         0.3     setosa
## 19           5.7         3.8          1.7         0.3     setosa
## 20           5.1         3.8          1.5         0.3     setosa
## 21           5.4         3.4          1.7         0.2     setosa
## 22           5.1         3.7          1.5         0.4     setosa
## 23           4.6         3.6          1.0         0.2     setosa
## 24           5.1         3.3          1.7         0.5     setosa
## 25           4.8         3.4          1.9         0.2     setosa
## 26           5.0         3.0          1.6         0.2     setosa
## 27           5.0         3.4          1.6         0.4     setosa
## 28           5.2         3.5          1.5         0.2     setosa
## 29           5.2         3.4          1.4         0.2     setosa
## 30           4.7         3.2          1.6         0.2     setosa
## 31           4.8         3.1          1.6         0.2     setosa
## 32           5.4         3.4          1.5         0.4     setosa
## 33           5.2         4.1          1.5         0.1     setosa
## 34           5.5         4.2          1.4         0.2     setosa
## 35           4.9         3.1          1.5         0.2     setosa
## 36           5.0         3.2          1.2         0.2     setosa
## 37           5.5         3.5          1.3         0.2     setosa
## 38           4.9         3.6          1.4         0.1     setosa
## 39           4.4         3.0          1.3         0.2     setosa
## 40           5.1         3.4          1.5         0.2     setosa
## 41           5.0         3.5          1.3         0.3     setosa
## 42           4.5         2.3          1.3         0.3     setosa
## 43           4.4         3.2          1.3         0.2     setosa
## 44           5.0         3.5          1.6         0.6     setosa
## 45           5.1         3.8          1.9         0.4     setosa
## 46           4.8         3.0          1.4         0.3     setosa
## 47           5.1         3.8          1.6         0.2     setosa
## 48           4.6         3.2          1.4         0.2     setosa
## 49           5.3         3.7          1.5         0.2     setosa
## 50           5.0         3.3          1.4         0.2     setosa
## 51           7.0         3.2          4.7         1.4 versicolor
## 52           6.4         3.2          4.5         1.5 versicolor
## 53           6.9         3.1          4.9         1.5 versicolor
## 54           5.5         2.3          4.0         1.3 versicolor
## 55           6.5         2.8          4.6         1.5 versicolor
## 56           5.7         2.8          4.5         1.3 versicolor
## 57           6.3         3.3          4.7         1.6 versicolor
## 58           4.9         2.4          3.3         1.0 versicolor
## 59           6.6         2.9          4.6         1.3 versicolor
## 60           5.2         2.7          3.9         1.4 versicolor
## 61           5.0         2.0          3.5         1.0 versicolor
## 62           5.9         3.0          4.2         1.5 versicolor
## 63           6.0         2.2          4.0         1.0 versicolor
## 64           6.1         2.9          4.7         1.4 versicolor
## 65           5.6         2.9          3.6         1.3 versicolor
## 66           6.7         3.1          4.4         1.4 versicolor
## 67           5.6         3.0          4.5         1.5 versicolor
## 68           5.8         2.7          4.1         1.0 versicolor
## 69           6.2         2.2          4.5         1.5 versicolor
## 70           5.6         2.5          3.9         1.1 versicolor
## 71           5.9         3.2          4.8         1.8 versicolor
## 72           6.1         2.8          4.0         1.3 versicolor
## 73           6.3         2.5          4.9         1.5 versicolor
## 74           6.1         2.8          4.7         1.2 versicolor
## 75           6.4         2.9          4.3         1.3 versicolor
## 76           6.6         3.0          4.4         1.4 versicolor
## 77           6.8         2.8          4.8         1.4 versicolor
## 78           6.7         3.0          5.0         1.7 versicolor
## 79           6.0         2.9          4.5         1.5 versicolor
## 80           5.7         2.6          3.5         1.0 versicolor
## 81           5.5         2.4          3.8         1.1 versicolor
## 82           5.5         2.4          3.7         1.0 versicolor
## 83           5.8         2.7          3.9         1.2 versicolor
## 84           6.0         2.7          5.1         1.6 versicolor
## 85           5.4         3.0          4.5         1.5 versicolor
## 86           6.0         3.4          4.5         1.6 versicolor
## 87           6.7         3.1          4.7         1.5 versicolor
## 88           6.3         2.3          4.4         1.3 versicolor
## 89           5.6         3.0          4.1         1.3 versicolor
## 90           5.5         2.5          4.0         1.3 versicolor
## 91           5.5         2.6          4.4         1.2 versicolor
## 92           6.1         3.0          4.6         1.4 versicolor
## 93           5.8         2.6          4.0         1.2 versicolor
## 94           5.0         2.3          3.3         1.0 versicolor
## 95           5.6         2.7          4.2         1.3 versicolor
## 96           5.7         3.0          4.2         1.2 versicolor
## 97           5.7         2.9          4.2         1.3 versicolor
## 98           6.2         2.9          4.3         1.3 versicolor
## 99           5.1         2.5          3.0         1.1 versicolor
## 100          5.7         2.8          4.1         1.3 versicolor
## 101          6.3         3.3          6.0         2.5  virginica
## 102          5.8         2.7          5.1         1.9  virginica
## 103          7.1         3.0          5.9         2.1  virginica
## 104          6.3         2.9          5.6         1.8  virginica
## 105          6.5         3.0          5.8         2.2  virginica
## 106          7.6         3.0          6.6         2.1  virginica
## 107          4.9         2.5          4.5         1.7  virginica
## 108          7.3         2.9          6.3         1.8  virginica
## 109          6.7         2.5          5.8         1.8  virginica
## 110          7.2         3.6          6.1         2.5  virginica
## 111          6.5         3.2          5.1         2.0  virginica
## 112          6.4         2.7          5.3         1.9  virginica
## 113          6.8         3.0          5.5         2.1  virginica
## 114          5.7         2.5          5.0         2.0  virginica
## 115          5.8         2.8          5.1         2.4  virginica
## 116          6.4         3.2          5.3         2.3  virginica
## 117          6.5         3.0          5.5         1.8  virginica
## 118          7.7         3.8          6.7         2.2  virginica
## 119          7.7         2.6          6.9         2.3  virginica
## 120          6.0         2.2          5.0         1.5  virginica
## 121          6.9         3.2          5.7         2.3  virginica
## 122          5.6         2.8          4.9         2.0  virginica
## 123          7.7         2.8          6.7         2.0  virginica
## 124          6.3         2.7          4.9         1.8  virginica
## 125          6.7         3.3          5.7         2.1  virginica
## 126          7.2         3.2          6.0         1.8  virginica
## 127          6.2         2.8          4.8         1.8  virginica
## 128          6.1         3.0          4.9         1.8  virginica
## 129          6.4         2.8          5.6         2.1  virginica
## 130          7.2         3.0          5.8         1.6  virginica
## 131          7.4         2.8          6.1         1.9  virginica
## 132          7.9         3.8          6.4         2.0  virginica
## 133          6.4         2.8          5.6         2.2  virginica
## 134          6.3         2.8          5.1         1.5  virginica
## 135          6.1         2.6          5.6         1.4  virginica
## 136          7.7         3.0          6.1         2.3  virginica
## 137          6.3         3.4          5.6         2.4  virginica
## 138          6.4         3.1          5.5         1.8  virginica
## 139          6.0         3.0          4.8         1.8  virginica
## 140          6.9         3.1          5.4         2.1  virginica
## 141          6.7         3.1          5.6         2.4  virginica
## 142          6.9         3.1          5.1         2.3  virginica
## 143          5.8         2.7          5.1         1.9  virginica
## 144          6.8         3.2          5.9         2.3  virginica
## 145          6.7         3.3          5.7         2.5  virginica
## 146          6.7         3.0          5.2         2.3  virginica
## 147          6.3         2.5          5.0         1.9  virginica
## 148          6.5         3.0          5.2         2.0  virginica
## 149          6.2         3.4          5.4         2.3  virginica
## 150          5.9         3.0          5.1         1.8  virginica
# model_normal<-glm(NSP1 ~ . -FileName -Date -SegFile -CLASS -NSP -NSP2 -NSP3, data=train, family=binomial)
regr<-naiveBayes( Species~., data=iris, family="binomial")
regr
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace, family = "binomial")
## 
## A-priori probabilities:
## Y
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333 
## 
## Conditional probabilities:
##             Sepal.Length
## Y             [,1]      [,2]
##   setosa     5.006 0.3524897
##   versicolor 5.936 0.5161711
##   virginica  6.588 0.6358796
## 
##             Sepal.Width
## Y             [,1]      [,2]
##   setosa     3.428 0.3790644
##   versicolor 2.770 0.3137983
##   virginica  2.974 0.3224966
## 
##             Petal.Length
## Y             [,1]      [,2]
##   setosa     1.462 0.1736640
##   versicolor 4.260 0.4699110
##   virginica  5.552 0.5518947
## 
##             Petal.Width
## Y             [,1]      [,2]
##   setosa     0.246 0.1053856
##   versicolor 1.326 0.1977527
##   virginica  2.026 0.2746501
pSpecies<-predict(regr, iris, type="class")
head(pSpecies)
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
table(iris$Species,pSpecies)
##             pSpecies
##              setosa versicolor virginica
##   setosa         50          0         0
##   versicolor      0         47         3
##   virginica       0          3        47
## redukujemy 

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
pca.iris<-prcomp(iris[,1:4], scale=TRUE)
plot(pca.iris)

#pca.iris$rotation[,1]%*%iris[1,1:4]

head(scale(iris[,1:4]))
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]   -0.8976739  1.01560199    -1.335752   -1.311052
## [2,]   -1.1392005 -0.13153881    -1.335752   -1.311052
## [3,]   -1.3807271  0.32731751    -1.392399   -1.311052
## [4,]   -1.5014904  0.09788935    -1.279104   -1.311052
## [5,]   -1.0184372  1.24503015    -1.335752   -1.311052
## [6,]   -0.5353840  1.93331463    -1.165809   -1.048667
#Wektor 
head(pca.iris$x)
##            PC1        PC2         PC3          PC4
## [1,] -2.257141 -0.4784238  0.12727962  0.024087508
## [2,] -2.074013  0.6718827  0.23382552  0.102662845
## [3,] -2.356335  0.3407664 -0.04405390  0.028282305
## [4,] -2.291707  0.5953999 -0.09098530 -0.065735340
## [5,] -2.381863 -0.6446757 -0.01568565 -0.035802870
## [6,] -2.068701 -1.4842053 -0.02687825  0.006586116
iris.ds.pca<-data.frame(pca.iris$x)
iris.ds.pca$Species<-iris$Species
head(iris.ds.pca)
##         PC1        PC2         PC3          PC4 Species
## 1 -2.257141 -0.4784238  0.12727962  0.024087508  setosa
## 2 -2.074013  0.6718827  0.23382552  0.102662845  setosa
## 3 -2.356335  0.3407664 -0.04405390  0.028282305  setosa
## 4 -2.291707  0.5953999 -0.09098530 -0.065735340  setosa
## 5 -2.381863 -0.6446757 -0.01568565 -0.035802870  setosa
## 6 -2.068701 -1.4842053 -0.02687825  0.006586116  setosa
nb.pca<-naiveBayes(Species~PC1+PC2+PC3+PC4, data=iris.ds.pca)
pSpecies<-predict(nb.pca, iris.ds.pca, type="class")

table(iris$Species,pSpecies)
##             pSpecies
##              setosa versicolor virginica
##   setosa         50          0         0
##   versicolor      0         46         4
##   virginica       0          5        45