当前位置:网站首页>MCS:连续随机变量——LogNormal分布

MCS:连续随机变量——LogNormal分布

2022-06-23 03:56:00 今晚打佬虎

Lognormal

对数正态分布与正态分布变量的关系如下: x x x:对数正态变量, y y y正态变量。

y = l n ( x ) y = ln(x) y=ln(x)

x = e y x = e^y x=ey

变量 y y y是正态变量,其均值和方差记为: μ y , σ y 2 \mu_y,\sigma_y^2 μyσy2,对数正态变量 x x x的均值和方差记为: μ x , σ x 2 \mu_x,\sigma_x^2 μxσx2,符号表示为:

x ∼ L N ( μ y , σ y 2 ) x \sim LN(\mu_y, \sigma_y^2) xLN(μy,σy2)
y ∼ N ( μ y , σ y 2 ) y \sim N(\mu_y, \sigma_y^2) yN(μy,σy2)

注意:变量 x x x的参数是变量 y y y的均值和方差,变量 x , y x, y x,y参数之间的关系如下:

μ x = e x p [ μ y + σ y 2 / 2 ] \mu_x = exp \Big[\mu_y + \sigma_y^2/2 \Big] μx=exp[μy+σy2/2]

σ x 2 = e x p [ 2 μ y + σ y 2 ] [ e x p ( σ y 2 ) − 1 ] \sigma_x^2 = exp \Big[2\mu_y + \sigma_y^2 \Big] \Big[exp(\sigma_y^2) - 1 \Big] σx2=exp[2μy+σy2][exp(σy2)1]

μ y = l n [ μ x 2 / μ x 2 + σ x 2 ] \mu_y = ln \Big[\mu_x^2 / \sqrt{\mu_x^2 + \sigma_x^2} \Big] μy=ln[μx2/μx2+σx2]

σ y 2 = l n [ 1 + σ x 2 / μ x 2 ] \sigma_y^2 = ln \Big[1 + \sigma_x^2 / \mu_x^2 \Big] σy2=ln[1+σx2/μx2]

生成参数为 μ y , σ y 2 \mu_y,\sigma_y^2 μyσy2的随机的对数正态变量 x x x:

  1. Generate a random standard normal variate, z z z
  2. A random normal variate becomes : y = μ y + z × σ y y = \mu_y + z \times \sigma_y y=μy+z×σy
  3. The random lognormal variate is x = e y x = e^y x=ey
  4. Return x.

例:设 x x x是一个对数正态变量,其均值和方差为: μ x = 10 , σ x 2 = 400 \mu_x = 10,\sigma_x^2 = 400 μx=10σx2=400,满足这个条件的随机对数正态变量计算过程如下:

  1. 计算出正态变量 y y y的均值和方差:
    μ y = l n [ μ x 2 / μ x 2 + σ x 2 ] = 1.498 \mu_y = ln \Big[\mu_x^2 / \sqrt{\mu_x^2 + \sigma_x^2} \Big] = 1.498 μy=ln[μx2/μx2+σx2]=1.498

σ y 2 = l n [ 1 + σ x 2 / μ x 2 ] = 1.609 \sigma_y^2 = ln \Big[1 + \sigma_x^2 / \mu_x^2 \Big] = 1.609 σy2=ln[1+σx2/μx2]=1.609

σ y = 1.269 \sigma_y = 1.269 σy=1.269

  1. 生成一个标准的随机正态变量N(0, 1), z = 1.37 z = 1.37 z=1.37
  2. 根据标准正态变量计算得到随机正态变量: y = μ y + z × σ y = 1.498 + 1.37 × 1.269 = 3.236 y = \mu_y + z \times \sigma_y = 1.498 + 1.37 \times 1.269 = 3.236 y=μy+z×σy=1.498+1.37×1.269=3.236
  3. 随机对数正态变量: x = e y = e 3.236 = 25.44 x = e^y = e^{3.236} = 25.44 x=ey=e3.236=25.44
  4. x = 25.44 x = 25.44 x=25.44

生成对数正态分布变量

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def generate_normal_var(mean=0, std=1, method=2):
    if method == 2:
        sum_u = np.random.uniform(0, 1, (12,)).sum()
        z = -6.0 + sum_u
    else:
        u1 = np.random.uniform(0, 1)
        u2 = np.random.uniform(0, 1)
        z = np.sqrt(-2 * np.log(u1)) * np.cos(2 * np.pi * u2)
    if mean == 0 and std == 1:
        return z
    else:
        return mean + z * std


def generate_lognormal_var(mean=0, variance=1, n=10000):
    mu_y = np.log(mean*mean / np.sqrt(mean * mean + variance))
    sigma_y = np.log(1 + variance/(mean * mean))
    std_y = np.sqrt(sigma_y)
    x = [np.exp(generate_normal_var(mu_y, std_y)) for i in range(n)]
    return x
ln_x = generate_lognormal_var(1, 0.25)

在这里插入图片描述

原网站

版权声明
本文为[今晚打佬虎]所创,转载请带上原文链接,感谢
https://wangjh.blog.csdn.net/article/details/125302343