使用 fminsearch 进行参数估计

Posted

技术标签:

【中文标题】使用 fminsearch 进行参数估计【英文标题】:Using fminsearch for parameter estimation 【发布时间】:2019-07-03 10:20:16 【问题描述】:

我正在尝试查找高斯分布的对数最大似然估计,以估计参数。 我知道 Matlab 有一个内置函数,它通过拟合高斯分布来做到这一点,但我需要用 logMLE 来做到这一点,以便以后将此方法扩展到其他分布。 所以这里是高斯 dist 的对数似然函数: Gaussian Log MLE

我使用此代码通过 fminsearch 估计一组变量 (r) 的参数。但我的搜索没有覆盖,我不完全明白问题出在哪里:

clear
clc
close all
%make random numbers with gaussian dist
r=[2.39587291079469
1.57478022109723
-0.442284350603745
4.39661178526569
7.94034385633171
7.52208574723178
5.80673144943155
-3.11338531920164
6.64267230284774
-2.02996003947964];
% mu=2 sigma=3

%introduce f
f=@(x,r)-(sum((-0.5.*log(2*3.14.*(x(2))))-(((r-(x(2))).^2)./(2.*(x(1))))))
fun = @(x)f(x,r);

% starting point
x0 = [0,0];
 [y,fval,exitflag,output] = fminsearch(fun,x0)


f = 
    @(x,r)-(sum((-0.5.*log(2*3.14.*(x(2))))-(((r-(x(2))).^2)./(2.*(x(1))))))


Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option.
         Current function value: 477814.233176 
y = 1×2    
1.0e+-3 *

    0.2501   -0.0000

fval = 4.7781e+05 + 1.5708e+01i
exitflag = 0
output = 
    iterations: 183
     funcCount: 400
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Exiting: Maximum number of function evaluations has been exceeded↵         - increase MaxFunEvals option.↵         Current function value: 477814.233176 ↵' 

【问题讨论】:

【参考方案1】:

将f改写如下:

function y = g(x, r)

     n = length(r);

     log_part = 0.5.*n.*log(x(2).^2);

     sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);

     y = log_part + sum_part;

 end

使用fmincon 而不是fminsearch,因为标准差是 总是一个正数。

标准差下限设置为零0


整个代码如下:

%make random numbers with gaussian dist
r=[2.39587291079469
1.57478022109723
-0.442284350603745
4.39661178526569
7.94034385633171
7.52208574723178
5.80673144943155
-3.11338531920164
6.64267230284774
-2.02996003947964];
% mu=2 sigma=3

fun = @(x)g(x, r);
% starting point
x0 = [0,0];

% borns 
lb = [-inf, 0];
ub = [inf, inf];
[y, fval] = fmincon(fun,x0,[],[],[],[],lb,ub, []);
function y = g(x, r)

     n = length(r);

     log_part = 0.5.*n.*log(x(2).^2);

     sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);

     y = log_part + sum_part;
end

解决方案

y = [3.0693    0.0000]

为了更好的估计,请直接使用mle()

代码很简单:

y = mle(r,'distribution','normal')

解决方案

y = [3.0693    3.8056]

【讨论】:

亲爱的 Adam,我知道 mle 会这样做,但我需要将其用于其他用途,并希望将其扩展到 matlab 没有内置代码的发行版。是的,你的建议很清楚 好吧,请接受我的回答,如果您有任何问题,请告诉我 如果您有自定义 pdf ***.com/questions/56625339/… 和此 ***.com/questions/56522903/…,请阅读此内容 亲爱的 Adam,我已经接受了你的回答,但 Stack 告诉我,我的回答无法计算,因为我没有很高的声誉;但我被告知我的投票将被考虑。 @FrankovaT 再试一次,信誉低的你只能接受答案

以上是关于使用 fminsearch 进行参数估计的主要内容,如果未能解决你的问题,请参考以下文章

参数估计

文本分析的参数估计方法

如何用matlab进行参数以及非参数概率密度估计

参数估计与假设检验

参数估计与假设检验

用 Bootstrap 进行参数估计大有可为