我有一组遵循正态分布的数据,在其中我可以拟合直方图并获得均值和西格玛。
为了举例,我将通过生成如下所示的随机正态分布来对其进行近似:
from scipy.stats import maxwell
import math
import random
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.optimize import curve_fit
from IPython import embed # put embed() where you want to stop
import matplotlib.ticker as ticker
data = random.gauss(307, 16)
N, bins, patches = plt.hist(data, bins=40, density=True, alpha=0.5, histtype='bar', ec='black')
mu, std = norm.fit(data)
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
plt.plot(x, p, 'k', linewidth=2, label= r'$\mu$ = '+'{:0.1f}'.format(mu)+r' $\pm$ '+'{:0.1f}'.format(std))
接下来我要做的是从这个“正态”分布生成一个麦克斯韦分布并能够拟合
我已经阅读了scipy.stats.maxwell网页和其他一些相关问题,但是无法从“高斯分布”生成这样的分布并将其拟合。任何帮助将不胜感激。
答案 0 :(得分:1)
好吧,知道每个麦克斯韦都是分子速度的绝对值的分布,其中每个成分都呈正态分布,因此可以像下面的代码那样进行采样
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import maxwell
def maxw(size = None):
"""Generates size samples of maxwell"""
vx = np.random.normal(size=size)
vy = np.random.normal(size=size)
vz = np.random.normal(size=size)
return np.sqrt(vx*vx + vy*vy + vz*vz)
mdata = maxw(100000)
h, bins = np.histogram(mdata, bins = 101, range=(0.0, 10.0))
x = np.linspace(0.0, 10.0, 100)
rv = maxwell()
fig, ax = plt.subplots(1, 1)
ax.hist(mdata, bins = bins, density=True)
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='Maxwell pdf')
plt.title("Maxwell")
plt.show()
这是采样与Maxwell PDF重叠的图片