【问题标题】:Plotting Poisson distribution with matplotlib使用 matplotlib 绘制泊松分布
【发布时间】:2022-01-10 14:42:09
【问题描述】:

我正在尝试将泊松分布拟合到这个 plot,而我被教导这样做的方法是将泊松分布定义为函数,然后使用 linspace 绘制函数。

def poisson_m(k, l):
return ((l ** k)/math.factorial(k)) * np.exp ** (-l)`

lin = np.linspace(0, 187, 100)
ax.plot(lin, poisson_m(lin, 20), 'r--', label="Poissonverdeling")

现在 l 只是一个随机猜测,但我们被教导要最小化这个以找到最佳拟合(这是我拟合泊松分布的最终目标)。 到目前为止,这对我有用,但是对于此功能,我收到错误消息

TypeError: 只有整数标量数组可以转换为标量索引

我不确定这对我的 linspace 和函数意味着什么。我试图阅读类似的问题,但这些问题都使用了截然不同的方式来绘制泊松分布,所以我想我想知道是否有可能这样做并以某种方式消除错误,因为它会是理想的做法是按照我得到的指示进行。我知道 scipy 中有泊松分布,但我不知道如何使用它来找到最适合 l 的分布,鉴于这是目标,我没有决定使用那个。

【问题讨论】:

  • math.factorial 未矢量化,因此不适用于数组。您必须使用scipy.special.factorial(k)。同样np.exp ** (-l) 无效,它是np.exp(-1)

标签: python numpy matplotlib


【解决方案1】:

泊松分布是一个离散概率分布,这意味着当您的 lin 包含非整数时,您无法计算其值。因此,第一个解决方法是将linspace 替换为arange

第二个问题是np.exp ** (-l),将其替换为np.exp(-l)

错误消息来自math.factorial。根据documentation math.factorial 尝试将其参数转换为整数。如果它失败(它确实失败了,因为你给了它一个numpy.ndarray),它返回一个ValueError。所以以scipy.special.factorial 为例,它计算元素阶乘。

完整的代码如下:

from scipy.special import factorial
import numpy as np
import matplotlib.pyplot as plt

def poisson_m(k, l):
    return ((l ** k)/factorial(k)) * np.exp(-l)

lin = np.arange(0, 187)
plt.plot(lin, poisson_m(lin, 20), 'r--', label="Poissonverdeling")

如果我是你,我会改用 poisson 模块中的 poisson 类。

from scipy.stats import poisson

lin = np.arange(0, 187)
plt.plot(lin, poisson(20).pmf(lin))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多