##### Kuvanpakkaus-esimerkki library(ICS) library(pixmap) # Piirtofunktio draw <- function(M, title = ""){ suppressWarnings(plot(pixmapGrey(M), main = title)) } # SVD-funktio SVD_appr <- function(M_svd, k){ if(k == 1){ return(M_svd$u[, 1:k, drop = FALSE]%*%matrix(M_svd$d[1], 1, 1)%*%t(M_svd$v[, 1:k, drop = FALSE])) } else{ return(M_svd$u[, 1:k, drop = FALSE]%*%diag(M_svd$d[1:k])%*%t(M_svd$v[, 1:k, drop = FALSE])) } } # Ladataan kissan kuva kissa <- read.pnm(system.file("pictures/cat.pgm", package = "ICS")[1])@grey draw(kissa) # Kuva on esitetty 130x130 -matriisina, jossa jokaista pikseliä vastaa välillä [0, 1] oleva # luku, joka kertoo pikselin tummuuden (0 = musta, 1 = valkoinen) dim(kissa) # Kuvan vasen ylänurkka kissa[1:5, 1:5] # Pikseleitä kuvassa on yhteensä 130*130 # Kuvan SVD-hajotelma kissa_svd <- svd(kissa) kissa_svd$u kissa_svd$d kissa_svd$v # Singulaariarvojen suuruudet plot(kissa_svd$d, type = 'b', xlab = "k", ylab = "k:s singulaariarvo") # Korvataan pienet singulaariarvot nollilla ja katsotaan miten kuvalle käy # Yksi singulaariarvo k <- 1 kissa_app <- SVD_appr(kissa_svd, k) draw(kissa_app) # Katsotaan miten kuva paranee kun lisätään singulaariarvoja for(k in 1:20){ kissa_app <- SVD_appr(kissa_svd, k) draw(kissa_app, title = paste0("k = ", k, ", arvoja = ", k + 260*k)) Sys.sleep(2) } ##### Artikkeli-esimerkki # Lue tiedosto nytimes.RData workspaceen # Matriisin rivit vastaavat artikkeleita New York Times -lehdessä ja # sarakkeet kertovat tiettyjen sanojen standardoidut esiintymisosuudet kys. artikkeleissa nytimes[1:6, 1:8] # Yhteensä 102 artikkelia ja 4425 eri sanaa # -> 102 x 4425 -matriisi # Katsotaan miten SVD tiivistää matriisin sisältämää informaatiota nytimes_svd <- svd(nytimes) # Otetaan matriisin U kaksi ensimmäistä saraketta ja piirretään kyseiset pisteet koordinaatistoon, # jolloin voidaan ajatella, että jokainen piste vastaa yhtä artikkelia plot(nytimes_svd$u[, 1:2], xlab = "Ensimmäinen sarake", ylab = "Toinen sarake") # Osa artikkeleista liittyi kuvataiteeseen ja osa musiikkiin, väritetään artikkelit eri väreillä kuvaan # Musta kolmio = kuvataide # Punainen ympyrä = musiikki plot(nytimes_svd$u[, 1:2], col = nytimes_tyypit, pch = 1 + (nytimes_tyypit == "art"), xlab = "Ensimmäinen sarake", ylab = "Toinen sarake") # => SVD osasi erotella artikkelit eri tyyppeihin pelkkien niiden sisältämien sanojen perusteella. # Tämän perusteella voisi rakentaa esim. algoritmin, joka kertoo artikkelin tyypin (kuvataide/musiikki), # kun sille antaa eri sanojen määrät artikkelissa...