Search
TEST 07
Vyzkoušíme chování perceptronu na datech ctvrtkruh.csv.
d <- read.csv(file='ctvrtkruh.csv') summary(d) with(d, plot(a, b, col=c('red','blue')[class+1]))
“Perceptron”
library(neuralnet) n <- neuralnet(class ~ a+b, d, hidden=0) plot(n) summary(n)
# predikce pred <- as.numeric(n$net.result > 0.5) table(d$class, pred) round(prop.table(table(d$class, pred)),2) # vizualizace: with(d, plot(a, b, col=c('red','blue')[class+1])) # weights <- n$weights[[1]][[1]] # abline(a=-weights[1]/weights[3], b=-weights[2]/weights[3],col='green',lwd=3) with(d[d$class!=pred,], points(a, b, pch=19))
Pokusíme se model z předchozího kroku vylepšit. Zkusme použít trik, tzv. “vyrovnání příznakového prostoru”. Do dat dogenerujte atributy a2 = a^2, b2 = b^2 a ab = a*b a znovu proveďte předešlé cvičení.
d$a2 <- d$a^2 d$b2 <- d$b^2 d$ab <- d$a*d$b n2 <- neuralnet(class ~ a+b+a2+b2+ab, d, hidden=0) pred2 <- as.numeric(compute(n2,d[,-3])$net.result > 0.5) with(d, plot(a, b, col=c('red','blue')[class+1])) with(d[d$class!=pred2,], points(a, b, pch=19)) table(d$class!=pred2)
Předešlá data se nám podařilo klasifikovat jednoduchým perceptronem, ovšem za použití triku. Nyní se pokusíme postupovat jinak (použijeme jiný trik). Místo jediného neuronu využijeme celou síť neuronů.
nnet(class~a+b, d, size=???, skip=FALSE)
Nyní se pokusíme neuronovou síť použít pro klasifikaci do více tříd. V souboru digits-train.csv naleznete 10×100 naskenovaných ručně psaných číslic (100 exemplářů každé z číslic 0-9), viz .
Vaším úkolem bude číslice klasifikovat.
# nacteni z CSV d.train <- read.csv('digits-train.csv') # kolik mame dat? dim(d.train) # vypsani jmen prvnich 10ti sloupcu colnames(d.train)[1:10] # jmeno prvniho sloupce zmenime na 'class' pro snazsi (intuitivnejsi) praci: colnames(d.train)[1] <- 'class' # a typ dat ve sloupci zmenime na 'factor' (bude se to hodit pri konstrukci # neuronove site, protoze funkce 'nnet' ocekava, ze odezva bude typu 'factor') d.train$class <- as.factor(d.train$class)
Kód k vykreslení:
# Funkce k vykresleni jedne cislice. # parametry: # d - data frame # idx - index cislice plotDigit<-function(d,idx) { # transformace radku z datove matice na matici 13x13 m <- matrix(as.numeric(d[idx,-1]), 13, 13) # prevraceni matice "vzhuru nohama" a transpozice tak, aby # funkce 'image' vykreslila to, co chceme: m <- t(m[nrow(m):1,]) image(m,col=gray.colors(10), xaxt='n', yaxt='n') } # budeme kreslit v rastru 2x5 obrazku opar <- par(mfrow=c(2,5)) # uschovame si soucasne rozlozeni obrazku, tj. 1x1) # vykreslime jednoho reprezentanta od kazde cislice: for (idx in 100*(1:10)) plotDigit(d.train,idx) par(opar) # obnovime puvodni nastaveni obrazku, tj. 1x1
d.train <- cbind(d.train,model.matrix(~d.train$class-1)) names(d.train)[171:180] <- paste0('class',0:9) form <- as.formula(paste(paste(names(d.train)[171:179],' +',collapse=''),'class9 ~ V2',paste(' +',names(d.train)[3:170],collapse=''))) n <- neuralnet(form, d.train, hidden=20) # vypsani vah: summary(n) # predikce na trenovaci mnozine: pred <- as.factor(apply(n$net.result[[1]],1,which.max)) # tabulka popisujici uspesnost klasifikace: tbl.train <- table(d.train$class,pred) tbl.train # uspesnost ciselne (podil souctu spravne klasifikovanych cislic (hodnoty na diagonale) vuci vsem cislicim): sum(diag(tbl.train)) / sum(tbl.train)
V dnešním cvičení jsme ilustrovali použití sítí v klasifikačních úlohách. Pomocí vícevrstvé sítě však lze i predikovat hodnotu spojité veličiny (regrese).
Poznamejme ještě, že typů neuronových sítí je mnohem více, a rozsah jejich použití je mnohem širší, než jen klasifikace či regrese. Hopfieldova síť se dá využít jako asociativní paměť či k řešení optimalizačních úloh, Kohonenova samoorganizující se síť zase jako metoda shlukování dat (učení bez učitele).
Další informace je možné nalézt například v knize Mařík, Štěpánková, Lažanský: Umělá inteligence 4 v kapitole 7: Vybrané partie z neuronových sítí.