Python 将正态分布拟合到一维数据

Python 将正态分布拟合到一维数据,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我有一个一维数组。我可以计算这个样本的“平均值”和“标准偏差”,并绘制“正态分布”,但我有一个问题: 我想将数据和正态分布绘制在同一个图中 我不知道如何绘制数据和正态分布 你知道“scipy.stats中的高斯概率密度函数”吗 要查看正态分布和实际数据,应将数据绘制为直方图,然后在此基础上绘制概率密度函数。请参见上的示例 您可以使用matplotlib绘制直方图和PDF(如@MrE答案中的链接所示)。为了拟合和计算PDF,可以使用scipy.stats.norm,如下所示 import nump

我有一个一维数组。我可以计算这个样本的“平均值”和“标准偏差”,并绘制“正态分布”,但我有一个问题:

我想将数据和正态分布绘制在同一个图中

我不知道如何绘制数据和正态分布

你知道“scipy.stats中的高斯概率密度函数”吗


要查看正态分布和实际数据,应将数据绘制为直方图,然后在此基础上绘制概率密度函数。请参见上的示例
您可以使用
matplotlib
绘制直方图和PDF(如@MrE答案中的链接所示)。为了拟合和计算PDF,可以使用
scipy.stats.norm
,如下所示

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


# Generate some data for this demonstration.
data = norm.rvs(10.0, 2.5, size=500)

# Fit a normal distribution to the data:
mu, std = norm.fit(data)

# Plot the histogram.
plt.hist(data, bins=25, density=True, alpha=0.6, color='g')

# Plot the PDF.
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
plt.plot(x, p, 'k', linewidth=2)
title = "Fit results: mu = %.2f,  std = %.2f" % (mu, std)
plt.title(title)

plt.show()
以下是脚本生成的绘图:


使用seaborn有一种更简单的方法:

import seaborn as sns
from scipy.stats import norm

data = norm.rvs(5,0.4,size=1000) # you can use a pandas series or a list if you want

sns.distplot(data)
plt.show()


有关详细信息:

此处您未拟合正态分布。将
sns.distplot(data)
替换为
sns.distplot(data,fit=norm,kde=False)
应该可以做到这一点。

到目前为止您尝试了什么?请发布您目前拥有的代码,以便我们能够回答有关它的特定问题。没有scipy模块是否可以执行此操作?@maro Yes。拟合正态分布非常简单。您可以将
mu,std=norm.fit(数据)
替换为
mu=np.mean(数据);std=np.std(数据)
。如果要在图中绘制该曲线,您必须实现自己版本的正态分布PDF。是否有理由使用
x=np.linspace(xmin,xmax,100)
而不是
x=np.sort(data)
?后者似乎更合理秀, 原始数据可能在某些区域稀疏,而在另一些区域密集,这使得PDF的绘图参差不齐。通过使用linspace,您可以在规则间隔的网格上对PDF进行采样,并使采样尽可能密集,从而生成PDF的平滑绘图。这不是正态分布。这就是KDE(核密度估计)方法
import seaborn as sns
from scipy.stats import norm

data = norm.rvs(5,0.4,size=1000) # you can use a pandas series or a list if you want

sns.distplot(data)
plt.show()