Load Packages

```r
library(caret)
library(shape)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubGlicmFyeShoZXhWaWV3KVxucmF3X2RhdGEgPC0gcmVhZFJhdyhcImRhdGEvbWl0X2ZhY2VzL3Jhd2RhdGEvMjIyN1wiKVxuaW1hZ2VfbWF0cml4IDwtIG1hdHJpeChyYXdfZGF0YSRmaWxlUmF3LCBucm93ID0gMTI4LCBcbiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKVxucGxvdChhcy5yYXN0ZXIoaW1hZ2VfbWF0cml4KSlcbmBgYCJ9 -->

```r
library(hexView)
raw_data <- readRaw("data/mit_faces/rawdata/2227")
image_matrix <- matrix(raw_data$fileRaw, nrow = 128, 
                       ncol = 128, byrow = TRUE)
plot(as.raster(image_matrix))

set.seed(1)
par(mfrow=c(10,10))
for (i in sample(1:3991, 100)){
  par(mar=c(0,0,0,0))
  image_matrix <- matrix(faces[i,], nrow = 128, 
                         ncol = 128, byrow = TRUE)
  plot(as.raster(image_matrix))
}
par(mfrow=c(1,1))

temp_df <- data.frame(faces)
df_faces <- temp_df
for (i in 1:ncol(temp_df)){
  df_faces[,i] <- as.numeric(temp_df[,i])
}
face_pca <- prcomp(df_faces)
dim(face_pca$x)
[1] 3991 3991
dim(face_pca$rotation)
[1] 16384  3991
ev <- face_pca$sdev**2 / sum(face_pca$sdev**2)
cum_ev <- cumsum(ev)

plot(1:1000, cum_ev[1:1000], cex=0.25, pch='',
     xlab='Number of Principal Components', 
     ylab='Cumulative Variance Explained')
lines(1:1000, cum_ev[1:1000], col='steelblue', lwd=2)
abline(v=200, lty=3, lwd=2, col='steelblue')
abline(h=cum_ev[200], lty=3, lwd=2, col='steelblue')


set.seed(1)
par(mfrow=c(5,5))
for (i in 1:25){
  par(mar=c(0,0,0,0))
  image_matrix <- matrix(face_pca$rotation[,i], nrow = 128, 
                           ncol = 128, byrow = TRUE)
  
  minval <- min(image_matrix)
  maxval <- max(image_matrix)
  
  image_matrix <- (image_matrix - minval) / (maxval - minval)
  plot(as.raster(image_matrix))
}
par(mfrow=c(1,1))

set.seed(1)
par(mfrow=c(5,5))
for (i in 26:50){
  par(mar=c(0,0,0,0))
  image_matrix <- matrix(face_pca$rotation[,i], nrow = 128, 
                           ncol = 128, byrow = TRUE)
  
  minval <- min(image_matrix)
  maxval <- max(image_matrix)
  
  image_matrix <- (image_matrix - minval) / (maxval - minval)
  plot(as.raster(image_matrix))
}
par(mfrow=c(1,1))

ix <- sample(1:3991, 1)
ix <- 2177
par(mar=c(0,0,0,0))
image_matrix <- matrix(faces[ix,], nrow = 128, 
                       ncol = 128, byrow = TRUE)
plot(as.raster(image_matrix))

face_pca$x[2177,1:25]
        PC1         PC2         PC3         PC4         PC5         PC6         PC7 
-3345.07194   111.59096  1145.27932 -1413.52145  1812.93469 -2120.45176   528.41917 
        PC8         PC9        PC10        PC11        PC12        PC13        PC14 
  356.65318  1097.28055  -847.17761    88.20587    36.28544   694.17292   -75.62807 
       PC15        PC16        PC17        PC18        PC19        PC20        PC21 
 -576.03196  -544.69454  -117.88797   320.06718  -227.21212  -526.35007   353.70063 
       PC22        PC23        PC24        PC25 
  492.15796  -278.60709  -239.30506    72.74486 

cur_img <- face_pca$rotation[,1] * 0

