使用scipy求解beta分布的参数,给定均值和方差

时间:2018-09-06 14:58:55

标签: sympy

我有根据数据计算出的“ mu”和“方差”,我正在尝试查找Beta分布的参数

import sympy as sy
mu = sp.mean(univariate_samples[3])
var = sp.var(univariate_samples[3])
alpha = sy.symbols('alpha')
beta = sy.symbols('beta')
mu = alpha/(alpha+beta)
var = (alpha*beta)/(((alpha+beta)**2)*(alpha+beta+1))
sy.solve([mu*(alpha+beta)-alpha,var*((alpha+beta)**2)*(alpha+beta+1)- 
(alpha*beta)],[alpha,beta],[1, 1])

我收到以下错误 TypeError:只能将列表(而不是“ Symbol”)串联到列表中

1 个答案:

答案 0 :(得分:1)

这不是 Sym Py的目的:它用于符号操作,而不是用于解决某些具有从数据中获取的浮点参数的方程组。因为[1, 1]不属于SymPy的求解,所以会出现错误,符号解决方案没有“起点”。但是在此之前,代码muvar被两次分配(第二次分配清除了前一个,这是Python分配,而不是方程式)时存在严重缺陷。

最重要的是,当您需要问题的数字解决方案时,请使用SciPy的求解器。

from scipy import optimize
mu = 0.6
var = 0.2
def f(x, mu, var):
  alpha, beta = x[0], x[1]
  return [alpha/(alpha+beta) - mu, (alpha*beta)/(((alpha+beta)**2)*(alpha+beta+1)) - var]
rv = optimize.root(f, [1, 1], args=(mu, var)).x

找到解决方法[0.12, 0.08]


顺便说一句,首先不要做任何事情:为了使分布适合数据,应该使用scipy.stats中的fit个方法,该方法考虑了整个数据集。通过将均值和方差等于样本均值和方差来找到形状参数是一个坏主意。