Spatial segregation in cities – An explanation by a neural network model (Demographics & neural network)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
As you will certainly see later on this blog, I am extremely interested in neural networks. My reference book is “Networks, crowds and markets: reasoning about a highly connected world” by David Easley and Jon Kleinberg who are professors at Cornell University.
![]() |
|
In this simple representation of a neural network, each node is represented by a person, each edge by a dashed line. |
#package installation
install.packages(“hydroTSM”)
library(hydroTSM)
#initialization
size = 200
q = matrix(0, nrow = size, ncol = size)
countMinus1 = matrix(0, nrow = size, ncol = size)
countPlus1 = matrix(0, nrow = size, ncol = size)
prob = runif(size*size)
for (i in 1:size){
for (j in 1:size){
if(prob[(i-1)*size + j]<0.4){ # row 1: column 1 to 200; then row 2: column 1 to 200; etc...
q[i,j] = -1 # 40% of type -1, randomly distributed.
}
if(prob[(i-1)*size + j]>0.5){
q[i,j] = 1 # 50% of type 1, randomly distributed.
} # 10 other % of type 0, randomly distributed.
}
}
#the recursive process
for (k in 1:50){ # 50 steps of population aggregation = 50 plots.
#the function file.path is really useful to save automatically many plots.
mypath <- file.path("C:","Users","PCordier","Documents","Blog","Post4","Plots", paste("myplot_", k, ".png", sep = ""))
png(file=mypath)
mytitle = paste(“my title is”, k)
print(matrixplot(q)) # At each step, saving of the precedent plot.
dev.off() # k=0: initial random q matrix, then matrix result of the followings.
for(i in 1:size){
for(j in 1:size){
value = q[i,j]
if(i==1){ # row 1
if(j==1){ # top left cell of the row 1 : one house with 3 neighbours
a = table(c(q[i+1,j], q[i,j+1], q[i+1, j+1])) # Number of 0, -1, 1 among the 3 surrounding houses (max = 3!).
if(“-1” %in% names(a)){ # If there are some -1, there is a column with name -1.
countMinus1[i,j] = a[names(a)==-1]} # Number of -1 around the house of coordinates 1,1.
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){ # Same for number of 1 in the neighbourhood.
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else if(j==size){ # top right cell of the row 1 : one house with 3 neighbours
a = table(c(q[i+1,j], q[i,j-1], q[i+1, j-1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else{ # all top middle cells : 198 houses with 5 neighbours
a = table(c(q[i+1,j], q[i+1,j+1],q[i,j-1],q[i,j+1], q[i+1, j-1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
}
else if(i==size){ # last row
if(j==1){ # bottom left : one house with 3 neighbours
a = table(c(q[i-1,j], q[i,j+1], q[i-1, j+1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else if(j==size) # bottom right : one house with 3 neighbours
a = table(c(q[i-1,j], q[i,j-1], q[i-1, j-1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else{ # bottom center : 198 houses with 5 neighbours
a = table(c(q[i-1,j], q[i-1,j+1],q[i,j-1],q[i,j+1], q[i-1, j-1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
}
else{
if(j==1){ # center left : 198 houses with 5 neighbours
a = table(c(q[i-1,j], q[i+1,j], q[i-1,j+1],q[i,j+1],q[i+1,j+1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else if(j==size){ # center right : 198 houses with 5 neighbours
a = table(c(q[i-1,j], q[i+1,j], q[i-1,j-1],q[i,j-1],q[i+1,j-1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
else{ # center center : 39204 houses with 8 neighbours
a = table(c(q[i-1,j], q[i+1,j], q[i-1,j-1],q[i,j-1],q[i+1,j-1], q[i-1,j+1],q[i,j+1],q[i+1,j+1]))
if(“-1” %in% names(a)){
countMinus1[i,j] = a[names(a)==-1]}
else{countMinus1[i,j] = 0}
if(“1” %in% names(a)){
countPlus1[i,j] = a[names(a)==1]}
else{countPlus1[i,j]= 0}
}
}
}
}
listEmpty = which(q == 0)
listMissingMinus1 = which( countMinus1 < 4)
listMissingPlus1 = which( countPlus1 < 4)
listToMovePlus = which((countPlus1 < 4 & q == 1))
listToMoveMinus = which((countMinus1 < 4 & q == -1))
listOfPlacePlus = which((countPlus1 >=4 & q == 0))
listOfPlaceMinus = which((countMinus1 >= 4 & q == 0))
while (length(listToMovePlus)!=0 && length(listOfPlacePlus) != 0){
number = sample(1:length(listOfPlacePlus), 1)
number2 = sample(1:length(listToMovePlus), 1)
q[listToMovePlus[number2]] = 0
q[listOfPlacePlus[number]] = 1
listToMovePlus = listToMovePlus[-number2]
listOfPlacePlus = listOfPlacePlus[-number]
}
while (length(listToMoveMinus)!=0 && length(listOfPlaceMinus) != 0){
number = sample(1:length(listOfPlaceMinus), 1)
number2 = sample(1:length(listToMoveMinus), 1)
q[listToMoveMinus[number2]] = 0
q[listOfPlaceMinus[number]] = -1
listToMoveMinus = listToMoveMinus[-number2]
listOfPlaceMinus = listOfPlaceMinus[-number]
}
}
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.