亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 numpy 離散接近高斯分布

使用 numpy 離散接近高斯分布

呼喚遠方 2021-09-02 20:26:24
我試圖獲得 n >= 2 的高斯分布的離散接近度。因此,假設 n = 2,那么離散接近度將為 [0.5, 0.5]。當 n = 3 時,它會是 [0.25, 0.5, 0.25]當 n = 4 時,它會是 [0.125, 0.375, 0.375, 0.125]我希望你明白我的意思。作為所有分布,返回的離散鄰近數組總和應始終為 1。這是我的代碼:import numpy as npimport matplotlib.pyplot as pltimport mathimport scipy from random import randintdef discrete_gauss(n):    g = [0.5, 0.5]    f = g    for x in range(1, n - 1):        f = np.convolve(f,g)    if(sum(f) != 1):        print("The distribution sum is not 1.")    else:        return f現在,當我使用 (1 < n < 68) 時,'discrete_gauss' 效果很好,但是當我輸入 (n > 67) 時,f 的總和與 1 不同(有時多有時少),我不知道為什么。任何人都有任何線索?對不起,我試圖保持簡短的凌亂問題。如果事情不清楚,我很樂意澄清。謝謝。
查看完整描述

1 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

閱讀這篇關于使用浮點數學的挑戰的論文,然后重新考慮你的方法。


解決方案

這是生成所需“分布”的替代過程,可避免np.convolve執行求和中的浮點舍入錯誤:


import numpy as np

import scipy.special as sps


def discrete_gauss(n):

    f = np.array([sps.comb(n - 1, i, exact=True) for i in range(n)], dtype='O')

    f = np.float64(f)/np.float64(f).sum()


    if not np.allclose(f.sum(), 1.0):

        raise ValueError("The distribution sum is not close to 1.\n" 

                         "f.sum(): %s" % f.sum())


    return f

解決方案說明

你想要的序列相當于n帕斯卡三角形的第 th 層(參見二項式定理 Wiki頂部的圖),歸一化以便它可以表示概率。上述解決方案使用標準 Pythonint值(在 Python 3 中默認為任意精度)來查找n第 th 級中的值,然后僅在歸一化步驟(即np.float64(f)/np.float64(f).sum())的最后切換到浮點數學。


請注意在not np.allclose(f.sum(), 1.0)上面的檢查中使用,而不是f.sum() != 1.0。正如下面更深入的潛水部分所討論的f.sum(),1.0對于n1-1000的值的約 90%將等于。但是,通常您不能假設浮點計算的結果與使用實數進行等效計算得到的結果完全匹配(有關所有詳細信息,請參閱本文)。在處理浮點數時,您通常(我的意思是幾乎總是)檢查結果是否接近(即等于在給定的容差/誤差范圍內)您的預期值,而不是等于它。


更深的潛水

這個解決方案并不完美。大多數值n產生的結果正好等于1.0,但有些則不是。以下代碼檢查1-1000 之間的discrete_gauss(n)值的結果n:


nnot1 = []

for n in range(1,1001):

    if discrete_gauss(n).sum() != 1.0:

        nnot1.append(n)


print('discrete_gauss(n).sum() was not equal to 1.0 for %d values of n.' % len(nnot1))

print(nnot1)

輸出:


discrete_gauss(n).sum() was not equal to 1.0 for 75 values of n.

[78, 89, 110, 114, 125, 127, 180, 182, 201, 206, 235, 248, 273, 342, 346, 348, 365, 373, 383, 390, 402, 403, 421, 427, 429, 451, 454, 471, 502, 531, 540, 556, 558, 574, 579, 584, 587, 595, 600, 609, 617, 631, 633, 647, 648, 651, 657, 669, 674, 703, 705, 728, 731, 763, 765, 772, 778, 783, 798, 816, 837, 852, 858, 860, 861, 867, 874, 877, 906, 912, 941, 947, 959, 964, 972]

因此,對于這些值中的約 8%,dicrete_gauss(n).sum()不完全等于1.0。然而,由于沒有出現錯誤,np.allclose(dicrete_gauss(n).sum(), 1.0)總是True.


筆記

scipy.speical.comb(n, k, exact=True)給出第(n, k)th 二項式系數作為標準 Python int,它相當于帕斯卡三角形k的n第 th 層中的th 值。


查看完整回答
反對 回復 2021-09-02
  • 1 回答
  • 0 關注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號