Test: https://goo.gl/forms/1aLyuR5zDgYypfFR2
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)) a pokuste se opět klasifikovat stejná data.
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í.