Gamma 分布的拟合参数 b 来自均值,95% in Python

Fitting parameter b of the Gamma distribution from mean, 95% in Python

这个 Mathematica 函数找到 Gamma 分布的参数 b, 给定平均值和 95% 的值并按平均值 [Mu] 缩放; 两个值括号 [Beta] 使其速度很快,并且最大 pg95= 5.8[Mu]* gb[[Mu], p95] 有限制。 我需要将这段代码翻译成 Python:

gb[\[Mu]_, p95_] := Block[{p = Min[p95/\[Mu], 5.8]},
\[Mu] FindRoot[CDF[GammaDistribution[1/\[Beta], \[Beta]], p] - .95 == 0,
  {\[Beta], 1, If[p == 1, 1.1, p]}][[1, 2]]];

即使您找不到完全等效的伽马函数,您也应该能够将 gb 转换为 SciPy 的积分和求根函数。可以获得所需的功能,例如(用一些演示值进行说明)

例如

如您所见,由更基本的函数构造的代码产生相同的答案,尽管速度更慢。

代码

gamma[z_] := \!\(
\*SubsuperscriptBox[\(\[Integral]\), \(0\), \(\[Infinity]\)]\(
\*SuperscriptBox[\(t\), \(z - 1\)] 
\*SuperscriptBox[\(E\), \(-t\)] \[DifferentialD]t\)\)
gamma[a_, z0_, z1_] := \!\(
\*SubsuperscriptBox[\(\[Integral]\), \(z0\), \(z1\)]\(
\*SuperscriptBox[\(t\), \(a - 1\)] 
\*SuperscriptBox[\(E\), \(-t\)] \[DifferentialD]t\)\)
gammaregularized[a_, z1_] := gamma[a, 0, z1]/gamma[a]
cdf[\[Beta]_, p_] := 
 Piecewise[{{gammaregularized[1/\[Beta], p/\[Beta]], p > 0}}]
p = 1.2;
FindRoot[cdf[\[Beta], p] - .95, {\[Beta], 1, If[p == 1, 1.1, p]}]
FindRoot[CDF[GammaDistribution[1/\[Beta], \[Beta]], 
   p] - .95, {\[Beta], 1, If[p == 1, 1.1, p]}]