Compresión con SVD

svd_greco

lo he creado con

library(png)
 
tmp.file <- tempfile()
download.file("http://datanalytics.com/uploads/greco.png", tmp.file)
m <- readPNG(tmp.file)
 
svd.m <- svd(m)
 
filtra.svd <- function(svd, k){
  tmp <- svd
  tmp$d[(k+1):length(tmp$d)] <- 0
  res <- tmp$u %*% diag(tmp$d) %*% t(tmp$v)
 
  res[res > 1] <- 1
  res[res < 0] <- 0
 
  plot(1:2, type='n', xlab = "", 
       ylab = "", xaxt = "n", yaxt = "n",
       main = paste(k, "primeras componentes", sep = " "))
  rasterImage(res, 1, 1, 2, 2)
}
 
layout(matrix(1:9, 3, 3, byrow = T))
 
sapply(c(1,2,3,5,10,15,20,30,50), 
       function(k) filtra.svd(svd.m, k))

2 comentarios sobre “Compresión con SVD

  1. David 25 marzo, 2015 10:53

    Esta chulo, gracias.

    Aunque mi R de windows (R version 3.1.1 (2014-07-10) — «Sock it to Me»
    ) casca al intentar leer la imagen del temporal. Si lo apaño bajandola a mano a un png si que va y lo pinta.

    En el R de Linux (Debian) va tal cual, pero como lo tengo sin X (tendría que meterlo a un pdf).

    Pero chulo.

    Salu2

  2. daniel 26 marzo, 2015 13:07

    Un ejemplo muy bueno, ilustra claramente la utilidad del método svd, además de download.file, rasterimage, etc.

    Los ejemplos cortos y claros son un método muy bueno para aprender R y también para motivar a los que quieran aprenderlo. Un saludo.

Los comentarios están desabilitados.