---
title: 【统计】python再认识最大似然估计
subtitle: 仰望星空,脚踏实地
date: 2020-05-3
author: 译者
header-img: https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3450&q=80
catalog: true
mathjax: true
tags:
- 统计
- python
Catogories: 数学
summary: 当你学习统计学或机器学习时,你会遇到 “似然函数 "的概念。 首先,有人说我看不懂,理解成是 "似是而非 "的 "可能”就足够了。
我想,如果你理解了概率和概率密度函数,就可以用数学的方式来处理这个概率,但我想尝试用图解的方式来做一个稍微直观的理解。
---
原文来源:https://qiita.com/kenmatsu4/items/b28d1b3b3d291d0cc698
当你学习统计学或机器学习时,你会遇到 “似然函数 "的概念。 首先,有人说我看不懂,理解成是 "似是而非 "的 "可能”就足够了。 我想,如果你理解了概率和概率密度函数,就可以用数学的方式来处理这个概率,但我想尝试用图解的方式来做一个稍微直观的理解。
你也可以在jupyter上找到完整的代码。
#以正态分布为例
正态分布的概率密度函数为
$$
{f(x)={1 \over \sqrt{2\pi\sigma^{2}}} \exp \left(-{1 \over 2}{(x-\mu)^2 \over \sigma^2} \right)
}
$$
在该图中,均值μ和标准差σ两个参数的值都是固定的(在上图中,均值μ=10,标准差σ=3),图中横轴上有$x$作为变量,图中的变量为:$x$是横轴上的变量。 作为输出的纵轴是概率密度$f(x)$。
似然函数的基本概念是:"在对数据进行抽样观察后,数据的原始参数来自于概率分布? " 因此,我认为可以考虑成一个反向的贝叶斯定理。 (事实上,可能性是贝叶斯定理的一个组成部分)。
(这里,"数据 "一词称为 "样本")。
现在考虑一个情况,我们有10个样本$x=(x_1,x_2,⋯,x_{10})$,我们知道它们遵循正态分布,但我们不确定两个参数,即均值μ和标准差σ的值是多少。
我们先来考虑 "同时分布10个样本中的这个值"。 我们还假设这10个样本都是IID(Independent Identical Distributions:从同一分布中独立抽取的样本)。 因为它是独立的,所以可以表示为各概率密度的乘积,并且 $$ {P(x_1, x_2,\cdots,x_{10}) = P(x_1)P(x_2)\cdots P(x_{10}) } $$ 这里,所有的$P(x_i)$被假定为正态分布,所以 $$ {P(x_1, x_2,\cdots,x_{10}) = f(x_1)f(x_2)\cdots f(x_{10}) } $$ 进一步展开, $$ {P(x_1, x_2,\cdots,x_{10}) = \prod_{i=1}^{10} {1 \over \sqrt{2\pi\sigma^{2}}} \exp \left(-{1 \over 2}{(x_i-\mu)^2 \over \sigma^2} \right) } $$ 我们现在有一个10个样本的概率密度函数。 但是等一下。 现在我们把样本作为一个确定的值,不再是一个不确定的概率值。 相反,不了解的是两个参数,即均值$μ$和标准差$σ$。 因此,我们可以把$x_i$视为常数,μ和σ是变量。即从样本值计算模型参数。
函数的形式完全相同, 将变量重新定义为μ和σ,其似然函数(likelihood funcion)定义为 $$ {L(\mu, \sigma) = \prod_{i=1}^{10} {1 \over \sqrt{2\pi\sigma^{2}}} \exp \left(-{1 \over 2}{(x_i-\mu)^2 \over \sigma^2} \right) } $$
由于μ和σ是未知的,如果我们假设μ=0和σ=1,并画出一个图形,则
这将是一个看上去好像模型偏离很多。 这个时候,似然函数也很小。
由于概率(密度)是通过概率(密度)乘以样本数来计算的,所以0和1之间的数字必须乘以许多倍,结果是一个相当小的数字,几乎为零)。 经常用对数似然,因为乘法换成加法很容易,这种情况下,看上图题目中的数字就很容易理解了。
由于样本几乎完全位于零,所以$L(μ,σ)$也是一个相当小的概率(对数概率:约为-568)。
这一次,让我们试着让$μ=5$和$σ=4$。
虚线是每个样本对应的概率。 感觉比之前准确一些。 这一次,对数的可能性约为-20,这个数字要大得多。
我们来看看当$μ$变化时,似然函数是如何变化的,因为可以看到$μ=10$时,对数概率达到了最大值
当σ变化时,我们可以看出,当$σ=2.7$时,对数似然达到最大值。 原先生成的数据是$σ=3$,所以有一点误差,但数值相差无几,但也很接近。
num_frame = 30
min_x = -11
max_x = 21
x = np.linspace(min_x, max_x, 201)
def norm_dens(val, m, s):
return (1/np.sqrt(2*np.pi*s**2))*np.exp(-0.5*(val-m)**2/s**2)
def animate(nframe):
global num_frame
plt.clf()
m = 10
s = nframe/float(num_frame) * 5
y = norm_dens(x, m, s)
L = np.prod([norm_dens(x_i, m, s) for x_i in data])
l = np.log(L)
plt.xlim(min_x, 16)
plt.ylim(-0.01,.6)
# 正态函数
plt.plot(x,y)
# 样本点
plt.scatter(data, np.zeros_like(data), c="r", s=50)
for d in data:
plt.plot([d, d], [0, norm_dens(d, m, s)], "k--", lw=1)
plt.title("sd:{0:.3f}, Likelihood:{1:.5f}, log Likelihood:{2:.5f}".format(s, L, l))
#plt.show()
fig = plt.figure(figsize=(10,7))
anim = ani.FuncAnimation(fig, animate, frames=int(num_frame), blit=True)
anim.save('likelihood_s.gif', writer='imagemagick', fps=1, dpi=64)
图中显示的是μ变化时对数似然的变化。 对似然函数的μ求导为0时,μ的值将是10。 这就是最大似然估计。 (我们暂时假设$\sigma$是固定的)。
这也是$\sigma$的变化概率图,可以看出,最大的概率是$\sigma=3$左右
最后,如果我们同时考察μ和σ,可以看出在μ大于10,σ稍小3的点上,似然值估计最大。
# 等高線
plt.figure(figsize=(8,5))
mu = np.linspace(5, 15, 200)
s = np.linspace(0, 5, 200)
MU, S = np.meshgrid(mu, s)
Z = np.array([(np.prod([norm_dens(x_i, a, b) for x_i in data])) for a, b in zip(MU.flatten(), S.flatten())])
plt.contour(MU, S, Z.reshape(MU.shape), cmap=cm.Blues)
plt.xlabel("mu")
plt.ylabel("s")