wolffd@0: function [model, partition_size] = fit_partitioned_model(... wolffd@0: inputs, outputs, selectors, sel_sizes, min_size, partition_names, fn_name, varargin) wolffd@0: %function [models, partition_sizes] = fit_partitioned_model(... wolffd@0: % inputs, outputs, selectors, sel_sizes, min_size, partition_names, fn_name, varargin) wolffd@0: % wolffd@0: % Fit models to different subsets (columns) of the input/output data, wolffd@0: % as chosen by the selectors matrix. If there is only output data, set input=[]. wolffd@0: % If there is less than min_size data in partition i, wolffd@0: % we set model{i} = [] wolffd@0: % wolffd@0: % Example: wolffd@0: % selectors = [1 2 1 1 1 wolffd@0: % 1 2 2 1 2] wolffd@0: % sel_sizes = [2 2] so there are 4 models: (1,1), (2,1), (1,2), (2,2) wolffd@0: % We fit model{1} to data from columns 1,4 wolffd@0: % We fit model{2} to no data wolffd@0: % We fit model{3} to data from column 3,5 wolffd@0: % We fit model{4} to data from column 2 (assuming min_size <= 1) wolffd@0: % wolffd@0: % For each partition, we call the specified function with the specified arguments wolffd@0: % as follows: wolffd@0: % model{i} = fn(input(:,cols{i}), output(:,cols{i}), args) wolffd@0: % (We omit input if []) wolffd@0: % partition_size(i) is the amount of data in the i'th partition. wolffd@0: % wolffd@0: % Example use: row 1 of selectors is whether an object is present/absent wolffd@0: % and row 2 is the location. wolffd@0: % wolffd@0: % Demo: wolffd@0: % inputs = 1:5; outputs = 6:10; selectors = as above wolffd@0: % fn = 'fit_partitioned_model_testfn'; wolffd@0: % [model, partition_size] = fit_partitioned_model(inputs, outputs, selectors, [2 2], fn) wolffd@0: % should produce wolffd@0: % model{1}.input = [1 4], model{1}.output = [6 9] wolffd@0: % model{2} = [] wolffd@0: % model{3}.input = [3 5], model{3}.output = [8 10], wolffd@0: % model{4}.input = [2], model{3}.output = [7], wolffd@0: % partition_size = [2 0 2 1] wolffd@0: wolffd@0: wolffd@0: sel_ndx = subv2ind(sel_sizes, selectors'); wolffd@0: Nmodels = prod(sel_sizes); wolffd@0: model = cell(1, Nmodels); wolffd@0: partition_size = zeros(1, Nmodels); wolffd@0: for m=1:Nmodels wolffd@0: ndx = find(sel_ndx==m); wolffd@0: partition_size(m) = length(ndx); wolffd@0: if ~isempty(partition_names) % & (partition_size(m) < min_size) wolffd@0: fprintf('partition %s has size %d, min size = %d\n', ... wolffd@0: partition_names{m}, partition_size(m), min_size); wolffd@0: end wolffd@0: if partition_size(m) >= min_size wolffd@0: if isempty(inputs) wolffd@0: model{m} = feval(fn_name, outputs(:, ndx), varargin{:}); wolffd@0: else wolffd@0: model{m} = feval(fn_name, inputs(:,ndx), outputs(:, ndx), varargin{:}); wolffd@0: end wolffd@0: end wolffd@0: end