我想繪制泊松分布并獲得 lambda >= 9 的負概率。
此代碼為不同的 lambda 生成圖:
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import factorial
for lambda_val in range(1, 12, 2):
plt.figure()
k = np.arange(0,20)
y = np.power(lambda_val, k)*np.exp(-lambda_val)/factorial(k)
plt.bar(k, y)
plt.title('lambda = ' str(lambda_val))
plt.xlabel('k')
plt.ylabel('probability')
plt.ylim([-0.1, 0.4])
plt.grid()
plt.show()
請看這兩個圖:
在我看來,Lambda = 5 看起來不錯。

Lambda = 9 不是。

我很確定它與 np.power 有關,因為
np.power(11, 9)
給我:-1937019605,而
11**9
給我: 2357947691 (在WolframAlpha 中相同)。
但是如果我避免使用 np.power 并使用
y = (lambda_val**k)*math.exp(-lambda_val)/factorial(k)
為了計算概率,我也得到負值。我完全糊涂了。任何人都可以向我解釋效果或我做錯了什么?提前致謝。:)
uj5u.com熱心網友回復:
您的問題是由于32-bit integer overflows 造成的。發生這種情況是因為 Numpy 有時使用 32 位整數編譯,即使平臺(作業系統 處理器)是 64 位整數。存在溢位是因為 Numpy 會自動將 Python 解釋器的無界整數轉換為本機np.int_型別。您可以使用np.int_ is np.int64. AFAIK,Python Pip 上為 Windows 編譯的默認 Numpy 二進制包使用 32 位整數,其中一個 Linux 包使用 64 位整數(假設您在 64 位平臺上)。
可以使用以下方法輕松重現該問題:
In [546]: np.power(np.int32(11), np.int32(9))
Out[546]: -1937019605
也可以使用以下方法解決:
In [547]: np.power(np.int64(11), np.int64(9))
Out[547]: 2357947691
在第二個運算式中,您默認使用kwhich 型別np.int_,這當然是您遇到相同問題的原因。希望您可以向 Numpy 指定整數應該更大。請注意,Numpy 有一些隱式規則來避免溢位,但這很難在所有情況下都避免它們而不會對性能產生強烈影響。這是一個固定的公式:
k = np.arange(0, 20, dtype=np.int64)
y = np.power(lambda_val, k) * np.exp(-lambda_val) / factorial(k)
經驗法則是當您得到意外結果時要非常小心隱式轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391883.html
上一篇:在熊貓資料框中使用np.isclose報告最接近的值
下一篇:從陣列中提取索引值
