0

左側の白から右側の赤まで、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()

4

1 に答える 1

3

corすべての順列をテストして最小値の順列を取得することは実際には合理的ではないため(順列の数は10!3 628 800であるため)、最適化を試すことができます。これを行う1つの方法は次のとおりです。

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]ます。

于 2013-03-26T09:45:20.903 に答える