我正在尝试再现实际参数'tau'
和估计参数for over a month :(
之间的均方误差。通过最大似然估计(MLE)获得估计的'tau'
,即'tau_hat'
。
联合概率密度函数f(y|x,tau)
由
其中u_i = x_i +T
和T~IG(mu,lambda)
。 IG:逆高斯。 u
是y
的期望值。
f_T(t)
的pdf由
基于此website,我编写的代码是
clear
lambda = 8.1955;
mu = 10;
N = 128; % max number of molecules
x = zeros(N,1); % transmission time of the molecules from the Tx; for K = 1
tau = .5; % arbitrary initital tau
simN = 1000 ; % # runs per N
no_molecules_per_simN = [4, 8, 32, 64, N];
tau_hat = zeros(size(no_molecules_per_simN));
for ii=1: length(no_molecules_per_simN)
Lkeh = zeros(1,length(no_molecules_per_simN(ii))); % inititalize likelihood array
for jj=1: simN
T = random('InverseGaussian', mu,lambda, [no_molecules_per_simN(ii),1]); % random delay
y_prime = x(1:no_molecules_per_simN(ii)) + T + tau; % arrival time of the molecules seen by the Rx
y_prime_sort = sort(y_prime); % to arrange them in the ascending order of arrival
u = y_prime_sort; % assign to u variable
t = u - x(1:no_molecules_per_simN(ii)) - tau;
for kk = 1: length(u)
% applying the likelihood function to eq. 3 and ignoring the constant terms
%linear likelihood
% Lkeh(jj,kk) = prod(t(kk).^-1.5).*exp(-sum((t(kk) - mean(t)).^2./t(kk)).*(lambda./(2.*mean(t).^2 )));
% [UPDATE to the code]
% log likelihood
Lkeh(jj,kk) = -1.5*sum(t(kk))-(lambda./(2.*mu.^2 )).*sum((t(kk) - mu).^2./t(kk));
end
end
Lkeh_mean = mean(Lkeh,1); % averging the values
% [UPDATE to the code]
[maxL,index] = max(Lkeh_mean);
t_hat(ii) = T(index) ; % this will give the likelihood value of the propagation delay
tau_hat(ii) = mean(u - x(1:no_molecules_per_simN(ii)) - t_hat(ii)); % reverse substitution
end
MSE = zeros(size(tau_hat)); % initializing the array for MSE
for ii=1:length(tau_hat)
MSE(ii) = immse(tau,tau_hat(ii)); % mean squared error
end
figure
loglog(no_molecules_per_simN,MSE,'-o')
xlabel('n_{1}(quantity of molecules)')
ylabel('MSE(sec^{2})')
grid on
我得到的结果是
我在代码中犯了什么错误?我不太确定如何计算argmax
。供您参考,我指的是here。
答案 0 :(得分:5)
我无法运行您的代码,因为它需要一些我没有的工具箱。 也就是说,以下行:
tau_hat(ii) = max(Lkeh);
将为您提供可能性的最大值。那不是您真正想要的,那是您达到最大可能性的tay_hat 。
对于给定的tay_hat值,您需要一个tay函数,将tay_hat映射到可能性中。假设这就是您在此处所做的事情,我不确定对tay_hat的依赖关系在哪里。假设Lkeh是我刚才所描述的
[maxLikelihoodValue, maxLikelihoodIndex] = max(Lkeh);
使用max函数的两个输出,您将获得最大似然值,以及最重要的是发生最大值的索引。如果您已明确定义tay向量,则tay_hat将简单地由
给出tay_hat = tay(maxLikelihoodIndex);
从根本上说,tay的价值就是您获得最大可能性,而不是最大可能性本身。
为您提供一个玩具示例,假设您的似然函数为 L(x)= -x ^ 2-2 * x,
假设它是离散的,这样
x = linspace(-2,2,30);
那么L的离散版本将是
L_x = -x.^2 -2*x;
然后最大似然值将简单地由
给出max(L_x);
恰好是0.9988(实际上接近准确值)
但是您追求的是the value of x at which this maximum occurs
。
因此,您首先通过以下步骤提取获得最大值的索引:
[maximumLikelihood, maxLikIndex ] = max(L_x) ;
然后找到该索引处x的估计值,只需使用以下命令即可请求该索引处x的值:
x (maxLikIndex)
大约是-1.0,与预期的一样。 在您的示例中,您想估计最可能的tau_hat(在常识框架中)由最大化您的函数的值给出(而不是函数本身的最大值)。