www.gusucode.com > matlab编程SVM参数寻优算法的GUI界面实现代码 > matlab编程SVM参数寻优算法的GUI界面实现代码/code/Algorithm_GUI.m
function varargout = Algorithm_GUI(varargin) % ALGORITHM_GUI MATLAB code for Algorithm_GUI.fig % ALGORITHM_GUI, by itself, creates a new ALGORITHM_GUI or raises the existing % singleton*. % % H = ALGORITHM_GUI returns the handle to a new ALGORITHM_GUI or the handle to % the existing singleton*. % % ALGORITHM_GUI('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in ALGORITHM_GUI.M with the given input arguments. % % ALGORITHM_GUI('Property','Value',...) creates a new ALGORITHM_GUI or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Algorithm_GUI_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Algorithm_GUI_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Algorithm_GUI % Last Modified by GUIDE v2.5 12-Aug-2018 18:21:53 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Algorithm_GUI_OpeningFcn, ... 'gui_OutputFcn', @Algorithm_GUI_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before Algorithm_GUI is made visible. function Algorithm_GUI_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Algorithm_GUI (see VARARGIN) % Choose default command line output for Algorithm_GUI handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes Algorithm_GUI wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = Algorithm_GUI_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in checkbox1. function popupmenu1_Callback(hObject, eventdata, handles) % hObject handle to popupmenu1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array % contents{get(hObject,'Value')} returns selected item from popupmenu1 load wine.mat; % 画出测试数据的box可视化图 figure; boxplot(wine,'orientation','horizontal','labels',categories); title('wine数据的box可视化图','FontSize',12); xlabel('属性值','FontSize',12); grid on; % 画出测试数据的分维可视化图 figure subplot(3,5,1); hold on for run = 1:178 plot(run,wine_labels(run),'*'); end xlabel('样本','FontSize',10); ylabel('类别标签','FontSize',10); title('class','FontSize',10); for run = 2:14 subplot(3,5,run); hold on; str = ['attrib ',num2str(run-1)]; for i = 1:178 plot(i,wine(i,run-1),'*'); end xlabel('样本','FontSize',10); ylabel('属性值','FontSize',10); title(str,'FontSize',10); end % --- Executes during object creation, after setting all properties. function popupmenu1_CreateFcn(hObject, eventdata, handles) % hObject handle to popupmenu1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on selection change in A. function A_Callback(hObject, eventdata, handles) % hObject handle to A (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: contents = cellstr(get(hObject,'String')) returns A contents as cell array % contents{get(hObject,'Value')} returns selected item from A global val val=get(hObject,'Value'); % --- Executes during object creation, after setting all properties. function A_CreateFcn(hObject, eventdata, handles) % hObject handle to A (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global val global train_wine global test_wine_labels global test_wine global train_wine_labels global bestc1 global bestg1 global bestc2 global bestg2 load wine.mat; % 选定训练集和测试集 % 将第一类的1-30,第二类的60-95,第三类的131-153做为训练集 train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)]; % 相应的训练集的标签也要分离出来 train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)]; % 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集 test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)]; % 相应的测试集的标签也要分离出来 test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)]; %% 数据预处理 % 数据预处理,将训练集和测试集归一化到[0,1]区间 [mtrain,ntrain] = size(train_wine); [mtest,ntest] = size(test_wine); dataset = [train_wine;test_wine]; % mapminmax为MATLAB自带的归一化函数 [dataset_scale,ps] = mapminmax(dataset',0,1); dataset_scale = dataset_scale'; train_wine = dataset_scale(1:mtrain,:); test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: ); if val==1 %% 选择最佳的SVM参数c&g % 首先进行粗略选择: c&g 的变化范围是 2^(-10),2^(-9),...,2^(10) [bestacc1,bestc1,bestg1] = SVMcgForClass(train_wine_labels,train_wine,-10,10,-10,10); % 打印粗略选择结果 disp('打印粗略选择结果'); str = sprintf( 'Best Cross Validation Accuracy = %g%% Best c = %g Best g = %g',bestacc1,bestc1,bestg1); disp(str); % 根据粗略选择的结果图再进行精细选择: c 的变化范围是 2^(-2),2^(-1.5),...,2^(4), g 的变化范围是 2^(-4),2^(-3.5),...,2^(4), [bestacc1,bestc1,bestg1] = SVMcgForClass(train_wine_labels,train_wine,-2,4,-4,4,3,0.5,0.5,0.9); % 打印精细选择结果 disp('打印精细选择结果'); str = sprintf( 'Best Cross Validation Accuracy = %g%% Best c = %g Best g = %g',bestacc1,bestc1,bestg1); disp(str); end if val==2 [bestacc2,bestc2,bestg2] = psoSVMcgForClass(train_wine_labels,train_wine); % 打印选择结果 disp('打印选择结果'); str = sprintf( 'Best Cross Validation Accuracy = %g%% Best c = %g Best g = %g',bestacc2,bestc2,bestg2); disp(str); end % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) load wine.mat; global bestc1 global bestg1 global bestc2 global bestg2 global val global test_wine_labels global test_wine global train_wine_labels global train_wine if val==1 %% 利用最佳的参数进行SVM网络训练 cmd = ['-c ',num2str(bestc1),' -g ',num2str(bestg1)]; model = svmtrain(train_wine_labels,train_wine,cmd); %% SVM网络预测 [predict_label,accuracy,decision_values] = svmpredict(test_wine_labels,test_wine,model); % 打印测试集分类准确率 total = length(test_wine_labels); right = sum(predict_label == test_wine_labels); disp('打印测试集分类准确率'); str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total); disp(str); %% 结果分析 % 测试集的实际分类和预测分类图 % 通过图可以看出只有三个测试样本是被错分的 % figure; % hold on; plot(test_wine_labels,'o'); hold on; plot(predict_label,'r*'); xlabel('测试集样本','FontSize',12); ylabel('类别标签','FontSize',12); legend('实际测试集分类','预测测试集分类'); title('测试集的实际分类和预测分类图','FontSize',12); grid on; end if val==2 %% 利用最佳的参数进行SVM网络训练 cmd = ['-c ',num2str(bestc2),' -g ',num2str(bestg2)]; model = svmtrain(train_wine_labels,train_wine,cmd); %% SVM网络预测 [predict_label,accuracy,decision_values] = svmpredict(test_wine_labels,test_wine,model); % [predict_label,accuracy] = svmpredict(test_wine,test_wine_labels,model); % 打印测试集分类准确率 total = length(test_wine_labels); right = sum(predict_label == test_wine_labels); disp('打印测试集分类准确率'); str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total); disp(str); %% 结果分析 % 测试集的实际分类和预测分类图 % 通过图可以看出只有三个测试样本是被错分的 % figure; plot(test_wine_labels,'o'); hold on; plot(predict_label,'r*'); xlabel('测试集样本','FontSize',12); ylabel('类别标签','FontSize',12); legend('实际测试集分类','预测测试集分类'); title('测试集的实际分类和预测分类图','FontSize',12); grid on; end