Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正态分布的Scipy-MLE拟合_Python_Scipy_Curve Fitting_Gaussian - Fatal编程技术网

Python 正态分布的Scipy-MLE拟合

Python 正态分布的Scipy-MLE拟合,python,scipy,curve-fitting,gaussian,Python,Scipy,Curve Fitting,Gaussian,我试图采用年提出的解决方案来确定简单正态分布的参数。即使修改很小(基于维基百科),结果也很差。有没有建议哪里出了问题 import math import numpy as np from scipy.optimize import minimize import matplotlib.pyplot as plt def gaussian(x, mu, sig): return 1./(math.sqrt(2.*math.pi)*sig)*np.exp(-np.power((x - m

我试图采用年提出的解决方案来确定简单正态分布的参数。即使修改很小(基于维基百科),结果也很差。有没有建议哪里出了问题

import math
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

def gaussian(x, mu, sig):
    return 1./(math.sqrt(2.*math.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)

def lik(parameters):

    mu    = parameters[0]
    sigma = parameters[1]    
    n     = len(x)  
    L     = n/2.0 * np.log(2 * np.pi) + n/2.0 * math.log(sigma **2 ) + 1/(2*sigma**2) * sum([(x_ - mu)**2 for x_ in x ])

    return L



mu0    = 10
sigma0 = 2

x = np.arange(1,20, 0.1)
y = gaussian(x, mu0, sigma0)


lik_model = minimize(lik, np.array([5,5]), method='L-BFGS-B')


mu    = lik_model['x'][0]
sigma = lik_model['x'][1]

print lik_model

plt.plot(x, gaussian(x, mu, sigma), label = 'fit')
plt.plot(x, y, label = 'data')
plt.legend()
fit的输出:

jac:阵列([2.27373675e-05,2.27373675e-05])


信息:“收敛:REL_REDUCTION_OF_F_最大似然法用于将分布参数拟合到据称是该分布随机样本的一组值。在
lik
函数中,使用
x
保存样本,但
x
是一个全局变量,您已将其设置为
x=np.arange(1,20,0.1)
。这绝对不是来自正态分布的随机样本

因为您使用的是正态分布,所以您可以使用已知的最大似然估计公式来检查您的计算:mu是样本平均值,sigma是样本标准偏差:

In [17]: x.mean()
Out[17]: 10.450000000000006

In [18]: x.std()
Out[18]: 5.484751589634671
这些值与调用
minimize
的结果非常接近,因此看起来代码正常工作

要修改代码以按预期方式使用MLE,
x
应该是一组值,据称这些值是来自正态分布的随机样本。请注意,您的数组
y
不是这样的示例。它是网格上概率密度函数(PDF)的值。如果将分布拟合到PDF样本是您的实际目标,则可以使用曲线拟合函数,如。 如果将正态分布参数拟合到随机样本实际上是您想要做的,那么为了测试代码,您应该使用一个输入,该输入是来自具有已知参数的分布的一个相当大的样本。在这种情况下,您可以这样做

x = np.random.normal(loc=mu0, scale=sigma0, size=20)
当我在你的代码中使用这样的
x
时,我得到

In [20]: lik_model.x
Out[20]: array([ 9.5760996 ,  2.01946582])
正如预期的那样,溶液中的值约为10和2

(如果您像我一样对样本使用
x
,您必须更改
(相应地绘制代码。)

最大似然法用于将分布的参数拟合到一组值,这些值据称是来自该分布的随机样本。在
lik
函数中,使用
x
保存样本,但
x
是一个全局变量,您已将其设置为
x=np.arange(1,20,0.1)
。这绝对不是来自正态分布的随机样本

因为您使用的是正态分布,所以您可以使用已知的最大似然估计公式来检查您的计算:mu是样本平均值,sigma是样本标准偏差:

In [17]: x.mean()
Out[17]: 10.450000000000006

In [18]: x.std()
Out[18]: 5.484751589634671
这些值与调用
minimize
的结果非常接近,因此看起来代码正常工作

要修改代码以按预期方式使用MLE,
x
应该是一组值,据称这些值是来自正态分布的随机样本。请注意,您的数组
y
不是这样的示例。它是网格上概率密度函数(PDF)的值。如果将分布拟合到PDF样本是您的实际目标,则可以使用曲线拟合函数,如。 如果将正态分布参数拟合到随机样本实际上是您想要做的,那么为了测试代码,您应该使用一个输入,该输入是来自具有已知参数的分布的一个相当大的样本。在这种情况下,您可以这样做

x = np.random.normal(loc=mu0, scale=sigma0, size=20)
当我在你的代码中使用这样的
x
时,我得到

In [20]: lik_model.x
Out[20]: array([ 9.5760996 ,  2.01946582])
正如预期的那样,溶液中的值约为10和2

(如果您像我一样对样本使用
x
,您必须更改
相应地绘制代码。)

我想说,您的初始sigma距离最佳值太远,然后优化器没有找到它。您应该从较小的值开始,尝试使用
1
或更低的值。在拟合参数时,这是一个非常常见的错误。我要说的是,您的初始西格玛离最佳值太远,然后优化器没有找到它。您应该从较小的值开始,尝试使用
1
或更低的值。拟合参数时,这是一个非常常见的错误。我可以将x(数据)作为参数写入计算似然度的函数吗?我可以将x(数据)作为参数写入计算似然度的函数吗?