⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 productapprox.m

📁 Non-parametric density estimation
💻 M
字号:
function [dens,ind] = productApprox(npd0, npds , anFns,anParams , type, varargin)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% generate an approximate density for the product of the input densities using%   MCMC approach%% productApprox(npd, {npdensities...}, {analyticFunctions...}, {analyticParams...},%                    type, [options] )%%  {npdensities...} =  cell array of kernel density estimates in product%  type = product method, one of: 'exact', 'epsilon', 'gibbs1', 'gibbs2', ...%  OPTIONS: %   'exact': no add'l arguments%   'epsilon':  [,tol]         -- use tolerance tol when sampling approximately%   'gibbs1':   [,Niter]       -- Niter iterations of sequential gibbs sampling%   'gibbs2':   [,Niter]       -- "" of parallel gibbs sampling%   'gibbsMS1' (or 2) [,Niter] -- Niter iters *per scale* in multiscale versions%   Importance Samplers:    %     args: alpha = sample alpha*N times, weight, then resample%           type = 'repeat' (default), 'unique' -- unique, weighted samples (< N)%     'import' [,alpha,type]  -- "mixture" importance sampling %     'importG' [,alpha,type] -- "gaussian" importance sampling%     'importPair' [...]      -- use sum of epsilon products of all pairs as proposal%     'importNoAn' [...]      -- "mixture" importance sampling, but resampling BEFORE%                                analytic function evaluation (for costly anFns)%%  {analyticFns...} =  cell array of analytic functions in product%  {analyticPar...} =  cell array of parameters for above functions%      each should take [Nd x Np] array and evaluate it at each [Nd x 1] location%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% See  Ihler,Sudderth,Freeman,&Willsky, "Efficient multiscale sampling from products%         of Gaussian mixtures", in Proc. Neural Information Processing Systems 2003%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Copyright (C) 2003 Alexander Ihler; distributable under GPL -- see README.txt  for i=1:length(npds)    if (npds{i}.type ~= 0) error('Sorry! Product only works for Gaussian densities.'); end;  end;  % if there's only one density, don't bother with the complex stuff:  if (length(npds) == 1)       dens = resample(npds{1},getNpts(npd0),'rot'); ind=[];      p = getPoints(dens); w = getWeights(dens);      for i=1:length(anFns),        w = w .* feval(anFns{i},p,anParams{i}{:});        w = w / sum(w);      end;      dens = kde(p, 'rot', w);  % Otherwise, lots of ways to take the product:  else  w    = ones(1,getNpts(npd0));  switch(lower(type))      case 'exact',   [p,ind] = prodSampleExact(npds,getNpts(npd0));      case 'epsilon', [p,ind] = prodSampleEpsilon(npds,getNpts(npd0),varargin{:});      case 'gibbs1',  [p,ind] = prodSampleGibbs1(npds,getNpts(npd0),varargin{:});      case 'gibbs2',  [p,ind] = prodSampleGibbs2(npds,getNpts(npd0),varargin{:});      case 'gibbsms1',[p,ind] = prodSampleGibbsMS1(npds,getNpts(npd0),varargin{:});      case 'gibbsms2',[p,ind] = prodSampleGibbsMS2(npds,getNpts(npd0),varargin{:});      case 'import',  [p,w] = prodSampleImportMix(npds,getNpts(npd0),anFns,anParams,varargin{:});      case 'importg', [p,w] = prodSampleImportGauss(npds,getNpts(npd0),anFns,anParams,varargin{:});      case 'importpair',[p,w]=prodSampleImportPair(npds,getNpts(npd0),anFns,anParams,varargin{:});      case 'importnoan',[p,w] = prodSampleImportMix(npds,getNpts(npd0),{},{},varargin{:});      otherwise, error('Unknown product type %s',type);  end;  switch(lower(type))    case {'import','importg','importpair'}      if ( 1/sum(w.^2)<.02*getNpts(npd0) || max(w)==0 )        warning('KDE:importFail','Importance sampling failed.  Generating samples with GibbsMS...');          [p,ind] = prodSampleGibbsMS1(npds,getNpts(npd0),5); % quick & dirty fix        w = ones(1,getNpts(npd0));        for i=1:length(anFns), w=w.*feval(anFns{i},p,anParams{i}{:});w=w/sum(w);end;      end;    otherwise      for i=1:length(anFns),        w = w .* feval(anFns{i},p,anParams{i}{:});        w = w / sum(w);      end;  end;  dens = kde(p, 'rot', w);  end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -