2016-03-21 12 views
0

で一日の時間のランダムな範囲のためのアルゴリズムが、私はランダムなデータが次のグラフと同様に(必ずしも均等に)動作するようにしたいです私は赤ちゃんの睡眠時間のランダムデータを生成したいの重み

(これは単なる架空のデータであり、あなたの赤ちゃんが寝なければならないとき、このから何も特別ではないと結論しないでください...)

私が生産したい出力のようなものです:

Baby name Sleep start   Sleep end 
Noah   2016/03/21 08:38 2016/03/21 09:28 
Liam   2016/03/21 12:43 2016/03/21 15:00 
Emma   2016/03/21 19:45 2016/03/22 06:03 

私はの時間表重量(赤ちゃんが寝るチャンス)を作成すると考えました。

質問は、このウェイトテーブルから睡眠時間のランダムなデータをどのように生成するのですか?

(赤ちゃんが午前8時頃に寝るようになったら、次の2時間で目を覚まし、さらに寝ることはなく、午前7時までほとんど眠れないでしょうか)

これを構築する別の方法がありますか(ウェイトテーブルなし)?

私はこれをPython(3)で構築する方が好きですが、私は一般的なアルゴリズムに感謝して解決策につながります。

+4

私は質問を理解しているか分かりません。あなたは実際に赤ちゃんの睡眠時の確率データを持っていますか?あなたは睡眠時間をランダムに発生させたいのですか?それとも、すべてをゼロから作るのですか?後者の場合、どのように正しいことが分かりますか? – Blckknght

+0

私はすべてを作っています。 実際のデータとは無関係であると判断したのは正しいですか? 何が正しいかの判断は、重みテーブル(私が見ているように)です。そこから、データが真であるかどうかは関係ありません。アルゴリズムは行動を模倣すべきです。 – Gluz

+0

@Gluzあなたが作るものが正しいとすれば、あなたの質問は何ですか?どのようなアプローチが間違っていますか? –

答えて

0

重み表のデータを考えると、あなたはnumpy.random.choiceを使用することができます。

np.random.choice(list_of_times, 
       num_babies, 
       p=list_of_weights_for_those_times) 

重み表を使用せずに、あなたのディストリビューションを記述する機能を見つける必要があります。次に、this questionへの回答を参照してください。

0

私はそれを誤解したので、あなたの質問の逆に答えることから始めましょう。それは私にも答えを与えました。

すでに24時間前後に間隔のリストが分散しているとします。あなたは、1日の任意の分に重なる複数の間隔を探したいと思います。これはweightと呼ばれます。

私は2つのアプローチが考えられます。

# Note the 19:45-06:03 has been split into two intervals (1185,1440) and (0,363) 
st = sorted(list(to_parts(sleep_table)) 
>>> [(0, 363), (518, 568), (763, 900), (1185, 1440)] 

まず、簡単な解決策は、すべての間隔で1と和の束の中にすべての間隔を変換するために、次のようになります:しかし、最初にあなたのリストの中倍になるので、分にあなたの時間間隔を変換する必要があります

eod = 60*24 
weights = reduce(lambda c,x: [l+r for l,r in zip(c, [0]*x[0] + [1]*(x[1]-x[0]) + [0]*(eod-x[1]))] ,st,[0]*eod) 

これは、1440のサイズのリストを表示します。ここで、各エントリは、1分の1分間の重量です。

第2に、nセグメントの時間が同じO(nlogn)に同じ値を与える、より複雑なラインスイープアルゴリズムです。

def start_end(st): 
    for t in st: 
     yield (t[0],1) 
     yield (t[1],-1) 
sorted(list(start_end(st))) 
#perform a line sweep to find changes in the weights 
map(lambda (i,l):(i,sum(map(itemgetter(1),l))),groupby(sorted(list(start_end(st))), itemgetter(0))) 
#compute the running sum of weights 
#See question 35605014 for this part of the answer 

、あなたが重みから身を開始する場合:必要なのは、時間が開始または終了時刻であるかどうかを追跡しながら、ただ、間隔の開始時刻と終了時刻を取得し、それらを並べ替えることです。インターバルに結合されていない開始時間と終了時間のリストに簡単に変換できます。ポストの滑らかなスプラインをステップ関数に変換するだけです。ステップ関数の値が増加するたびに、スリープ開始時間を追加し、ダウンするたびにスリープ停止時間を追加します。最後に、睡眠開始時間と睡眠終了時間を一致させるための線スイープを実行します。ここには少し揺れる部屋があります。開始時刻と終了時刻を一致させることができます。より多くのデータポイントが必要な場合は、同じ時点にある限り、追加の睡眠開始時間と終了時間を導入することができます。

関連する問題