R中的社交网络和遗传算法

时间:2011-01-20 22:25:22

标签: r genetic-algorithm social-networking

我正在尝试从R中的文章(链接:Borgatti & Everett 2000)实施网络核心 - 外围度量。作者应用的基本方法是:

  1. 排列网络矩阵的行和列,以便彼此连接良好的演员占据左上角。

  2. 根据步骤1中的行/列排列创建理想的模式矩阵

  3. 评估两个矩阵之间的相关性

  4. 根据作者的说法,第一步中的技巧是找到矩阵的行/列排列,它将最高值与其诱导模式矩阵相关联,并且他们建议使用遗传算法找到最佳行/列排列。我陷入了算法的第一步:

    1. 如何在R中创建保留列/行条目顺序的随机行/列矩阵排列?

    2. 一旦我评估了矩阵排列和模式矩阵之间的拟合,我如何根据“最适合”的矩阵“培育”新的矩阵排列?

    3. 感谢。

2 个答案:

答案 0 :(得分:2)

给定特定大小的矩阵,您可以生成随机行/列矩阵排列

#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)
}

在测量健康状况后,您需要一些方法来确定哪些区域有助于健身,并在改变其他区域时修复这些区域(&#34;品种&#34;)。也许dist()会有一些用处。也许热图或聚类,hclust(),也会有用吗?您能否提供有关如何确定本地化适应性的更多详细信息?

答案 1 :(得分:2)

OneWhoIsUnnamed响应与我解释您对#1的需求相同。

这是两个邻接矩阵的基于适应度的重组方法,#2:

假设您有两个矩阵A和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]