目標(biāo):用python生成一組具有上下限的對(duì)數(shù)正態(tài)分布隨機(jī)數(shù)。
思路:利用python的scipy.stats生成截?cái)嗾龖B(tài)分布,再將正態(tài)分布轉(zhuǎn)化為對(duì)數(shù)正態(tài)分布。
要求:生成的目標(biāo)對(duì)數(shù)正態(tài)分布隨機(jī)數(shù)要介于區(qū)間[log_lower,log_upper]內(nèi),這里設(shè)定該區(qū)間為[5, 10],并繪制正態(tài)分布與對(duì)數(shù)正態(tài)分布隨機(jī)數(shù)的直方圖。
源代碼:
import numpy as np
from pylab import *
from scipy import stats
import matplotlib
import matplotlib.pyplot as plt
# 設(shè)置matplotlib正常顯示中文和負(fù)號(hào)
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑體顯示中文
matplotlib.rcParams['axes.unicode_minus'] = False # 正常顯示負(fù)號(hào)
# region 【功能函數(shù)】生成截?cái)鄬?duì)數(shù)正態(tài)分布,要求對(duì)數(shù)正態(tài)在[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("中間過程的截?cái)嗾龖B(tài)分布")
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("所求的截?cái)鄬?duì)數(shù)正態(tài)分布")
plt.show()
執(zhí)行結(jié)果:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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