目標:用python生成一組具有上下限的對數正態分布隨機數。
思路:利用python的scipy.stats生成截斷正態分布,再將正態分布轉化為對數正態分布。
要求:生成的目標對數正態分布隨機數要介于區間[log_lower,log_upper]內,這里設定該區間為[5, 10],并繪制正態分布與對數正態分布隨機數的直方圖。
源代碼:
import numpy as np
from pylab import *
from scipy import stats
import matplotlib
import matplotlib.pyplot as plt
# 設置matplotlib正常顯示中文和負號
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑體顯示中文
matplotlib.rcParams['axes.unicode_minus'] = False # 正常顯示負號
# region 【功能函數】生成截斷對數正態分布,要求對數正態在[log_lower,log_upper]
def get_trunc_lognorm(mu, sigma, log_lower, log_upper=np.inf, data_num=10000):
norm_lower = np.log(log_lower)
norm_upper = np.log(log_upper)
X = stats.truncnorm((norm_lower - mu) / sigma, (norm_upper - mu) / sigma, loc=mu, scale=sigma)
norm_data = X.rvs(data_num)
log_data = np.exp(norm_data)
return norm_data, log_data
# endregion
mu, sigma = 0, 1
norm_data, log_data = get_trunc_lognorm(mu, sigma, 5, 10)
figure(4)
subplot(2, 1, 1)
plt.hist(norm_data, normed=1, bins=30)
plt.xticks(np.arange(mu - 5 * sigma, mu + 5 * sigma, 0.5))
plt.title("中間過程的截斷正態分布")
subplot(2, 1, 2)
plt.hist(log_data, normed=1, bins=30)
plt.xticks(np.arange(0, 50, 5))
# plt.xlim(0,50)
plt.title("所求的截斷對數正態分布")
plt.show()
執行結果:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
