生成一个过度混合的矢量

时间:2013-03-26 08:23:08

标签: r

想象一下,穿过​​x轴的颜色平滑,从左边的白色到右边的红色。此渐变由x描述。

set.seed(444)
x <-sort(runif(10,0,1))
x
 #[1] 0.04887351 0.05602405 0.16805309 0.18510214 0.28311653 0.36549003 0.38968610 
 #    0.55943791 0.57680379 0.84906069

在向量中彼此相邻的x元素与序列中相邻的元素更相似。我可以将这个向量与sample(x,10)随机混合。但是,如果我想改变x以使得彼此相邻的数字(最近的邻居)比那些远离彼此的数字更可能彼此不同,那么实现这一目标的好方法是什么?

e.g。对于x,元素与其最接近元素的平均值之间的相关性是明确的:

neighbour <- c(x[2],mean(x[1],x[3]),mean(x[2],x[4]),mean(x[3],x[5]),
               mean(x[4],x[6]),mean(x[5],x[7]),mean(x[6],x[8]),
               mean(x[7],x[9]),mean(x[8],x[10]),x[9])
 cor(x,neighbour)
#[1] 0.9539783

我想制作一个shuffle x来生成cor()强烈负数的向量。

1 个答案:

答案 0 :(得分:3)

由于测试每个排列并使用具有最小cor值的排序(因为排列数为10!,即3 628 800)并不合理,因此您可以尝试优化。这是一种方法:

a <- sort(runif(10,0,1))

#The function to minimize
f<-function(par,vec){
    x<-vec[par]
    neighbour <- c(x[2],mean(x[1],x[3]),mean(x[2],x[4]),mean(x[3],x[5]),
               mean(x[4],x[6]),mean(x[5],x[7]),mean(x[6],x[8]),
               mean(x[7],x[9]),mean(x[8],x[10]),x[9])
    cor(x,neighbour)
    }

# A function to generate a new permutation to test  
g<-function(par,vec){sample(par, length(par))}

res <- optim(par=seq_along(a), fn=f, gr=g, vec=a, method="SANN", 
      control=list(maxit = 30000, temp = 2000, trace = TRUE, REPORT = 500))

您的结果是a[res$par]