我一直在使用SAGE提供的random_element()
函數來爲給定整數(N
)生成隨機整數分區,它們是特定長度的(S
)。我試圖從給定值爲N
和S
的所有分區集合中生成無偏差的隨機樣本。 SAGE的功能可快速返回N個隨機分區(即Partitions(N).random_element()
)。在Python中隨機生成特定長度的整數分區的算法?
但是,當添加S
(即Partitions(N,length=S).random_element()
)時,它會非常緩慢。同樣,篩選長度爲S
的N
的隨機分區速度非常慢。
不過,我希望這可以幫助別人,我發現,在該情況下,當函數返回的N
分區不匹配長度S
,使共軛物分區往往是長S.即是:
S = 10
N = 100
part = list(Partitions(N).random_element())
if len(part) != S:
SAD = list(Partition(part).conjugate())
if len(SAD) != S:
continue
這增加了長度的S
分區被發現,並且似乎產生無偏採樣速率(I已經研究針對爲N
和S
各種值分區的整個組的結果)。然而,我使用N的值(例如10,000
)和S(例如300
),這使得即使這種方法實際上也很慢。與SAGE的random_element()
函數相關的評論承認有充足的優化空間。那麼,是否有辦法更快速地生成匹配給定值N
和S
的整數分區的無偏(即隨機均勻)樣本,或許不會生成不匹配S
的分區?此外,使用共軛分區在很多情況下都能很好地生成無偏差的樣本,但我不能說我準確地理解了原因。
感謝您的迴應,但我不明白這個函數如何產生分區基於統一的隨機抽樣。 – klocey 2012-04-24 01:20:58
@ klocey,我錯過了你從序列中產生隨機元素的事實,對不起。 – 2012-04-24 01:40:57
我實現了這個功能,並將它生成的隨機樣本與N和S的幾個組合的全部分區進行比較。使用由分區差異產生的核密度曲線進行比較。就像我試過的每一個採樣策略一樣,這個函數產生有偏差的樣本(低於預期方差的分區)。顯然,對於給定的總N和長度S,從所有分區的集合中生成一個無偏隨機樣本非常困難。SAGE函數是我最接近的,但它遠非最優。 – klocey 2012-04-24 06:38:49