Python np.lognormal 给出大平均值和 Stdev 的无限结果
Python np.lognormal gives infinite results for big average and St Dev
我正在尝试为我的数据绘制对数正态分布。使用以下代码:
mu, sigma = 136519., 50405. # mean and standard deviation
hs = np.random.lognormal(mu, sigma, 1000) #mean, s dev , Size
count, bins, ignored = plt.hist(hs, 100, normed=True)
x = np.linspace(min(bins), max(bins), 10000)
pdf = (math.exp(-(np.log(x) - mu)**2 / (2 * sigma**2)))
#plt.axis('tight')
plt.plot(x, pdf, linewidth=2, color='r')
如您所见,我的均值和西格玛值很大,它会产生 hs 趋于无穷大的问题,从而产生错误。如果我输入 mu =3 和 sigma =1 之类的东西,它会起作用,对大数字有什么建议吗?
更新 1:
我用第一个答案更正了我的代码,但现在我只得到一条直线:
mu, sigma = 136519 , 50405 # mean and standard deviation
normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2
hs = np.random.lognormal(normal_mean, normal_std, 1000)
print(hs.max()) # some finite number
print(hs.mean()) # about 136519
print(hs.std()) # about 50405
# hs = np.random.lognormal(mu, sigma, 1000) #mean, s dev , Size
#
count, bins, ignored = plt.hist(hs, 100, normed=True)
x = np.linspace(min(bins), max(bins), 10000)
pdfT = [];
for el in range (len(x)):
pdfTmp = (math.exp(-(np.log(x[el]) - mu)**2 / (2 * sigma**2)))
pdfT += [pdfTmp]
#plt.axis('tight')
pdf = np.asarray(pdfT)
plt.plot(x, pdf, linewidth=2, color='r')
np.random.lognormal中的参数mu和sigma不是对数正态分布的均值和STD。它们是 基础正态分布 的均值和 STD,即 log(X)
。这意味着通过传递 136519
作为均值,您要求 NumPy 生成大小为 exp(136519)
的数字,这大约是 10**60000
,远远超出了双精度限制。
使用 ,您可以从现有参数中获取 np.random.lognormal
的正确参数。
mu, sigma = 136519., 50405.
normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2
hs = np.random.lognormal(normal_mean, normal_std, 1000)
print(hs.max()) # some finite number
print(hs.mean()) # about 136519
print(hs.std()) # about 50405
我正在尝试为我的数据绘制对数正态分布。使用以下代码:
mu, sigma = 136519., 50405. # mean and standard deviation
hs = np.random.lognormal(mu, sigma, 1000) #mean, s dev , Size
count, bins, ignored = plt.hist(hs, 100, normed=True)
x = np.linspace(min(bins), max(bins), 10000)
pdf = (math.exp(-(np.log(x) - mu)**2 / (2 * sigma**2)))
#plt.axis('tight')
plt.plot(x, pdf, linewidth=2, color='r')
如您所见,我的均值和西格玛值很大,它会产生 hs 趋于无穷大的问题,从而产生错误。如果我输入 mu =3 和 sigma =1 之类的东西,它会起作用,对大数字有什么建议吗?
更新 1:
我用第一个答案更正了我的代码,但现在我只得到一条直线:
mu, sigma = 136519 , 50405 # mean and standard deviation
normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2
hs = np.random.lognormal(normal_mean, normal_std, 1000)
print(hs.max()) # some finite number
print(hs.mean()) # about 136519
print(hs.std()) # about 50405
# hs = np.random.lognormal(mu, sigma, 1000) #mean, s dev , Size
#
count, bins, ignored = plt.hist(hs, 100, normed=True)
x = np.linspace(min(bins), max(bins), 10000)
pdfT = [];
for el in range (len(x)):
pdfTmp = (math.exp(-(np.log(x[el]) - mu)**2 / (2 * sigma**2)))
pdfT += [pdfTmp]
#plt.axis('tight')
pdf = np.asarray(pdfT)
plt.plot(x, pdf, linewidth=2, color='r')
np.random.lognormal中的参数mu和sigma不是对数正态分布的均值和STD。它们是 基础正态分布 的均值和 STD,即 log(X)
。这意味着通过传递 136519
作为均值,您要求 NumPy 生成大小为 exp(136519)
的数字,这大约是 10**60000
,远远超出了双精度限制。
使用 np.random.lognormal
的正确参数。
mu, sigma = 136519., 50405.
normal_std = np.sqrt(np.log(1 + (sigma/mu)**2))
normal_mean = np.log(mu) - normal_std**2 / 2
hs = np.random.lognormal(normal_mean, normal_std, 1000)
print(hs.max()) # some finite number
print(hs.mean()) # about 136519
print(hs.std()) # about 50405