2017-11-06 16 views
-1

ちょっと、次の問題があります。私は大きなパラメータ空間を持っています。私の場合、私は10次元のようです。しかし、単純化するために、私は3つの変数x1、x2、x3を仮定します。それらは1から10までの離散的な数です。今度はすべての可能なパラメータの組み合わせを作成し、後処理に使用したいと思います。私の実際のケースでは、それはあまりにも多くの組み合わせです。だから、私は探索空間を減らすために疑似ランダムシーケンス検索をしたいと思う。しかし、検索スペースの組み合わせは可能な限りそれをカバーする必要があります。 (一様分布)。私は、検索スペースでクラスタへのパラメータの組み合わせを防止したい、それは可能な限り良い全体の検索スペースをカバーする必要があります。私は、パラメータの処理におけるパラメータの組み合わせの好みを見つけるためにそれが必要です。それには、ハトン(Haton)、ハンマーズリー(Hammersley)、ソボール(Sobol)のようなアプローチがあります。しかし、彼らは離散数のために働いていません。疑似ランダムシーケンスを行う1つのパッケージは、カオスフィーです。私がシーケンスの数を丸めると、各変数の変数番号は、さまざまな変数の組み合わせで複数回現れます。それは私が望むものではありません。私は、すべての可変数が1回だけ出現し、変数が検索スペース内に一様に分布していることを望む。最初からすべての変数がちょうど一度現れる変数の組み合わせのランダムな多次元セットを作成する可能性はありますか?たとえば、2次元グリッド10x10では、1つの可能な組み合わせが対角線になります。Python:疑似ランダムシーケンスの代替

import numpy as np 
import chaospy as cp 

#Create a Joint distributuon of the three varaibles, which ranges going from 1 to 10 
distribution2 = cp.J(cp.Uniform(1, 10),cp.Uniform(1, 10),cp.Uniform(1, 10)) 

#Create 10 numbers in the variable space 
samplesSobol = distribution2.sample(10, rule="S") 

#Transpose the array to get the variable combinations in subarrays 
sobolPointsTranspose = np.transpose(samplesSobol) 

出力例:

もちろん3次元で私は

がソボル配列と1-10からの3変数を簡略化した例があります、すべてのパラメータの値をカバーする100の組み合わせが必要になります

[[ 7.89886475 6.34649658 4.8336792 ] [ 5.64886475 4.09649658 2.5836792 ] [ 1.14886475 8.59649658 7.0836792 ] [ 1.21917725 5.01055908 2.5133667 ] [ 5.71917725 9.51055908 7.0133667 ] [ 7.96917725 2.76055908 9.2633667 ] [ 3.46917725 7.26055908 4.7633667 ] [ 4.59417725 1.63555908 5.8883667 ] [ 9.09417725 6.13555908 1.3883667 ] [ 6.84417725 3.88555908 3.6383667 ]] 

ここで、すべての変数番号は一意ですが、出力は離散ではありません。私はそれを丸くて得ることができる:

[[ 8. 6. 5.] 
[ 6. 4. 3.] 
[ 1. 9. 7.] 
[ 1. 5. 3.] 
[ 6. 10. 7.] 
[ 8. 3. 9.] 
[ 3. 7. 5.] 
[ 5. 2. 6.] 
[ 9. 6. 1.] 
[ 7. 4. 4.]] 

今問題は、例えば1が三次元で第二又は7に一次元又は4回発生すること、です。

+1

_the検索スペース... _これはなんですか?そして、あなたのコードを最初に見たいと思っています...あなたが持っているものとあなたが得ることを期待しているものを表示してください... –

+0

あなたはあなたの問題についてもっと教えてください、そして達成しようとしているものあなたの問題をあなたがそれを記述する方法であなたの問題を解決する方法の数はおそらく役に立たないでしょう。なぜ数字が繰り返されないのですか?これは単一のパラメータごとにのみ、またはお互いにも依存しますか? – Arne

+0

私は実際にこのコードを見れば、この質問を答えるのが難しくなると思います。それは答えを出すためには、問題の説明をもっと明確にする必要があるということです。 –

答えて

1

「最初からすべての変数が一度だけ表示される変数の組み合わせのランダムな多次元セットを作成する可能性はありますか?」これを行うには、各変数に同じ数の可能な値を設定する必要があります。あなたの例ではこの数字は10ですから、私はそれを使用します。

ランダムポイントを生成する1つの方法は、範囲(10)のランダム置換を積み重ねることです。このように、例えば、三つの変数と:

In [180]: np.column_stack([np.random.permutation(10) for _ in range(3)]) 
Out[180]: 
array([[6, 6, 4], 
     [9, 2, 0], 
     [0, 4, 3], 
     [5, 9, 5], 
     [2, 8, 7], 
     [1, 1, 9], 
     [8, 3, 8], 
     [3, 5, 1], 
     [4, 0, 2], 
     [7, 7, 6]]) 
+0

可能性がありますが、私は変数を制御する方法が必要検索スペース内に均一に分布し、可能な限り検索スペースをカバーする – Varlor

+0

その情報を含めるように質問を編集してください。 –

+0

一様分布をどのように制御しますか?それはどういう意味ですか?あなたは何が起こってから正確に止めたいですか? – Arne

0

この回答は [A、B、C、D]は1と10の間の自然数であるような4値のリストのリストを生成する機能を与えます各セットでは、パラメータは正確に1回だけ任意の値をとることができます。

import random 

def generate_random_sequences(num_params=4, seed=0) 
    random.seed(seed) 
    value_lists = [[val for val in range(1, 11)] for _ in range(num_params)] 
    for values in value_lists: 
     random.shuffle(values) 
    ret = [[] for _ in range(num_params)] 
    for value_idx in range(10): 
     for param_idx in range(num_params): 
      ret[param_idx].append(value_lists[param_idx][value_idx]) 
    return ret 

私はウォーレンの答えがnumpyを使用していることが優れていることを知りました。あなたはすでにとにかくnumpyを使用しています。まだ純粋なPythonの実装としてこの1つを提出してください。