www.gusucode.com > classification_matlab_toolbox分类方法工具箱源码程序 > code/Classification_toolbox/FindParametersFunctions.m
function FindParametersFunctions(action) Nlines = 6; short_action = action(1:4); param = str2num(action(end)); if ~isempty(param), hNone = findobj('Tag',['btnNone' num2str(param)]); hString = findobj('Tag',['btnString' num2str(param)]); hNumber = findobj('Tag',['btnNumeric' num2str(param)]); end switch short_action case 'Star' %Start the parameter tuning %Find who to tune hDiv = findobj('Tag','txtDivisions'); divisions = str2num(get(hDiv,'String')); hFolds = findobj('Tag','txtFolds'); Nfolds = str2num(get(hFolds,'String')); tune = ones(1,Nlines); for i = 1:Nlines, hNumber = findobj('Tag',['btnNumeric' num2str(i)]); hString = findobj('Tag',['btnString' num2str(i)]); if (get(hNumber, 'Value') == 1), tune(i) = divisions; hSpacing = findobj('Tag',['popSpacing' num2str(i)]); hFrom = findobj('Tag',['txtLowerLimit' num2str(i)]); hTo = findobj('Tag',['txtUpperLimit' num2str(i)]); if (get(hSpacing,'Value') == 1), parameters(i).grid = linspace(str2num(get(hFrom,'String')),str2num(get(hTo,'String')),divisions); else parameters(i).grid = logspace(log10(str2num(get(hFrom,'String'))),log10(str2num(get(hTo,'String'))),divisions); end parameters(i).string = ''; else if (get(hString, 'Value') == 1), hString = findobj('Tag', ['txtString' num2str(i)]); parameters(i).string = get(hString,'String'); parameters(i).grid = inf; else parameters(i).grid = inf; parameters(i).string = ''; end end end numeric = find(tune == divisions); Nnumeric = length(numeric); best = zeros(Nfolds, Nnumeric); %Prepare the data features = evalin('base','features'); targets = evalin('base','targets'); indices = randperm(floor(size(features,2)/Nfolds)*Nfolds); indices = reshape(indices,Nfolds,floor(size(features,2)/Nfolds)); %Find the classifier h = findobj('Tag', 'Algorithm'); val = get(h,'Value'); algorithm = get(h,'String'); algorithm = deblank(char(algorithm(val,:))); region = calculate_region(features, [zeros(1,4) 100]); for f = 1:Nfolds, %For each of the parameter options, find the classification results min_error = 1; disp(['Working on fold number ' num2str(f)]) for i1 = 1:tune(1), for i2 = 1:tune(2), for i3 = 1:tune(3), for i4 = 1:tune(4), for i5 = 1:tune(5), for i6 = 1:tune(6), %Build a parameter vector Nvec = zeros(1,Nnumeric); param = '['; for j = 1:Nlines, if isempty(parameters(j).string), if (length(parameters(j).grid) > 1), Nvec(find(numeric==j)) = eval(['parameters(j).grid(i' num2str(j) ')']); param = [param, num2str(Nvec(find(numeric==j))) ',']; end else if isempty(str2num(parameters(j).string)), param = [param, '''', parameters(j).string, ''',' ]; else param = [param, parameters(j).string, ',']; end end end param = [param(1:end-1), ']']; if ~isempty(str2num(param)), param = str2num(param); end %Build a classifier train_in = indices([1:f-1,f+1:Nfolds],:); train_in = train_in(:); test_in = indices(f,:); D = feval(algorithm, features(:, train_in), targets(train_in), param, region); %Test it and save the results if they are better [train_err, test_err] = calculate_error (D, features(:, train_in), targets(train_in), features(:, test_in), targets(test_in), region, length(unique(targets))); if (test_err(end) < min_error), best(f,:) = Nvec; min_error = test_err(end); end end end end end end end end %Finished on all the dimensions, so now find the optimal configuration best_params = median(best')'; %Form the best parameter vector param = '['; for j = 1:Nlines, if isempty(parameters(j).string), if (length(parameters(j).grid) > 1), param = [param, num2str(best_params(find(numeric==j))) ',']; end else param = [param, '''', parameters(j).string ,''',']; end end param = [param(1:end-1), ']']; %Put it inside the GUI uiwait(helpdlg(['The best parameters found are: ', param], 'Parameter selection')) if ~isempty(str2num(param)), param = str2num(param); end if strcmp(get(findobj('Tag', 'txtAlgorithmParameters'),'Visible'),'on'), set(findobj('Tag', 'txtAlgorithmParameters'),'String',param) else set(findobj('Tag', 'txtAlgorithmParametersLong'),'String',param) end close case 'None' set(hNone, 'Value', 1); set(hString, 'Value', 0); set(hNumber, 'Value', 0); case 'Stri' set(hNone, 'Value', 0); set(hString, 'Value', 1); set(hNumber, 'Value', 0); case 'Numb' set(hNone, 'Value', 0); set(hString, 'Value', 0); set(hNumber, 'Value', 1); otherwise error('Unknown command') end