Машинное обучение: обучение без учителя
Неконтролируемое обучение: сжатие изображений в 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:
Конец математики.
Наслаждайтесь чтением этого?
Ознакомьтесь с другими моими постами об искусственном интеллекте и машинном обучении.