fit_ANCHOR_ARL2_part2.m

Continued from fit_ANCHOR_ARL2_part1.m

Fit the ANCHOR2 model to the group ARL2 profiles of the Fdbk1 Experiment.

The main tool is .../work/models/anchor/fit_SSE/anchor_ARL2.m

File: work/CMUExper/fdbk1/data/fit_ANCHOR_ARL2_part2.m
Date: 2007-08-20
Alexander Petrov, http://alexpetrov.com

Contents

Load the data

Start from scratch, generate new chev's, etc. The only thing used from fit_ANCHOR_ARL2_part1.m are the new c_ratio=.75 parameter setting and the new starting point for the searches.

clear all
cd(fullfile(work_pathstr,'CMUExper','fdbk1','data')) ;
load('S2.mat') ;
ARL2 = [S2(:).ARL2] ;    % 9x55
gr=[S2(:).group]' ;
ugr = unique(gr) ;
N_groups = length(ugr) ;
ugr_descr = {'U1' 'L1' 'H1', 'L2' 'H2' } ;   % [1 2 3, 5 6]

Collapse across groups

grARL2 = zeros(size(ARL2,1),N_groups) ;   % 9x5
gr_idx = cell(1,N_groups) ;
for k = 1:N_groups
    gr_idx{k} = find(gr==ugr(k))' ;
    grARL2(:,k) = mean(ARL2(:,gr_idx{k}),2) ;
end

Fit INST on the same stimulus sequences, 11 per group

stim = [S2(:).dist] ;   % 476x55
fdbk = [S2(:).fdbk] ;

Search parameters

Same search settings as in fit_ANCHOR_ARL2_part1.m Search strategy: 1. Fix c_ratio = .75 once and for all 1. Explore cutoff on a grid 2. Explore history on a grid 3. Search for mem_k and temper using FMINCON as before but start from mem_k = .085, temper = .030 % perc_k = .040 as always

fminconp = 1 ;
flags = [0 1 1 0 0 0 0 0] ;   % [perc_k mem_k temper hist cutoff xx xx c_ratio]
Sparams = anchor_search_params2(flags,fminconp) ;
optns = optimset(Sparams.optns,'TolX',1e-2,'Display','off') ;
Sparams.optns = optns ;
Sparams.target_vals = grARL2
c_ratio = .75 ;
Sparams.params.cutoffs = .65 .* [-3 -1 c_ratio 3*c_ratio] ;
Sparams.params.mem_k = .085 ;
Sparams.params.temper = .030 ;
Sparams.params.history = .040 ;
Sparams.params
Sparams = 
     model_name: 'anchor_ARL2'
         params: [1x1 struct]
      p2v_templ: {'VAL = PARAMS.mem_k * 10 ;'  'VAL = PARAMS.temper * 10 ;'}
      v2p_templ: {'PARAMS.mem_k = VAL / 10 ;'  'PARAMS.temper = VAL / 10 ;'}
         bounds: [2x2 double]
     ARL_params: [1x1 struct]
    funfun_name: 'fmincon'
          optns: [1x1 struct]
     lsfun_name: 'sumsqerr'
    target_vals: [9x5 double]
ans = 
       scale: 'LINEAR'
       N_cat: 7
     SM_conv: 1.0000e-03
      cat_sz: 0.0500
      perc_k: 0.0400
       mem_k: 0.0850
       avail: [7x1 double]
     anchors: [7x6 double]
     cutoffs: [-1.9500 -0.6500 0.4875 1.4625]
      temper: 0.0300
     history: 0.0400
       alpha: 0.3000
       decay: 0.5000
         ITI: 4
    M_raster: 7
    A_raster: [5 5 3 3]
    mnfieldp: 1

"Chance event" sets

N_chevs = 2 ;

% Pack into "model data" structures suitable for passing as arguments.
wfname = 'work_ANCHOR.mat' ;
if (file_exists(wfname))
    load(fname) ;
else
  Mdata = cell(1,N_chevs) ;
  for k = 1:N_chevs
      Mdata{k}.stim = stim ;
      Mdata{k}.fdbk = fdbk ;
      Mdata{k}.group_idx = gr_idx ;
      %Mdata{k}.params = Sparams.params ;    % will be set by SUMSQERR
      Mdata{k}.chev = make_anchor_chev(size(stim,1),size(stim,2),7) ;
      Mdata{k}.ARL_params = Sparams.ARL_params ;
  end
