scipy.stats.norm.pdf 和手动绘制高斯之间的区别

Difference between scipy.stats.norm.pdf and plotting gaussian manually

我正在使用 scipy.stats 绘制一个简单的正态分布,但出于某种原因,当我尝试将其与常规高斯公式进行比较时,该图看起来非常不同:

import numpy as np
import scipy.stats as stats

x = np.linspace(-50,175,10000)
sig1, mu1  = 10.0, 30.0

y1 = stats.norm.pdf(x, mu1, sig1)
y11 = np.exp(-(x-mu1)**2/2*sig1)/(np.sqrt(2*np.pi*sig1))

plt.plot(x,y11)
plt.plot(x,y1)

结果是:

谁能给我解释一下为什么它们不一样?

stats.norm.pdf 需要西格玛,但在您的计算中您将其用作方差。还缺少两个括号。

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

x = np.linspace(-50, 175, 10000)
sig1, mu1 = 10.0, 30.0
var1 = sig1 ** 2

y1 = stats.norm.pdf(x, mu1, sig1)
y11 = np.exp(-((x - mu1) ** 2) / (2 * var1)) / (np.sqrt(2 * np.pi * var1))

plt.plot(x, y11)
plt.plot(x, y1)
plt.show()

产生相同的情节。

干杯!

首先,你搞错了。手动高斯指数中的分母缺少括号。

此外,scipy.norm.pdf的第三个参数是标准偏差(sigma),但它出现在高斯PDF平方(sigma^2)中。

更正后的代码为

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

x = np.linspace(-50,175,10000)
sig1, mu1  = 10.0, 30.0

y1 = stats.norm.pdf(x, mu1, sig1)
y11 = np.exp(-(x-mu1)**2/(2*sig1**2))/(np.sqrt(2*np.pi*sig1**2))


plt.plot(x,y1,label="scipy",alpha=0.85)
plt.plot(x,y11,ls="--",label="custom")
plt.legend()
plt.grid()

输出: