Python中的麦克斯韦分布

Python中的麦克斯韦分布,python,numpy,scipy,statistics,distribution,Python,Numpy,Scipy,Statistics,Distribution,在我感兴趣的那篇文章中,它指出数据用麦克斯韦分布很好地表示,它还提供了分布的平均速度(307 km/s)和1西格玛不确定性(47 km/s) 使用提供的值,我尝试重新生成数据,然后使用pythonscipy.stats将其与Maxwellian发行版相匹配 如中所述,scipy中的麦克斯韦函数采用两个输入,1)“loc”移动x变量,2)“a”参数对应于麦克斯韦-玻尔兹曼方程中的参数“a” 在我的例子中,我没有这两个参数,因此使用中的均值和方差(sigma^2)描述,我试图计算“a”和“loc”参

在我感兴趣的那篇文章中,它指出数据用麦克斯韦分布很好地表示,它还提供了分布的平均速度(307 km/s)和1西格玛不确定性(47 km/s)

使用提供的值,我尝试重新生成数据,然后使用pythonscipy.stats将其与Maxwellian发行版相匹配

如中所述,scipy中的麦克斯韦函数采用两个输入,1)“loc”移动x变量,2)“a”参数对应于麦克斯韦-玻尔兹曼方程中的参数“a”

在我的例子中,我没有这两个参数,因此使用中的均值和方差(sigma^2)描述,我试图计算“a”和“loc”参数。平均值和西格玛参数仅依赖于“a”参数

我遇到的第一个问题是我从均值(a=192.4)和σ(a=69.8)中得到的“a”参数彼此不同。 第二个问题是,我不知道如何从均值和西格玛中获得准确的loc(移位)值

根据分布的形状(平均速度值落在图中,检查图2),我试图猜测“loc”值,并结合从sigma(a=69.8)获得的“a”值,生成并拟合数据。大概看起来是正确的,但我不知道上面提到的问题的答案,我需要一些专家的指导。谢谢你的帮助

import matplotlib.pyplot as plt
import math
from scipy.stats import norm
import random
import numpy as np
import scipy.optimize
from scipy.stats import maxwell

samplesize = 100000

mean = 307
sigma = 47
loc = 175 #my guess
a_value = np.sqrt((sigma**2 * math.pi)/(3*math.pi - 8)) #calculated based on wiki description

fig, axs = plt.subplots(1)
v_2d = maxwell.rvs(loc, a_value, size=samplesize) #array corresponding to 2D proper motion obtained from Hubbs
mean, var, skew, kurt = maxwell.stats(moments='mvsk')

N, bins, patches = plt.hist(v_2d, bins=100, density=True, alpha=0.5, histtype='bar', ec='black')
maxx = np.linspace(min(v_2d), max(v_2d), samplesize)

axs.plot(maxx, maxwell.pdf(maxx, loc, a_value), color=colorset[6], lw=2, label= r'$\mathdefault{\mu}$ = '+'{:0.1f}'.format(mean)+r' , '+r'$\mathdefault{\sigma}$ = '+'{:0.1f}'.format(sigma))

axs.set(xlabel=r'2-D Maxwellian speed (km s$^{-1}$)')
axs.set(ylabel='Frequency')
plt.legend(loc='upper right')


好吧,平均值受位置的影响,而西格玛不会。 因此,从sigma计算
a
,计算平均值,就像loc=0一样,找出差异并将其分配到位置,取样100K RVs以检查是否 采样平均值/STDEV足够接近

代码,Python 3.8,Windows 10 x64

import numpy as np

from scipy.stats import maxwell

σ = 47
μ = 307

a = σ * np.sqrt(np.pi/(3.0*np.pi - 8.0))
print(a)

m = 2.0*a*np.sqrt(2.0/np.pi)
print(m) # as if loc=0

loc = μ - m
print(loc)

print("----------Now test--------------------")

# sampling
q = maxwell.rvs(loc=loc, scale=a, size=100000)

print(np.mean(q))
print(np.std(q))
作为我的输出

306.9022249667151
47.05319429681308

足够好吗?

我认为,由于你的“loc”不是零,你需要重新评估期望值和西格玛的公式。在MB分布中,平均值为2*asqrt(2/pi)。不同的loc不一样。在这种情况下,您需要在您的域中集成xf(x),其中f(x)是带有“loc”的MB发行版。您可以提供文章的链接吗?您说“它还为分布提供了平均速度(307 km/s)和1西格玛不确定性(47 km/s)”;“1西格玛不确定性”到底指的是什么?@WarrenWeckesser他们说:该值代表最低有效位的误差(在68%置信水平下)。因此,拟合中存在1西格玛误差。如果你愿意,我仍然可以提供论文。我仍然不明白47的“不确定性”是什么。如果这是样本平均值307的不确定度,那么这与分布的标准偏差不同。你能说明实际问题吗?sigma似乎是拟合均值的置信区间,它是拟合参数的统计参数,而不是分布参数。你文章的参考文献是什么?