【问题标题】:Heavy tailed and Normal distribution in same plot同一图中的重尾分布和正态分布
【发布时间】:2019-01-07 19:30:58
【问题描述】:

我想用高斯(在同一个图中)显示重尾(Levy)分布。

我是为高斯做的:

from pylab import plot, show, grid, axis, xlabel, ylabel, title, rcParams
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
import math
mu = 0                         
variance = 1
sigma = math.sqrt(variance)     
plt_z = np.linspace(-4, 4, 100)

1./(np.sqrt(2*np.pi)*sigma)*np.exp(-0.5 * (1./sigma*(x - mu))**2)
plt.plot(plt_z, mlab.normpdf(plt_z, mu, sigma))
plt.show()

我得到

现在我想在该图中添加 Levy 分布,但不正确。我尝试使用scipy.stats.levy 并手动添加方程式:

1./(x * np.sqrt(2*np.pi*x)) * np.exp(-1/(2*x))

但没有得到正确的情节

这就是我想要的

只是同一地块中的重尾征税分布

【问题讨论】:

  • 您是否尝试将plt.show() 放在两个plt.plot() 之后?
  • 我得到了 2 个地块,但第二个地块对于某些原因来说几乎是重尾分布。看起来只有两条垂直线

标签: python matplotlib scipy statistics


【解决方案1】:

我设法使用 PyLevy 包在具有正态分布的同一图中绘制了带有 alpha 参数 1 的 Levy 稳定分布。

如果有人为此苦苦挣扎,这里是代码:

from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np
import levy


random_sample = levy.random(1.0, 0, 0, 1, shape=200)


parameters = norm.fit(random_sample)

x = np.linspace(-4,4,100)

# Generate the pdf (fitted distribution)
fitted_pdf = norm.pdf(x)

#Generate Levy fitted distribution
parameters2 = levy.fit_levy(random_sample)
levy_fitted = levy.levy(x, *parameters2[:4])

plt.figure(figsize=(12,8))
plt.plot(x,fitted_pdf,"blue",label="Gauss Fot", linewidth=2)
plt.plot(x, levy_fitted, "red", label="Levy Fit", linewidth=2)
plt.legend()

# show plots
plt.show()

【讨论】:

    【解决方案2】:

    试试:

    from pylab import plot, show, grid, axis, xlabel, ylabel, title, rcParams
    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.mlab as mlab
    import math
    mu = 0                         
    variance = 1
    sigma = math.sqrt(variance)     
    plt_z = np.linspace(-4, 4, 100)
    
    1./(np.sqrt(2*np.pi)*sigma)*np.exp(-0.5 * (1./sigma*(x - mu))**2)
    plt.plot(plt_z, mlab.normpdf(plt_z, mu, sigma)) #plotting the Gauss curve
    
    mask_positive_x = plt_z > 0
    plt_z = plt_z[mask_positive_x]
    plt.plot(plt_z, 1./(plt_z * np.sqrt(2*np.pi*plt_z)) * np.exp(-1/(2*plt_z))) #plotting the Levy curve
    plt.show()
    

    Levy 分布仅针对正 x 定义:https://en.wikipedia.org/wiki/L%C3%A9vy_distribution

    如果你绝对想要实线两侧的 Levy 曲线:

    from pylab import plot, show, grid, axis, xlabel, ylabel, title, rcParams
    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.mlab as mlab
    import math
    mu = 0                         
    variance = 1
    sigma = math.sqrt(variance)     
    plt_z = np.linspace(-4, 4, 100)
    
    1./(np.sqrt(2*np.pi)*sigma)*np.exp(-0.5 * (1./sigma*(x - mu))**2)
    plt.plot(plt_z, mlab.normpdf(plt_z, mu, sigma)) #plotting the Gauss curve
    
    plt.plot(plt_z, 1./(np.abs(plt_z) * np.sqrt(2*np.pi*np.abs(plt_z))) * np.exp(-1/(2*np.abs(plt_z)))) #plotting the Levy curve
    plt.show()
    

    【讨论】:

    • 一方面看起来不错,但有一个错误:/Users/xxx/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:13:RuntimeWarning:sqrt del 中遇到无效值sys.path[0]
    • 在注意到 x<0 的 Levy 公式定义不明确并在维基百科上检查它的支持必须是正实线后,我进行了编辑。
    • 应该是plt_z = plt_z[mask_positive_x]
    • 好吧,plt_z = np.abs( plt_z) 会产生 plt_z 的所有正值,其中每个值包含两次。所以基本上plt_z 中没有负的z 值。你可以打印出来自己看看。所以基本上在第二个答案中,你只是在正 x 轴上绘制了两次。
    • 即使现在也不正确。我建议您在发布编辑之前先查看您的结果图。原点附近有明显的不连续性。在趋向于 0 的极限 x 中,Levy 分布为零。因此,仅沿 y 轴镜像正 x 轴曲线不会导致 OP 想要的结果。你不能在plt_z=0 得到你正在做的事情的最大值。
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2014-02-03
    • 2015-10-16
    • 2017-10-12
    相关资源
    最近更新 更多