2017-04-20 6 views
1

にゼロを生成し、指数関数的な分布。対数正規PDFは私がfolowsとして指数分布の背景に対数正規分布から乱数を生成したいのpython

この地域では、Nアイテムを配布したいと考えています。しかし、これらのアイテムは、いくつかのモード(1〜25)と標準偏差(1〜7)を持つ独自の対数正規分布を持っています。私のコードは次のように機能します。

私は私が私がpref_valueと呼ばれるモードを知っていると私は、標準偏差がpower_of_preferenceと呼ばれる知っている、NはNと呼ばれる知っている、variable_vecと呼ばれる地域の配列を持っています。

まず、とpower_of_preferenceのパラメータをshapescaleと計算します。私の進歩よりもfolowsのとおりです。

unique_localities = np.unique(np.array(vec_of_variable)) #all values of localities 
res1 = [0 for i in range(len(unique_localities))] 
res = [0 for i in range(len(vec_of_variable))] #this will be desired output 
for i in range(len(res1)): 
    res1[i] = stats.lognorm.pdf(unique_localities[i], shape, 0, scale) #pdfs of values of localities 
res1 = np.array([x/min(res1) for x in res1]) #here is the problem, min(res1) could be zero, see text 
res1 = np.round(res1) 
res1 = np.cumsum(res1) 
item = 0 
while item < N: 
    r = random.uniform(0, max(res1)) 
    site_pdf_value_vec = [x for x in res1 if x >= r] 
    site_pdf_value = min(site_pdf_value_vec) #this is value of locality where Ill place one item 

コードは続けますが、重要な部分はここにあります。簡単に言えば、地域のlognorm pdf値は、その地域に私のアイテムを配置する確率である。これが私がpdf値を必要とする理由です。

PS:このアプローチは私の上司によって承認されているため、変更したくありません。

問題は、時々起こる、そのmin(res1) = 0です。 0より小さい分け、res1は無限の配列になります。 0と25の間のxの対数正規性は決してゼロではありませんが、非常に近い可能性があります。私はその問題は、これらのpdf値の1つがゼロに近すぎるので、pythonは0にすることですround

私の質問では、res1のコードにゼロが表示されないようにするにはどうすればいいですか?私の考えは、Pythonで最小の正の浮動小数点数を0に置き換えることでしたが、この値はわかりません。それとももっと洗練されたソリューションがありますか?

Thxヘルプ。

PS:逆値res1を取っていない人は、問題のステップがスーパーフローに見えることがあります。しかし、これらの値の最小値がゼロでないのはコントロールです。言い換えれば、すべての地域は、1つのpdfがゼロである場合、その確率は間隔ではなく1つの数であるという、ある程度の「間隔」「確率」を有さなければならない。

答えて

2

lognorm.pdfではなく、を計算し、ログ領域で作業します。これは、ゼロに丸められている非常に小さな確率について、より良い精度を有するべきである。

+0

私はこの解決策を試しましたが、まだ問題が発生することがあります。でもありがとう。他のアイデアはありますか? – Bobesh

+0

ログは-infですか?その場合、確率を実際にゼロとして扱う必要があります。アルゴリズムがゼロで割った場合、それはコードではなくアルゴリズムの問​​題です。 – jakevdp

関連する問題