?? demosvm.m
字號:
function varargout = demosvm(varargin)
% 非線性模式分析模型.
%
% 說明:
% demosvm實現多類數據分類
% 用戶可以裝載數據,也可以手動創建
%
% 使用的訓練算法:
% - OAA算法
% - OAO 算法
% - BSVM2算法
% 使用的核函數
% -linear(線性核函數)
% - rbf(徑向基核函數)
% - poly(多項式核函數)
% - sigmoid(S型核函數)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @demosvm_OpeningFcn, ...
'gui_OutputFcn', @demosvm_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
% 系統初始化代碼。
% 系統可視化。
function demosvm_OpeningFcn(hObject, eventdata, handles, varargin)
%demosvm中使用以下結構體,來實現圖形窗口上的各個控件的數據傳送,進而實現各個控件的功能。
data=struct(...
'pushbutton1', handles.pushbutton1,... %創建數據
'pushbutton2', handles.pushbutton2,... %裝載數據
'pushbutton3', handles.pushbutton3,... %重置數據
'pushbutton4', handles.pushbutton4,... %訓練SVM
'pushbutton5', handles.pushbutton5,... %關閉
'pushbutton6', handles.pushbutton6,... %圖象導出
'pushbutton7', handles.pushbutton7,... %計算SV
'pushbutton8', handles.pushbutton8,... %決策邊界
'popupmenu1', handles.popupmenu1,...%訓練算法
'popupmenu2', handles.popupmenu2,...%核函數
'popupmenu3', handles.popupmenu2,...%C參數
'edit1', handles.edit1,...% 注釋窗口
'axes1', handles.axes1); %圖形顯示坐標軸
set(gcf ,'UserData',data );% 將圖形窗口顯示在桌面上
set(gcf,'Visible','on');
drawnow;
handles.output = hObject;
guidata(hObject, handles);
function varargout = demosvm_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% 創建數據回調函數
function pushbutton1_Callback(hObject, eventdata, handles)
n=5;
createdata('finite',n,'created',gcf);
% 裝載數據回調函數
function pushbutton2_Callback(hObject, eventdata, handles)
h = waitbar(0,'請等待...');%等待條行窗口
for i=1:100,
waitbar(i/100)
end
close(h)
data=get(gcf,'UserData');
[name,path]=uigetfile('*.mat','Open file');
if name~=0,
file.pathname=strcat(path,name);
file.path=path;
file.name=name;
if check2ddata( file.pathname )
set(data.pushbutton2,'UserData',file);
cla;
data=loadsets(gcf); % 裝載結構型數據
set(gcf,'UserData',data);
set(handles.edit1,'String','數據已經裝載 !');
else
errordlg('This file does not contain required data.','Bad file','modal');
end
end
%重置數據回調函數
function pushbutton3_Callback(hObject, eventdata, handles)
cla;
set(handles.edit1,'String','數據已經清除,請重新裝載 !');
% 訓練SVM回調函數----軟件核心部分
function pushbutton4_Callback(hObject, eventdata, handles)
ker_inx = get( handles.popupmenu2, 'Value' ); %獲取核函數信息
if ker_inx == 1;
ker = 'linear';
set( handles.edit3,'Enable','off');
elseif ker_inx == 2;
ker = 'rbf';
set( handles.edit3,'Enable','on');
elseif ker_inx == 3;
ker = 'poly';
set( handles.edit3,'Enable','on');
else
ker = 'sigmoid';
set( handles.edit3,'Enable','on');
end
C_inx = get( handles.popupmenu3, 'Value' ); %獲取C參數信息
if C_inx == 1;
C=10;
elseif C_inx == 2;
C=50;
else C=100;
end
switch get( handles.popupmenu1, 'Value' )
case 1
data=get(handles.axes1,'userdata');
options.solver = 'smo'; % 使用 SMO solver
options.ker = ker; % 使用核函數
options.arg = 1; % kernel argument
options.C = C; %調整參數
T1=cputime;
model = oaasvm(data,options ); % 訓練
T=cputime-T1;%計算訓練所用時間
set(handles.pushbutton6,'userdata',T);%將時間變量傳遞出去
%顯示圖形
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C',options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['訓練算法:OAA算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n'],...
ker,T);
case 2
data=get(handles.axes1,'userdata');
options.solver = 'smo';
options.ker = ker;
options.arg = 1;
options.C = C;
T1=cputime;
model = oaosvm(data,options);
T=cputime-T1;
set(handles.pushbutton6,'userdata',T);
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C',options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['訓練算法:OAO算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n'],...
ker,T);
case 3
data=get(handles.axes1,'userdata');
options.solver = 'smo'; % 使用 smo solver
options.ker = ker;
options.arg = 1;
options.C = C;
T1=cputime;
model = bsvm2(data,options); % training
T=cputime-T1;
set(handles.pushbutton6,'userdata',T);
% 顯示圖形
axes(handles.axes1);cla;
ppatterns(data);
D=struct('solver',options.solver,'ker',options.ker,'arg',options.arg,'C', options.C,'model',model);
set(handles.pushbutton2,'userdata',D);
text=sprintf(...
['訓練算法:BSVM2算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n'],...
ker,T);
end
set( handles.edit1,'String', text );%將結果顯示到注釋窗口
%關閉窗口回調函數
function pushbutton5_Callback(hObject, eventdata, handles)
close(gcf);
%圖象導出回調函數
function pushbutton6_Callback(hObject, eventdata, handles)
h=get(gcf,'CurrentAxes');
fig2jpg(h);
%計算SV回調函數
function pushbutton7_Callback(hObject, eventdata, handles)
data=get(handles.axes1,'userdata');
D=get(handles.pushbutton2,'userdata');
model=D.model;
axes(handles.axes1);cla;
nsv = model.nsv;%將訓練算法中支持向量個數的變量nsv傳遞出來
time=get(handles.pushbutton6,'userdata');%將計算CPU時間參數T傳遞出來
ppatterns(data);
ppatterns(model.sv.X,'ko',12);
set(handles.pushbutton2,'userdata',D);
ker_inx = get( handles.popupmenu2, 'Value' ); %獲取核函數信息
if ker_inx == 1;
ker = 'linear';
elseif ker_inx == 2;
ker = 'rbf';
elseif ker_inx == 3;
ker = 'poly';
else
ker = 'sigmoid';
end
%要輸出的內容控制
if get( handles.popupmenu1, 'Value' )==1
text1=sprintf(...
['訓練算法:OAA算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n'],...
ker,time,nsv );
elseif get( handles.popupmenu1, 'Value' )==2
text1=sprintf(...
['訓練算法:OAO算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n'],...
ker,time,nsv );
else
text1=sprintf(...
['訓練算法:BSVM2算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n'],...
ker,time,nsv );
end
set( handles.edit1,'String', text1 );
%決策邊界回調函數
function pushbutton8_Callback(hObject, eventdata, handles)
data=get(handles.axes1,'userdata');
D=get(handles.pushbutton2,'userdata');
model=D.model;
axes(handles.axes1);cla;
ppatterns(data);
ppatterns(model.sv.X,'ko',12);
pboundary(model);
nsv = model.nsv;
time=get(handles.pushbutton6,'userdata');
trnerr = model.trnerr;%將訓練算法中計算分類錯誤的參數傳出
ker_inx = get( handles.popupmenu2, 'Value' ); %獲取核函數信息
if ker_inx == 1;
ker = 'linear';
elseif ker_inx == 2;
ker = 'rbf';
elseif ker_inx == 3;
ker = 'poly';
else
ker = 'sigmoid';
end
if get( handles.popupmenu1, 'Value' )==1
text1=sprintf(...
['訓練算法:OAA算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n',...
'分類錯誤率: %.2f%%'],...
ker,time,nsv ,100*trnerr);
elseif get( handles.popupmenu1, 'Value' )==2
text1=sprintf(...
['訓練算法:OAO算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n',...
'分類錯誤率: %.2f%%'],...
ker,time,nsv ,100*trnerr );
else
text1=sprintf(...
['訓練算法:BSVM2算法\n',...
'核函數: %s \n',...
'訓練所費時間: %.6f\n',...
'支持向量的個數: %d\n',...
'分類錯誤率: %.2f%%'],...
ker,time,nsv,100*trnerr );
end
set( handles.edit1,'String', text1 );
%訓練算法下拉菜單
function popupmenu1_Callback(hObject, eventdata, handles)
function popupmenu1_CreateFcn(hObject, eventdata, handles)
handles.popupmenu1=get(hObject,'Value');%將菜單選項值傳出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% 核函數下拉菜單
function popupmenu2_Callback(hObject, eventdata, handles)
function popupmenu2_CreateFcn(hObject, eventdata, handles)
handles.popupmenu2=get(hObject,'Value');%將菜單選項值傳出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% C懲罰系數下拉菜單
function popupmenu3_Callback(hObject, eventdata, handles)
function popupmenu3_CreateFcn(hObject, eventdata, handles)
handles.popupmenu3=get(hObject,'Value');%將菜單選項值傳出
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%注釋窗口
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% MENU設計及回調函數
%創建數據
function Untitled_2_Callback(hObject, eventdata, handles)
n=5;
createdata('finite',n,'created',gcf);
%裝載數據
function Untitled_3_Callback(hObject, eventdata, handles)
h = waitbar(0,'Please wait...');
for i=1:100,
waitbar(i/100)
end
close(h)
data=get( gcf,'UserData');
[name,path]=uigetfile('*.mat','Open file');
if name~=0,
file.pathname=strcat(path,name);
file.path=path;
file.name=name;
if check2ddata( file.pathname )
set(data.pushbutton2,'UserData',file);
cla;
data=loadsets(gcf);
set(gcf,'UserData',data);
set(data.edit1,'String','數據已經裝載,請選擇下一步 !');
else
errordlg('This file does not contain required data.','Bad file','modal');
end
end
% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% 關閉
function Untitled_4_Callback(hObject, eventdata, handles)
close(gcf);
% --------------------------------------------------------------------
function Untitled_5_Callback(hObject, eventdata, handles)
% 調用OAA算法演示模型
function Untitled_6_Callback(hObject, eventdata, handles)
OAA_Multi_C_SVM;
% 調用OAO算法演示模型
function Untitled_7_Callback(hObject, eventdata, handles)
OAO_Multi_SVM;
% 調用BSVM2算法演示模型
function Untitled_8_Callback(hObject, eventdata, handles)
Multi_BSVM__L2_soft_margi
% --------------------------------------------------------------------
function Untitled_9_Callback(hObject, eventdata, handles)
% --------------------------------------------------------------------
function Untitled_10_Callback(hObject, eventdata, handles)
helpwin(mfilename);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -