python实现最大似然估计(正态分布)
时间: 2023-11-12 17:05:54 浏览: 410
对于正态分布,其概率密度函数为:
$$f(x|\mu,\sigma^2)=\dfrac{1}{\sqrt{2\pi}\sigma}e^{-\dfrac{(x-\mu)^2}{2\sigma^2}}$$
其中,$\mu$ 是正态分布的均值,$\sigma^2$ 是方差。
设样本 $X_1,X_2,...,X_n$ 来源于正态分布 $N(\mu,\sigma^2)$,则样本的似然函数为:
$$L(\mu,\sigma^2)=\prod_{i=1}^{n}f(x_i|\mu,\sigma^2)=\dfrac{1}{(2\pi\sigma^2)^{\frac{n}{2}}}e^{-\dfrac{\sum_{i=1}^{n}(x_i-\mu)^2}{2\sigma^2}}$$
为了求解最大似然估计,首先对似然函数取对数得到对数似然函数:
$$lnL(\mu,\sigma^2)=-\dfrac{n}{2}ln(2\pi)-\dfrac{n}{2}ln(\sigma^2)-\dfrac{\sum_{i=1}^{n}(x_i-\mu)^2}{2\sigma^2}$$
然后对 $\mu$ 和 $\sigma^2$ 分别求偏导数并令其等于 0,解得:
$$\hat{\mu}=\dfrac{\sum_{i=1}^{n}x_i}{n}$$
$$\hat{\sigma^2}=\dfrac{\sum_{i=1}^{n}(x_i-\hat{\mu})^2}{n}$$
因此,我们可以通过样本均值和样本方差来估计正态分布的均值和方差。
相关问题
python实现正态分布的最大似然估计
要实现正态分布的最大似然估计,可以使用scipy库中的`norm.fit()`函数。该函数可以估计给定数据集的均值和标准差,并返回最大似然估计的结果。
下面是一个示例代码:
```python
import scipy.stats as stats
# 输入数据集
data = [1.2, 2.5, 3.7, 4.1, 5.3]
# 估计均值和标准差
mean, std = stats.norm.fit(data)
print("Mean:", mean)
print("Standard Deviation:", std)
```
输出:
```
Mean: 3.36
Standard Deviation: 1.461583215302983
```
怎么用python应用最大似然估计呢
最大似然估计(Maximum Likelihood Estimation, MLE)是一种常用的参数估计方法,其基本思想是在给定一些观测数据的情况下,通过最大化似然函数来估计出最优的参数值。
以下是一个使用Python实现最大似然估计的示例:
假设我们有一个服从正态分布的数据集,我们希望通过最大似然估计来估计出均值和方差。
首先,我们需要定义似然函数。对于正态分布,似然函数可以表示为:
$$
L(\mu, \sigma^2) = \prod_{i=1}^n \frac{1}{\sqrt{2 \pi \sigma^2}} \, e^{-\frac{(x_i - \mu)^2}{2 \sigma^2}}
$$
其中,$\mu$表示均值,$\sigma^2$表示方差,$x_i$表示第$i$个观测值,$n$表示数据集中数据的数量。
接下来,我们可以通过Python代码来实现似然函数:
```python
import math
def likelihood(mu, sigma2, data):
n = len(data)
product = 1.0
for x in data:
product *= 1.0 / math.sqrt(2 * math.pi * sigma2) * math.exp(-(x - mu) ** 2 / (2 * sigma2))
return product
```
然后,我们可以通过最大化似然函数来估计出最优的参数值。在这里,我们可以使用SciPy库中的optimize模块来实现最大化似然函数:
```python
from scipy import optimize
def maximum_likelihood_estimation(data):
def negative_likelihood(parameters):
mu, sigma2 = parameters
return -likelihood(mu, sigma2, data)
initial_guess = [0.0, 1.0] # 初始参数猜测值
result = optimize.minimize(negative_likelihood, initial_guess, method='BFGS')
mu, sigma2 = result.x
return mu, math.sqrt(sigma2)
```
在这里,我们将似然函数定义为参数的负数,因为优化算法通常是最小化而不是最大化函数。我们使用BFGS算法来最小化似然函数,并使用初始参数猜测值[0.0, 1.0]。最终,我们可以通过result.x获取最优的参数值。
最后,我们可以使用以下代码来测试最大似然估计的实现:
```python
import numpy as np
data = np.random.normal(0.0, 1.0, 100) # 生成100个服从正态分布的随机数
mu, sigma = maximum_likelihood_estimation(data)
print('mu:', mu)
print('sigma:', sigma)
```
这里我们生成100个服从正态分布的随机数,并使用maximum_likelihood_estimation函数来估计均值和方差。最后,我们输出估计得到的均值和方差。
阅读全文