Săptămâna aceasta, am vorbit pentru prima dată despre rețele neuronale și spuneam că, în multe ilustrații ale rețelelor neuronale, a existat un strat cu mai puțini neuroni decât variabile predictive,
dar uneori, ar putea avea sens să existe mai mulți neuroni în strat decât variabile predictive,
Pentru a ilustra, luați în considerare un exemplu simplu cu o singură variabilă (x) și un rezultat binar (yin{0,1})
set.seed(12345)
n = 100
x = c(runif(n),1+runif(n),2+runif(n))
y = rep(c(0,1,0),each=n)
Ar trebui să ne asigurăm că observațiile sunt în intervalul ((0,1)),
minmax = function(z) (z-min(z))/(max(z)-min(z))
xm = minmax(x)
df = data.frame(x=xm,y=y)
exact ca ceea ce putem vizualiza mai jos
plot(df$x,rep(0,3*n),col=1+df$y)
Aici, punctele albastre și roșii (când (y) este fie 0, fie 1) nu sunt separabile liniar. Funcția standard de activare în rețelele neuronale este sigmoidul
sigmoid = function(x) 1 / (1 + exp(-x))
Să calculăm o rețea neuronală
library(nnet)
set.seed(1234)
model_nnet = nnet(y~x,size=2,data=df)
Apoi putem obține greutățile și putem vizualiza cei doi neuroni
w = neuralweights(model_nnet)
x1 = cbind(1,df$x)%*%w$wts$"hidden 1 1"
x2 = cbind(1,df$x)%*%w$wts$"hidden 1 2"
b = w$wts$`out 1`
plot(sigmoid(x1),sigmoid(x2),col=1+df$y)
Acum, punctele albastre și roșii (când (y) este fie 0, fie 1) sunt de fapt separabile liniar.
abline(a=-b(1)/b(3),b=-b(2)/b(3))
Dacă nu specificăm sămânța generatorului aleator, putem obține un rezultat diferit deoarece, evident, acest model nu este identificabil
sau
Dacă avem acum
set.seed(12345)
n=100
x=c(runif(n),1+runif(n),2+runif(n),3+runif(n))
y=rep(c(0,1,0,1),each=n)
xm = minmax(x)
df = data.frame(x=xm,y=y)
plot(df$x,rep(0,4*n),col=1+df$y)
Acum avem nevoie de mai mulți neuroni
set.seed(321)
model_nnet = nnet(y~x,size=3,data=df)
w = neuralweights(model_nnet)
x1 = cbind(1,df$x)%*%w$wts$"hidden 1 1"
x2 = cbind(1,df$x)%*%w$wts$"hidden 1 2"
x3 = cbind(1,df$x)%*%w$wts$"hidden 1 3"
b = w$wts$`out 1`
library(scatterplot3d)
s3d = scatterplot3d(x=sigmoid(x1),
y=sigmoid(x2), z=sigmoid(x3),color=1+df$y)
dar încă o dată, am reușit să separăm (liniar) punctele albastre și cele roșii
În cele din urmă, luați în considerare
set.seed(123)
n=500
x1=runif(n)*3-1.5
x2=runif(n)*3-1.5
y = (x1^2+x2^2)<=1
x1m = minmax(x1)
x2m = minmax(x2)
df = data.frame(x1=x1m,x2=x2m,y=y)
plot(df$x1,df$x2,col=1+df$y)
și din nou, noi trei neuroni (pentru două variabile explicative) putem, din nou, liniar, separa punctele albastre și roșu
set.seed(1234)
model_nnet = nnet(y~x1+x2,size=3,data=df)
w = neuralweights(model_nnet)
x1 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 1"
x2 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 2"
x3 = cbind(1,df$x1,df$x2)%*%w$wts$"hidden 1 3"
b = w$wts$`out 1`
library(scatterplot3d)
s3d <- scatterplot3d(x=sigmoid(x1), y=sigmoid(x2), z=sigmoid(x3),
color=1+df$y)
Aici, rețelele neuronale joacă regula trucului nucleului, așa cum a fost inventat KoutroumbasK. & Theodoridis, S. (2008). Recunoașterea modelelor. Presa Academică