'too many input arguments' in mhsample

1 次查看(过去 30 天)
I am having the error 'too many input arguments' during my function call which itself is called by another built-in MatLab function 'mhsample'. I have not been able to figure out any reason for this error. Following is the snippet of the code:
% specification of unnormalized posterior pdf to sample from
pdfPost=@(x)posteriorDist(x,C,artificialNetwork,xPrior);
% specification of proposal distribution
pdfProp=@(x)priorDist(x,xPrior);
% specification of random number generator from proposal distribution
generator = @(x) (xPrior(:,1)+rand(7,1).*(xPrior(:,2)-xPrior(:,1)));
% calculation of posterior of model parameters (lambda)
smpl = mhsample(x0,nsamples,'pdf',pdfPost,'proppdf',pdfProp,'proprnd',generator);
Following is the error message:
Error using mhsample (line 117)
Error occurred while trying to evaluate the user-supplied
proppdf function '@(x)priorDist(x,xPrior)'.
Error in metroPolisHastingSampling (line 33)
smpl =
mhsample(x0,nsamples,'pdf',pdfPost,'proppdf',pdfProp,'proprnd',generator);
Caused by:
Error using @(x)priorDist(x,xPrior)
Too many input arguments.
'metroPolisHastingSampling' is the name of the script I have used for implementing Metropolis-Hastings sampling method.
So, the error is in proposal distribution which only has one input argument? So, why am I getting this error? Any useful comment is appreciated?
The code for priorDist is as follows:
function [p] = priorDist(x,xprior)
p=1/prod(xPrior(:,2)-xPrior(:,1));
end
I have provided all other codes below: Here is the code for 'PosteriorDist':
function ptr = posteriorDist(x,C,artificialNetwork)
lh=likelihoodPost(artificialNetwork,x,C); % likelihood of observation given these parameters
priorParam = priorDist(x); % computation of joint prior of model parameters
ptr=lh*priorParam; % computation of unnormalized posterior
end
rest of the definitions are
x0=5*ones(7,1);
nsamples=10000;
xprior=[zeros(7,1) 15*ones(15,1)];
C=rand(7,7);
I have taken a random just for testing purposes. artificialNetwork contains information and relevant data.
  4 个评论
Image Analyst
Image Analyst 2017-9-2
Why are you passing x into distPrior() when you don't even use it?
Abhinav
Abhinav 2017-9-2
编辑:Abhinav 2017-9-2
you are right, I don't need to pass x in this case. But in a general case, I will need x too. Therefore, I kept x in priorDist function. Also, I tried removing x but it gives the same error.

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2017-9-2
"proppdf takes two arguments as inputs with the same type and size as start."
"The proposal distribution q(x,y) gives the probability density for choosing x as the next point when y is the current point. It is sometimes written as q(x|y)."
Your line
pdfProp=@(x)priorDist(x,xPrior);
should probably just be
pdfProp = @priorDist;
  8 个评论
Abhinav
Abhinav 2017-9-3
I understand. I will test my code again with some of your suggestions and try to find out the problem.
Abhinav
Abhinav 2017-9-3
Walter Roberson, I could figure out the problem finally. mhsample expects two arguments in proposal distribution function: x and y. My proposal distribution was dependent only on one argument so I passed one argument x. But when I pass two argument x and y, it works even though y is not used in my proposal distribution.

请先登录,再进行评论。

更多回答(0 个)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by