python - 估计的高斯分布参数错误
问题描述
我正在试验高斯分布及其可能性。为了计算出最大似然,我区分了mu(期望)和 sigma(均值)的似然,它们分别等于 data.mean() 和 data.std()
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
import math
from scipy.stats import norm
def calculate_likelihood(x, mu, sigma):
n = len(x)
likelihood = n/2.0 * np.log(2 * np.pi) + n/2.0 * math.log(sigma **2 ) + 1/(2*sigma**2) * sum([(x_i - mu)**2 for x_i in x ])
return likelihood
def estimate_gaussian_parameters_from_data(data):
return data.mean(), data.std()
def main():
mu = 0
sigma = 2
x_values = np.linspace(mu - 3*sigma, mu + 3*sigma, 1000)
y_values_1 = mlab.normpdf(x_values, mu, sigma)
estimated_mu, estimated_sigma = estimate_gaussian_parameters_from_data(y_values_1)
if (__name__ == "__main__"):
main()
我预计estimated_mu和estimated_sigma应该大约等于mu和sigma,但事实并非如此。而不是 0 和 2 我得到 0.083 和 0.069。我理解有什么不对吗?
解决方案
mlab.normpdf 是一个 pdf,它返回 x 的概率。由于平均值为 0,您将看到 0 附近的点具有很高的概率。y_values_1 是概率密度。
s = np.random.normal(0, 2, 1000)
上面的代码采样了 1000 个点,这些点正态分布,均值为 0,标准为 2
np.mean(s) == 0.018308805079364696 and np.std(s) == 1.9467605916031896
推荐阅读
- java - SmsReceiver onReceive 后短信消失
- java - JSP 文件中的 doGet 有效,但 doPost 无效
- ios - 自定义单元格宽度?
- python - Django如何将一个字段的(.count)乘以另一个字段并在模板中显示结果
- html - 在裁剪和居中的图像下方创建带有文本的缩略图库
- java - 在 SparkStreaming 中没有得到输出
- html - 创建一个 CSS 按钮以在单击时显示 x 数量的文本并更改 div 标签的大小
- python - 如何获取“HTTPS”链接以及如何在 python 中将 epub 转换为 txt?
- laravel - Laravel 在涉及三个表的数据透视表上连接数据
- sql-server - sql server 不支持一天以外的分区范围