Социальные сети и генетические алгоритмы в R - PullRequest
1 голос
/ 21 января 2011

Я пытаюсь реализовать меру «ядро-периферия сети» из статьи (ссылка: Borgatti & Everett 2000 ) в R. Основной подход, применяемый авторами, заключается в следующем:

  1. Расположите строки и столбцы сетевой матрицы так, чтобы актеры, которые хорошо связаны друг с другом, занимали верхний левый угол.

  2. Создание идеальной матрицы шаблонов на основерасположение строк / столбцов на шаге 1

  3. Оценить корреляцию между двумя матрицами

По мнению авторов, хитрость на первом шаге состоит в том, чтобынайдите расположение строки / столбца матрицы, которая коррелирует самое высокое с ее индуцированной матрицей матрицы, и они рекомендуют использовать генетический алгоритм, чтобы найти наилучшее расположение строки / столбца.Я застрял на первых шагах алгоритма:

  1. Как в R создать случайные расположения строк / матриц столбцов, которые сохраняют порядок записей столбцов / строк?

  2. После того, как я оценил соответствие между матричными расположениями и матрицами шаблонов, как мне «развести» новые матричные размещения на основе «наиболее подходящих» матриц?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 января 2011

OneWhoIsUnname ответ такой же, как я интерпретировал вашу потребность в # 1.

Вот подходящий метод рекомбинации для двух матриц смежности, # 2:

Скажем, у вас две матрицыи B, которые имеют пригодные ядра Fa и Fb 2,3 и 1,1, соответственно.Разведите матрицы, построив новую матрицу C, где C_ {i} = A_ {i} с вероятностью Fa / (Fa + Fb) или C_ {i} = B_ {i} с вероятностью 1-Fa / (Fa + Fb).Это всего лишь один из неограниченных способов разведения матриц.M - результат спаривания A и B в зависимости от их пригодности.

# lets define a function to create random adjacency matrices
random_adjacent <- function(dimension)
{
    ret  <- matrix(runif(dimension^2)>0.5,dimension,dimension)
    retl <- ret * lower.tri(ret)
    return( retl + t(retl) )
}
# set fitness
Fa <- 2.3
Fb <- 1.1
# initialize matrices
A  <- random_adjacent(4)
B  <- random_adjacent(4)
# compute symmetric fitness probability matrix
C  <- matrix(runif(16)<Fa/(Fa+Fb),4,4)
Cl <- C * lower.tri(C) # take the lower triangular portion
C  <- Cl + t(Cl)       # reflect the lower triangular portion into the upper
# compute mated result
M  <- matrix(0,4,4)
M[C]  <- A[C]
M[!C] <- B[!C]
2 голосов
/ 21 января 2011

Учитывая матрицу определенного размера, вы можете сгенерировать случайные матрицы строк / столбцов как таковые

#create fake data
mydata.block1 <- matrix (rep(1, times=100), ncol=10)
mydata.block2 <- matrix (rep(0, times=900), ncol=90)
mydata.block3 <- matrix (rep(0, times=900), ncol=10)
mydata.block4 <- matrix (rep(1, times=8100), ncol=90)

mydata <- rbind(cbind (mydata.block1, mydata.block2), cbind (mydata.block3, mydata.block4))

#Mix mydata
mix.order <- sample(1:dim (mydata)[1])
mydata <- mydata[mix.order,mix.order]

#create 100 random orderings

##preallocate matrix
rand.samp <- matrix (rep(NA, times=10000), ncol=100)
##create orderings
for (i in 1:100){
rand.samp[i,] <- sample(1:dim (mydata)[1])
}
##Eliminate duplicate orderings (unlikely to occur)
rand.samp <- unique (rand.samp)


#Reorder and measure fitness
##preallocate fitness measure
fit.meas <- rep (NA, times=100)

for (i in 1:100){
mydata.reordered <- mydata[rand.samp[i,],rand.samp[i,]]
fit.meas[i] <- myfitnessfunc(mydata.reordered)
}

После того, как вы измерили пригодность, вам потребуется какой-то способ определить, какие области способствуютфитнес и исправить те, изменяя другие области («породы»).Возможно, dist () будет полезен.Может быть, тепловая карта или кластеризация, hclust (), также будет полезна?Можете ли вы дать более подробную информацию о том, как вы будете определять локализованную пригодность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...