par(mfrow=c(40,5))
for (i in 1:200){
  par(mar=c(0,0,0,0))
  
  cur_img <- cur_img + face_pca$x[ix, i] * face_pca$rotation[,i]
  
  image_matrix <- matrix(cur_img, nrow = 128, 
                           ncol = 128, byrow = TRUE)
  
  minval <- min(image_matrix)
  maxval <- max(image_matrix)
  image_matrix <- (image_matrix - minval) / (maxval - minval)
  plot(as.raster(image_matrix))
}
par(mfrow=c(1,1))

ix <- sample(1:3991, 1)
#ix <- 2177
par(mar=c(0,0,0,0))
image_matrix <- matrix(faces[ix,], nrow = 128, 
                       ncol = 128, byrow = TRUE)
plot(as.raster(image_matrix))

face_pca$x[2177,1:25]

cur_img <- face_pca$rotation[,1] * 0

par(mfrow=c(40,5))
for (i in 1:200){
  par(mar=c(0,0,0,0))
  
  cur_img <- cur_img + face_pca$x[ix, i] * face_pca$rotation[,i]
  
  image_matrix <- matrix(cur_img, nrow = 128, 
                           ncol = 128, byrow = TRUE)
  
  minval <- min(image_matrix)
  maxval <- max(image_matrix)
  image_matrix <- (image_matrix - minval) / (maxval - minval)
  plot(as.raster(image_matrix))
}
par(mfrow=c(1,1))

