生成过度混合的矢量
问题描述:
想象一下,横跨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
,以便彼此旁边的数字(最近的邻居)比彼此之间的数字更可能不同,那么实现这一目标的好方法是什么?
例如对于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
我想产生洗牌x
以产生向量,其中cor()
强烈负。
答
由于测试每个排列并采用最小值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]
。
也许你可以举一个你想要输出的例子吗? – alexwhan 2013-03-26 08:38:58