Машинное обучение: обучение без учителя

Неконтролируемое обучение: сжатие изображений в 10 строках кода R

Классный способ сжатия изображений с помощью PCA

Анализ основных компонентов (PCA) — это мощный инструмент машинного обучения. Как неконтролируемый метод обучения, он превосходен в уменьшении размеров и извлечении признаков.

Однако знаете ли вы, что мы можем использовать PCA для сжатия изображений?

В этом посте я расскажу о процессе и объясню, как PCA может сжимать изображения в 10 строках кода R с простой математикой, описанной в конце.

# Установить пакеты и загрузить библиотеки

#install.packages(“tidyverse”)
#install.packages(“gbm”)
#install.packages(“e1071”)
#install.packages(“imager”)
library(tidyverse)
library(tree) 
library(randomForest) 
library(gbm) 
library(ROCR) 
library(e1071) 
library(imager)
# load the dataset. This is a 100*100*1000 array of data. An array is a generalization of a matrix to more than 2 dimensions. The first two dimensions index the pixels in a 100*100 black and white image of a face; the last dimension is the index for one of 1000 face images. The dataset can be accessed at: https://cyberextruder.com/face-matching-data-set-download/.
load(“faces_array.RData”)
#PAC requires a single matrix. so, we need to transform the 100*100 matrix into a single vector (10,000). 
face_mat <- sapply(1:1000, function(i) as.numeric(faces_array[, , i])) %>% t
# To visualize the image, we need a matrix. so, let's convert 10000 dimensional vector to a matrix
plot_face <- function(image_vector) { 
 plot(as.cimg(t(matrix(image_vector, ncol=100))), axes=FALSE, asp=1)
 }
plot_face(face_mat[, sample(1000, 1)])

Здесь мы пытаемся получить основную информацию о наборе данных и строим новую функцию для анализа.

#check среднее лицо

face_average = colMeans(face_mat)
plot_face(face_average)

В значительной степени мы можем понимать «среднее лицо» как основу для других изображений. Добавляя или вычитая значения из среднего лица, мы можем получить другие лица.

#Вышеприведенный код не учитывает ограничение в 10 строк.#

# И вот наши 10 строк кода #

# generate PCA results;
# scale=TRUE and center=TRUE --> mean 0 and variance 1
pr.out = prcomp(face_mat,center=TRUE, scale=FALSE)
# pr.out$sdev: the standard deviations of the principal components; 
# (pr.out$sdev)²: variance of the principal components
pr.var=(pr.out$sdev)² 
# pve: variance explained by the principal component
pve = pr.var/sum(pr.var) 
# cumulative explained variance
cumulative_pve <-cumsum(pve)
#see the math explanation attached in the end
U = pr.out$rotation
Z = t(pr.out$x)
# Let's compress the 232nd face of the dataset and add the average face back and create four other images adopting the first 10,50,100, and 300 columns.
par(mfrow=c(1,5))
plot_face(face_mat[232,])
for (i in c(10,50,100,300))
 {
 plot_face((U[,1:i]%*%Z[1:i,])[,232]+face_average) 
 }

Мы сделали это! Результаты не так уж плохи. У нас есть исходное изображение в крайнем левом углу, за которым следуют четыре сжатых изображения.

Простые математические объяснения.

PCA тесно связан с разложением матрицы по сингулярным числам (SVD). Итак, x = UD(V^T) = z*(V^T),

где xявляетсяматрицей 1000*10000,

  • V: матрица собственных векторов (вращение, возвращаемое prcomp)
  • D: стандартное отклонение основных компонентов (sdev, возвращаемое prcomp)
  • Итак, z = UD (координаты главных компонент в повернутом пространстве (prcomp$x).

Другими словами, мы можем сжать изображения, используя первые k столбцов V и первые k столбцов z:

Конец математики.

Наслаждайтесь чтением этого?

Пожалуйста, найдите меня в LinkedIn и Twitter.

Ознакомьтесь с другими моими постами об искусственном интеллекте и машинном обучении.