MATLAB中能否用mle函数最大化向量对数似然及相关实现疑问
正态分布极大似然估计(MLE)的MATLAB实现疑问解答
我在工作中处理一个长度为L的向量,假设其服从正态分布,希望通过极大似然估计(MLE)最大化该向量的对数似然。目前我采用的实现代码如下:
x=[vector(1:L)]; pd = fitdist(x,'Normal'); z=log(normpdf(x,pd(1),pd(2)); %for finding log-likelihood但我不确定上述代码是否实现了对数似然最大化,同时得到的标量z能否用于绘制目标信号。此外,我想确认是否可以使用MATLAB内置的'mle'函数完成该任务,以及是否存在其他实现方法。
一、你的代码有没有实现对数似然最大化?
fitdist(x,'Normal')其实已经帮你完成了正态分布参数的极大似然估计——它内部会自动找到让对数似然最大的均值和标准差。- 但你的代码只是计算了基于这些MLE参数的对数似然值,并没有显式执行“最大化”动作(最大化过程已经被
fitdist封装完成)。另外代码存在语法错误:log(normpdf(...))末尾少了一个右括号,正确写法是z = log(normpdf(x, pd(1), pd(2))); - 注意:这里计算出的
z不是标量,是和x长度一致的向量,每个元素对应一个样本点的对数似然;如果要得到整个样本集的总对数似然,需要对z求和:total_log_likelihood = sum(z);
二、z能不能用来绘制目标信号?
- 如果
z是每个样本的对数似然,它可以用来可视化每个点在MLE参数下的似然度,但它不是“目标信号”本身。如果要绘制拟合的正态分布曲线,需要用MLE得到的参数生成概率密度函数曲线:x_grid = linspace(min(x), max(x), 1000); pdf_fit = normpdf(x_grid, pd(1), pd(2)); plot(x_grid, pdf_fit, 'r-', 'LineWidth', 2); hold on; histogram(x, 'Normalization', 'pdf'); % 和原始数据的归一化直方图对比 hold off;
三、用MATLAB内置mle函数实现
当然可以用mle函数直接完成参数估计,它是更底层的MLE实现工具,用法如下:
[mu_hat, sigma_hat] = mle(x, 'Distribution', 'Normal'); % 计算总对数似然 total_log_likelihood = sum(log(normpdf(x, mu_hat, sigma_hat)));
mle直接返回MLE估计的均值mu_hat和标准差sigma_hat,效果和fitdist完全一致,区别仅在于fitdist返回的是概率分布对象,mle直接返回参数值。
四、手动实现MLE(适合理解原理)
如果想自己推导并实现最大化过程,可以利用正态分布MLE的解析解:
正态分布的对数似然函数为:
$$\mathcal{L}(\mu, \sigma) = -\frac{n}{2}\ln(2\pi) - n\ln(\sigma) - \frac{1}{2\sigma2}\sum_{i=1}n (x_i - \mu)^2$$
对$\mu$和$\sigma$求导并令导数为0,可得到:
- 均值的MLE估计就是样本均值:$\hat{\mu} = \frac{1}{n}\sum_{i=1}^n x_i$
- 标准差的MLE估计是样本二阶中心矩的平方根:$\hat{\sigma} = \sqrt{\frac{1}{n}\sum_{i=1}^n (x_i - \hat{\mu})^2}$(注意MATLAB自带的
std默认除以n-1,手动实现时要除以n)
手动实现代码:
n = length(x); mu_hat = mean(x); sigma_hat = sqrt(sum((x - mu_hat).^2)/n); % 计算总对数似然 total_log_likelihood = -(n/2)*log(2*pi) - n*log(sigma_hat) - sum((x - mu_hat).^2)/(2*sigma_hat^2);
- 这种方法和内置函数结果完全一致,适合深入理解MLE的数学原理。
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

