2016-03-21 24 views
0

我想生產的嬰兒睡眠時間的隨機數據的隨機範圍的時間,但我想要的隨機數據類似的(不一定相等)表現爲以下圖表:算法在一天的權重

enter image description here

(這只是一個假想的數據,請不要由此得出結論任何東西,特別是不能當你的寶寶應該睡...)

,我要產生的輸出是一樣的東西:

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點左右開始睡覺,最有可能他/她會在接下來的兩個小時內醒來,而不再繼續睡覺,幾乎肯定不會再睡到早上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小時內分散的間隔列表。你想找到一些與當天任何給定分鐘重疊的時間間隔;你稱之爲weight

我可以想到兩種方法。但是,首先你應該將時間間隔轉換成分鐘,所以在列表中的時間就變成了:

# 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,每個條目是在一天的給定分鐘重量的列表。第二,是一個稍微複雜一點的線掃描算法,它會給你段的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 

現在,如果你從權重本身開始。您可以輕鬆將其轉換爲開始和結束時間列表,這些列表不會間隔耦合。您只需將帖子中的平滑樣條轉換爲步驟函數即可。每當階梯函數的值增加時,您都會添加一個睡眠開始時間,並且每當它停止時您都會添加一個睡眠停止時間。最後,您執行行掃描以將睡眠開始時間與睡眠結束時間相匹配。這裏有一點擺動的空間;因爲您可以將任何開始時間與任何結束時間相匹配。如果您需要更多的數據點,只要它們處於相同的時間點,就可以引入額外的睡眠開始和結束時間。