LS0tDQp0aXRsZTogIkxlc3NvbiAxMC4yIC0gUENBIGZvciBGYWNpYWwgUmVjb2duaXRpb24iDQphdXRob3I6ICJSb2JiaWUgQmVhbmUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQotLS0NCg0KIyMjICoqTG9hZCBQYWNrYWdlcyoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoc2hhcGUpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoaGV4VmlldykNCnJhd19kYXRhIDwtIHJlYWRSYXcoImRhdGEvbWl0X2ZhY2VzL3Jhd2RhdGEvMjIyNyIpDQppbWFnZV9tYXRyaXggPC0gbWF0cml4KHJhd19kYXRhJGZpbGVSYXcsIG5yb3cgPSAxMjgsIA0KICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMTI4LCBieXJvdyA9IFRSVUUpDQpwbG90KGFzLnJhc3RlcihpbWFnZV9tYXRyaXgpKQ0KYGBgDQoNCg0KYGBge3J9DQpmYWNlcyA8LSBjKCkNCmZpbGVfbGlzdCA8LSBsaXN0LmZpbGVzKCdkYXRhL21pdF9mYWNlcy9yYXdkYXRhLycpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChmaWxlX2xpc3QpKXsNCiAgdGVtcCA8LSByZWFkUmF3KHBhc3RlKCdkYXRhL21pdF9mYWNlcy9yYXdkYXRhLycsIGZpbGVfbGlzdFtpXSwgc2VwPScnKSkNCiAgZmFjZXMgPC0gcmJpbmQoZmFjZXMsIHRlbXAkZmlsZVJhdykgIA0KICBpZihpJSUxMDAgPT0gMCl7cHJpbnQoaSl9DQp9DQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQ0Kc2V0LnNlZWQoMSkNCnBhcihtZnJvdz1jKDEwLDEwKSkNCmZvciAoaSBpbiBzYW1wbGUoMTozOTkxLCAxMDApKXsNCiAgcGFyKG1hcj1jKDAsMCwwLDApKQ0KICBpbWFnZV9tYXRyaXggPC0gbWF0cml4KGZhY2VzW2ksXSwgbnJvdyA9IDEyOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKQ0KICBwbG90KGFzLnJhc3RlcihpbWFnZV9tYXRyaXgpKQ0KfQ0KcGFyKG1mcm93PWMoMSwxKSkNCmBgYA0KDQoNCg0KYGBge3J9DQp0ZW1wX2RmIDwtIGRhdGEuZnJhbWUoZmFjZXMpDQpkZl9mYWNlcyA8LSB0ZW1wX2RmDQpmb3IgKGkgaW4gMTpuY29sKHRlbXBfZGYpKXsNCiAgZGZfZmFjZXNbLGldIDwtIGFzLm51bWVyaWModGVtcF9kZlssaV0pDQp9DQpgYGANCg0KYGBge3J9DQpmYWNlX3BjYSA8LSBwcmNvbXAoZGZfZmFjZXMpDQpkaW0oZmFjZV9wY2EkeCkNCmBgYA0KDQpgYGB7cn0NCmRpbShmYWNlX3BjYSRyb3RhdGlvbikNCmBgYA0KDQpgYGB7cn0NCmV2IDwtIGZhY2VfcGNhJHNkZXYqKjIgLyBzdW0oZmFjZV9wY2Ekc2RldioqMikNCmN1bV9ldiA8LSBjdW1zdW0oZXYpDQoNCnBsb3QoMToxMDAwLCBjdW1fZXZbMToxMDAwXSwgY2V4PTAuMjUsIHBjaD0nJywNCiAgICAgeGxhYj0nTnVtYmVyIG9mIFByaW5jaXBhbCBDb21wb25lbnRzJywgDQogICAgIHlsYWI9J0N1bXVsYXRpdmUgVmFyaWFuY2UgRXhwbGFpbmVkJykNCmxpbmVzKDE6MTAwMCwgY3VtX2V2WzE6MTAwMF0sIGNvbD0nc3RlZWxibHVlJywgbHdkPTIpDQphYmxpbmUodj0yMDAsIGx0eT0zLCBsd2Q9MiwgY29sPSdzdGVlbGJsdWUnKQ0KYWJsaW5lKGg9Y3VtX2V2WzIwMF0sIGx0eT0zLCBsd2Q9MiwgY29sPSdzdGVlbGJsdWUnKQ0KYGBgDQoNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0NCg0Kc2V0LnNlZWQoMSkNCnBhcihtZnJvdz1jKDUsNSkpDQpmb3IgKGkgaW4gMToyNSl7DQogIHBhcihtYXI9YygwLDAsMCwwKSkNCiAgaW1hZ2VfbWF0cml4IDwtIG1hdHJpeChmYWNlX3BjYSRyb3RhdGlvblssaV0sIG5yb3cgPSAxMjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKQ0KICANCiAgbWludmFsIDwtIG1pbihpbWFnZV9tYXRyaXgpDQogIG1heHZhbCA8LSBtYXgoaW1hZ2VfbWF0cml4KQ0KICANCiAgaW1hZ2VfbWF0cml4IDwtIChpbWFnZV9tYXRyaXggLSBtaW52YWwpIC8gKG1heHZhbCAtIG1pbnZhbCkNCiAgcGxvdChhcy5yYXN0ZXIoaW1hZ2VfbWF0cml4KSkNCn0NCnBhcihtZnJvdz1jKDEsMSkpDQoNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9DQoNCnNldC5zZWVkKDEpDQpwYXIobWZyb3c9Yyg1LDUpKQ0KZm9yIChpIGluIDI2OjUwKXsNCiAgcGFyKG1hcj1jKDAsMCwwLDApKQ0KICBpbWFnZV9tYXRyaXggPC0gbWF0cml4KGZhY2VfcGNhJHJvdGF0aW9uWyxpXSwgbnJvdyA9IDEyOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMTI4LCBieXJvdyA9IFRSVUUpDQogIA0KICBtaW52YWwgPC0gbWluKGltYWdlX21hdHJpeCkNCiAgbWF4dmFsIDwtIG1heChpbWFnZV9tYXRyaXgpDQogIA0KICBpbWFnZV9tYXRyaXggPC0gKGltYWdlX21hdHJpeCAtIG1pbnZhbCkgLyAobWF4dmFsIC0gbWludmFsKQ0KICBwbG90KGFzLnJhc3RlcihpbWFnZV9tYXRyaXgpKQ0KfQ0KcGFyKG1mcm93PWMoMSwxKSkNCg0KYGBgDQoNCg0KYGBge3J9DQppeCA8LSBzYW1wbGUoMTozOTkxLCAxKQ0KaXggPC0gMjE3Nw0KcGFyKG1hcj1jKDAsMCwwLDApKQ0KaW1hZ2VfbWF0cml4IDwtIG1hdHJpeChmYWNlc1tpeCxdLCBucm93ID0gMTI4LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKQ0KcGxvdChhcy5yYXN0ZXIoaW1hZ2VfbWF0cml4KSkNCg0KYGBgDQoNCg0KYGBge3J9DQpmYWNlX3BjYSR4WzIxNzcsMToyNV0NCmBgYA0KDQoNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04MH0NCg0KY3VyX2ltZyA8LSBmYWNlX3BjYSRyb3RhdGlvblssMV0gKiAwDQoNCnBhcihtZnJvdz1jKDQwLDUpKQ0KZm9yIChpIGluIDE6MjAwKXsNCiAgcGFyKG1hcj1jKDAsMCwwLDApKQ0KICANCiAgY3VyX2ltZyA8LSBjdXJfaW1nICsgZmFjZV9wY2EkeFtpeCwgaV0gKiBmYWNlX3BjYSRyb3RhdGlvblssaV0NCiAgDQogIGltYWdlX21hdHJpeCA8LSBtYXRyaXgoY3VyX2ltZywgbnJvdyA9IDEyOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMTI4LCBieXJvdyA9IFRSVUUpDQogIA0KICBtaW52YWwgPC0gbWluKGltYWdlX21hdHJpeCkNCiAgbWF4dmFsIDwtIG1heChpbWFnZV9tYXRyaXgpDQogIGltYWdlX21hdHJpeCA8LSAoaW1hZ2VfbWF0cml4IC0gbWludmFsKSAvIChtYXh2YWwgLSBtaW52YWwpDQogIHBsb3QoYXMucmFzdGVyKGltYWdlX21hdHJpeCkpDQp9DQpwYXIobWZyb3c9YygxLDEpKQ0KDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCml4IDwtIHNhbXBsZSgxOjM5OTEsIDEpDQojaXggPC0gMjE3Nw0KcGFyKG1hcj1jKDAsMCwwLDApKQ0KaW1hZ2VfbWF0cml4IDwtIG1hdHJpeChmYWNlc1tpeCxdLCBucm93ID0gMTI4LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKQ0KcGxvdChhcy5yYXN0ZXIoaW1hZ2VfbWF0cml4KSkNCg0KYGBgDQoNCg0KYGBge3J9DQpmYWNlX3BjYSR4WzIxNzcsMToyNV0NCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9ODB9DQoNCmN1cl9pbWcgPC0gZmFjZV9wY2Ekcm90YXRpb25bLDFdICogMA0KDQpwYXIobWZyb3c9Yyg0MCw1KSkNCmZvciAoaSBpbiAxOjIwMCl7DQogIHBhcihtYXI9YygwLDAsMCwwKSkNCiAgDQogIGN1cl9pbWcgPC0gY3VyX2ltZyArIGZhY2VfcGNhJHhbaXgsIGldICogZmFjZV9wY2Ekcm90YXRpb25bLGldDQogIA0KICBpbWFnZV9tYXRyaXggPC0gbWF0cml4KGN1cl9pbWcsIG5yb3cgPSAxMjgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEyOCwgYnlyb3cgPSBUUlVFKQ0KICANCiAgbWludmFsIDwtIG1pbihpbWFnZV9tYXRyaXgpDQogIG1heHZhbCA8LSBtYXgoaW1hZ2VfbWF0cml4KQ0KICBpbWFnZV9tYXRyaXggPC0gKGltYWdlX21hdHJpeCAtIG1pbnZhbCkgLyAobWF4dmFsIC0gbWludmFsKQ0KICBwbG90KGFzLnJhc3RlcihpbWFnZV9tYXRyaXgpKQ0KfQ0KcGFyKG1mcm93PWMoMSwxKSkNCg0KYGBgDQo=