Untuk memproses gambar untuk video game, menganalisis data, kamera keamanan, dll., penting untuk dapat mengompres gambar secara efisien, karena gambar dapat memakan memori dalam jumlah besar. Jika kita tidak mengkompres gambar secara efisien maka kita mungkin kehilangan terlalu banyak informasi sehingga kita tidak dapat memulihkan gambar, atau jika kita tidak cukup mengompres, maka kita mungkin tidak dapat memproses gambar tersebut. Untuk contoh ini, kita akan membahas bagaimana kita mengompres gambar menggunakan PCA. Dalam proses PCA, kita menghitung nilai eigen dan vektor eigen dari dari matriks yang dihitung dari gambar input.

## library need to open a jpg file
library(jpeg)
## Download from the author’s website
myurl <- "http://polytopes.net/Tora_Sleeping.JPG"
z <- tempfile()
download.file(myurl,z,mode="wb")
Kitty <- readJPEG(z)
## dimension
d <- dim(Kitty)
d
## [1] 2340 4160    3

Kami menggunakan contoh kerja di Bagian 2.2. Seperti pada Bagian 2.2, kami menghasilkan titik data simulasi di bawah distribusi normal bivariat. Ingatlah bahwa a distribusi normal bivariat didefinisikan oleh mean dan standar deviasi, tetapi tidak seperti distribusi normal univariat, rata-rata didefinisikan oleh vektor dua dimensi dan standar deviasi didefinisikan oleh matriks 2 × 2. Sekali lagi, kami menggunakan paket R mvtnorm [18] dan kami menggunakan paket matlib untuk operasi matriks. Pertama, kita unggah semua paket yang dibutuhkan:

library(mvtnorm)
library(ggplot2)
library(matlib)
sigma <- matrix(c(4,3,3,4), ncol = 2, nrow = 2)
## Mean
mu <- c(5, 5)
n <- 1000
x <- rmvnorm(n = n, mean = mu, sigma = sigma)
d <- data.frame(x)
p2 <- ggplot(d, aes(x = X1, y = X2)) +
geom_point(alpha = .5) +
geom_density_2d()
p2

di mana µ adalah rata-rata dan σ adalah matriks kovarians yang mendefinisikan deviasi standar untuk distribusi normal bivariat. Perhatikan bahwa matriks kovarians ini matriks kovarians ini adalah simetris. Untuk menentukan standar deviasi untuk distribusi normal multivariat, matriks kovarians harus simetris. Namun, dalam kehidupan nyata, kita tidak mengamati µ dan σ. Kita hanya mengamati set data x yang berisi 1000 titik data. Oleh karena itu kita harus mengestimasi mereka dari titik-titik data. Sekarang kita mengestimasi matriks kovarian. Misalkan x adalah matriks yang baris-barisnya mewakili setiap titik data dalam set data dan yang kolomnya mewakili setiap variabel. Maka kita dapat mengestimasi matriks kovarian σ^ dengan xT - x, di mana xT adalah transpose dari matriks x. ^ σ adalah matriks simetris berukuran k × k simetris dengan k adalah jumlah variabel acak. Dalam R, kita dapat mengestimasi dengan:

y <- t(x) %*% x
eigen(y)
## eigen() decomposition
## $values
## [1] 58227.884  1024.442
## 
## $vectors
##           [,1]       [,2]
## [1,] 0.7065607 -0.7076524
## [2,] 0.7076524  0.7065607
prcomp(d, center = FALSE)
## Standard deviations (1, .., p=2):
## [1] 7.634538 1.012654
## 
## Rotation (n x k) = (2 x 2):
##           PC1        PC2
## X1 -0.7065607  0.7076524
## X2 -0.7076524 -0.7065607