将正态分布转换为对数正态分布

问题描述

我一直在听麻省理工学院关于数学在金融中的应用的公开课的讲座。我正在尝试对概念进行编码以便更好地理解。

根据讲座(据我所知),如果随机变量 X 是正态分布的,那么 exp(X) 是对数正态分布的,反之亦然(如果我在这里错了,请纠正我)。

这是我尝试过的:

我有正态分布的整数列表:

import numpy as np

import matplotlib.pyplot as plt
from math import sqrt

X = np.array(l)

mu = np.mean(X)
sigma = np.std(X) 

count,bins,ignored = plt.hist(X,35,density=True)
plt.plot(bins,1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (bins - mu)**2 / (2 * sigma**2) 
),linewidth=2,color='r')
plt.show()

输出

Normally distributed curve

现在我想从上面的数据中得到对数正态分布,这是我尝试过的:

import numpy as np

import matplotlib.pyplot as plt
from math import sqrt

X = np.array(l)
ln = []
for x in X:
    val = np.e**x
    ln.append(val)

X_ln = np.array(ln)
X_ln = np.array(X_ln) / np.min(X_ln)

mu = np.mean(X_ln)
sigma = np.std(X_ln) 

count,ignored = plt.hist(X_ln,10,density=True)
x = np.linspace(min(bins),max(bins),10000)

pdf = (np.exp(-(np.log(x) - mu)**2 / (2 * sigma**2)) / (x * sigma * np.sqrt(2 * np.pi)))

plt.plot(x,pdf,color='r',linewidth=2)
plt.show()

输出

Not so clean Output

我知道有更好的方法可以做到这一点,但我不知道怎么做。任何建议将不胜感激。

这里有几个参考:

Log normal distribution in Python

MIT lecture notes(topic-1.1)

如果这是相关的,这里是我试图处理的元素列表:

List of elements

更新 1:

在向 ln 添加值之前,我已经对 X 进行了标准化。这修复了直方图的分布,但是,我似乎无法修复以显示对数正态分布的红线。此外,新的直方图分布与正态分布没有太大区别。我想不出任何合适的理由。

这是我添加代码块:

def normalize(v):
    norm=np.linalg.norm(v,ord=1)
    if norm==0:
        norm=np.finfo(v.dtype).eps
    return v/norm

X = np.array(l)
X = normalize(X)

输出

Slightly better result

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)