74 lines
1.3 KiB
Plaintext
74 lines
1.3 KiB
Plaintext
---
|
|
title: "exam2"
|
|
author: "Mark Pearl"
|
|
date: "7/28/2021"
|
|
output: html_document
|
|
---
|
|
|
|
```{r setup, include=FALSE}
|
|
library(R.matlab)
|
|
library(OpenImageR)
|
|
library(pracma)
|
|
library(Rmpfr)
|
|
```
|
|
|
|
```{r original image}
|
|
D <- rgb_2gray(readImage('image.jpg'))*255
|
|
plot(imageShow(D))
|
|
```
|
|
|
|
```{r robust pca, include=TRUE}
|
|
lambda <- 1e-2
|
|
m <- dim(D)[1]
|
|
n <- dim(D)[2]
|
|
tol <- 1e-7
|
|
maxIter <- 1000
|
|
# Initialize A,E,Y,u
|
|
Y <- D
|
|
norm_two <- norm(Y,"F")
|
|
norm_inf <- Norm(as.vector(Y), Inf) / lambda
|
|
Y <- Y / norm_inf
|
|
A_hat <- matrix(0,m, n)
|
|
E_hat <- matrix(0,m, n)
|
|
mu <- 1.25/norm_two
|
|
mu_bar <- mu * 1e7
|
|
rho <- 1.5 # this one can be tuned
|
|
d_norm <- norm(D, "F")
|
|
iter <- 0
|
|
total_svd <- 0
|
|
converged <- FALSE
|
|
stopCriterion <- 1
|
|
|
|
while(!converged){
|
|
iter <- iter + 1
|
|
iter
|
|
temp_T <- D - A_hat + (1/mu)*Y
|
|
E_hat <- pmax(temp_T - lambda/mu, 0)
|
|
E_hat <- E_hat+pmin(temp_T + lambda/mu, 0)
|
|
decomp <- svd(D - E_hat + (1/mu)*Y)
|
|
U <- decomp$u
|
|
S <- decomp$d
|
|
V <- decomp$v
|
|
S_t <- S- 1/mu
|
|
S_t[S_t<0] <- 0
|
|
A_hat <- U %*% diag(S_t) %*% t(V)
|
|
total_svd <- total_svd+1
|
|
Z <- D - A_hat - E_hat
|
|
Y <- Y + mu*Z
|
|
mu <- min(mu*rho, mu_bar)
|
|
# stop Criterion
|
|
stopCriterion <- norm(Z, "F") / d_norm
|
|
if (stopCriterion < tol){
|
|
converged <- TRUE
|
|
}
|
|
}
|
|
```
|
|
|
|
```{r show images, include=TRUE}
|
|
plot(imageShow(A_hat))
|
|
```
|
|
|
|
```{r show images}
|
|
plot(imageShow(E_hat))
|
|
```
|