end

Cutoff parameter grid

cutoff_levels = [.55 .60 .65 .70]' ;        % c- in categ_sz units
N_cutoff_levels = length(cutoff_levels) ;
history_levels = [.020 .030 .040 .050 .060] ;
N_history_levels = length(history_levels) ;

Main work

fname = 'grid_search_ANCHOR_ARL2_part2.mat' ;
if (file_exists(fname))
    load(fname) ;
else
  grid_SSE = zeros([N_cutoff_levels,N_history_levels,N_chevs]) ;
  grid_optX = cell([N_cutoff_levels,N_history_levels,N_chevs]) ;
  grid_det = cell([N_cutoff_levels,N_history_levels,N_chevs]) ;
  tic
  for k1 = 1:N_cutoff_levels
      c = cutoff_levels(k1) ;
      cutoffs = c .* [-3 -1 c_ratio 3*c_ratio] ;
      Sparams.params.cutoffs = cutoffs ;
      fprintf('\n cutoff %4.2f: ',c) ;
      for k2 = 1:N_history_levels
          H = history_levels(k2) ;
          Sparams.params.history = H ;
          for k = 1:N_chevs
              [par,SSE,optX,det] = paramsearch(Mdata{k},Sparams) ;  % <-- Sic!
              grid_SSE(k1,k2,k) = SSE ;
              grid_optX{k1,k2,k} = optX ;
              grid_det{k1,k2,k} = det ;
              fprintf('%5.3f ',SSE) ;
              save(fname,'grid_SSE','grid_optX','grid_det','Sparams',...
                   'cutoff_levels','history_levels') ;
          end
          fprintf(', ') ;
      end
  end
  fprintf('\n') ;
  toc
end % if file_exists ...

Plot the SSE

SSE = mean(grid_SSE,3)   % average across the chev's
[X,Y] = meshgrid(history_levels,cutoff_levels) ;
contourf(X,Y,SSE) ; colorbar ; title('SSE') ;
xlabel('History weight H') ; ylabel('c- cutoff') ;
SSE =
    1.8085    1.0660    0.9972    1.0284    0.9776
    1.6768    1.0070    1.0666    1.0177    1.0052
    1.6504    1.0508    1.0680    1.0876    1.0769
    1.5760    1.0721    1.0415    1.0580    1.0693

Plot the memory noise parameter

mem_k = zeros(size(grid_optX)) ;
temper = zeros(size(grid_optX)) ;
for k1 = 1:N_cutoff_levels
    for k2 = 1:N_history_levels
        for k = 1:N_chevs
            mem_k(k1,k2,k) = grid_optX{k1,k2,k}(1) / 10 ;
            temper(k1,k2,k) = grid_optX{k1,k2,k}(2) / 10 ;
        end
    end
end

mem_k = mean(mem_k,3)
contourf(X,Y,mem_k) ; colorbar ; title('Memory noise') ;
xlabel('History weight H') ; ylabel('c- cutoff') ;
mem_k =
    0.1000    0.0984    0.0839    0.0932    0.0718
    0.1000    0.0991    0.0827    0.0797    0.0646
    0.1000    0.0997    0.0853    0.0738    0.0413
    0.1000    0.0881    0.0717    0.0658    0.0390

Plot the temperature parameter

temper = mean(temper,3)
contourf(X,Y,temper) ; colorbar ; title('Softmax temperature') ;
xlabel('History weight H') ; ylabel('c- cutoff') ;
temper =
    0.0200    0.0219    0.0297    0.0428    0.0517
    0.0200    0.0217    0.0320    0.0461    0.0505
    0.0200    0.0260    0.0347    0.0435    0.0687
    0.0200    0.0234    0.0310    0.0421    0.0689

Conclusion

The SSE surface is quite flat in this region of the parameter space. The only region that is ruled out definitively is that for H<=.020. We are free to choose any history weight in the range .030-.060. This will be done to optimize (informally) the fit to the Assim profiles. We are also free to choose any cutoff in the range .55-.65. For roundness and specificity, let it be cutoff = .60. The other two parameters vary systematically as a function of H:

history:  .030   .040   .050   .060
mem_k:    .099   .083   .080   .065
temper:   .022   .032   .046   .050

The fitting effort continues in ./final_ARL2_fits.m

Clean up

clear k k1 k2 X Y ;