模式识别(三):线性判别函数

 

本系列文章由孙旭编辑,转载请注明出处

http://blog.csdn.net/longyindiyi/article/details/20068781

多谢合作!

 

如果您在阅读文章过程中发现有表述错误的地方,还请指正。

 

上一节我们讲到,分类器的设计有两种思路:基于判别函数的分类器基于距离的分类器。本节我们开始介绍基于判别函数的分类器中的线性判别函数法。

判别函数法是对不同模式进行分类有很多方法中应用比较广的一种。

所谓判别函数就是指直接用来对模式样本进行分类的准则函数

如果判别函数可以用线性关系进行描述的话,就称之为线性判别函数,否则称为非线性判别函数

上图给了我们一个直观的理解,第一个图中的蓝色直线代表一个线性分类器,而第二个图中的绿色曲线代表一个非线性分类器。

下面我们给出线性判别函数的数学形式。

d 维空间中的线性判别函数的一般形式:

 (1)

这里我们用加粗的字符表示向量(未加特殊说明情况下向量均指的是列向量), 是样本向量,  是权值向量是一个常数(阈值),即

有时候,为了便于程序实现,也将公式(1)表示为

这里

对于两类问题而言,有

其中  表示第  类。若出现  则认为判别函数失效,拒绝分类。不难看出,由上面的  确定的决策面为超平面,而 是该决策面的法向量。

对这类分类器的学习过程可以表述如下:

 

  1. 获取训练样本集, 即一组具有类别标志的样本集;
  2. 确定一个准则函数  : 的值反映分类器的性能,它的极值解则对应于最好的分类决策,例如   为分类误差;
  3. 最优化方法求出准则函数的极值解 ;
  4. 对未知样本y, 只要计算 ,然后根据决策规则判定  所属类别。

上述过程可以用流程图表示如下:

 

线性判别函数的优点是简单,但是它不能用来处理一些稍微复杂点的问题,比如,下面这种情况。

设计一个一维分类器,使其功能为 (假设 a < b):

 

  • 当 x < a 或者 x > b 时,则决策 x 属于第一类;
  • 当 a < x < b 时,则决策 x 属于第二类。

显然,如果判别函数取为 给 g(x) = (x - a)(x - b) 可以满足要求,但这时 g(x) 却并非关于 x 的线性函数,关于线性函数的优化方法将不能直接应用在这个函数上。这时,我们该怎么办呢?

 

答案是使 g(x) 线性化。那么,怎么线性化呢?换元法相信大家都学过,这里用到的就是换元法,只不过我们换了个叫法——把换元后得到的新的判别函数称为广义线性判别函数,权向量称为广义权向量。具体过程如下:

展开判别函数为  , 令

这时,有

此时,判别函数变成了关于  的线性函数。学习过程就可以按前面介绍的方法进行了。

按照上述原理,任何非线性函数 g(x) 用级数展开成高次多项式后,都可转化成线性判别函数来处理,但是经过变换后维数大大增加了,这将导致计算量大大增加,甚至导致维数灾难

由此可见,增加维数有时可能不是好办法,那么,降低维数呢?

这就引出了线性判别分析中一个非常重要的算法——Fisher 线性分析,我们将在下篇文章里进行介绍。

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以为您提供MATLAB GUI模式识别线性判别器的实现方和源码。 首先,我们需要了解什么是线性判别器。线性判别器是一种常用的模式识别,它可以将数据分成不同的类别。对于二分类问题,线性判别器可以使用一条直线将两个类别分开,对于多分类问题,可以使用多条直线或平面将不同的类别分开。 接下来,我们需要创建一个MATLAB GUI界面,用于输入和展示数据。我们可以使用MATLAB的GUIDE工具来创建GUI界面。在GUI界面中,我们需要添加以下组件: 1. 一个axes组件,用于展示数据和分隔线; 2. 两个edit组件,用于输入数据; 3. 一个pushbutton组件,用于添加数据; 4. 一个popupmenu组件,用于选择不同的分类器。 接下来,我们需要编写代码实现线性判别器。我们可以使用MATLAB的分类器工具箱中的线性判别器函数fitcdiscr来训练模型,并使用predict函数来预测新的数据。具体实现过程如下: 1. 在GUI界面中添加一个pushbutton按钮,用于添加数据。当用户点击该按钮时,将读取两个edit组件中的数据,并将其添加到一个矩阵中。 2. 在GUI界面中添加一个popupmenu组件,用于选择不同的分类器。当用户选择不同的分类器时,将使用fitcdiscr函数训练模型,并使用predict函数预测新的数据。 3. 在GUI界面中添加一个axes组件,用于展示数据和分隔线。当用户添加新的数据时,将在该axes组件中绘制数据点。使用fitcdiscr函数训练模型后,将绘制分隔线。 下面是MATLAB GUI模式识别线性判别器的源码示例: ``` function varargout = LinearDiscriminantAnalysis_GUI(varargin) % LINEARDISCRIMINANTANALYSIS_GUI MATLAB code for LinearDiscriminantAnalysis_GUI.fig % LINEARDISCRIMINANTANALYSIS_GUI, by itself, creates a new LINEARDISCRIMINANTANALYSIS_GUI or raises the existing % singleton*. % % H = LINEARDISCRIMINANTANALYSIS_GUI returns the handle to a new LINEARDISCRIMINANTANALYSIS_GUI or the handle to % the existing singleton*. % % LINEARDISCRIMINANTANALYSIS_GUI('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in LINEARDISCRIMINANTANALYSIS_GUI.M with the given input arguments. % % LINEARDISCRIMINANTANALYSIS_GUI('Property','Value',...) creates a new LINEARDISCRIMINANTANALYSIS_GUI or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before LinearDiscriminantAnalysis_GUI_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to LinearDiscriminantAnalysis_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 LinearDiscriminantAnalysis_GUI % Last Modified by GUIDE v2.5 30-Nov-2021 20:49:31 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @LinearDiscriminantAnalysis_GUI_OpeningFcn, ... 'gui_OutputFcn', @LinearDiscriminantAnalysis_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 LinearDiscriminantAnalysis_GUI is made visible. function LinearDiscriminantAnalysis_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 LinearDiscriminantAnalysis_GUI (see VARARGIN) % Choose default command line output for LinearDiscriminantAnalysis_GUI handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes LinearDiscriminantAnalysis_GUI wait for user response (see UIRESUME) % uiwait(handles.figure1); % initialize data matrix handles.data = []; % plot initial figure axes(handles.axes1); plot(0, 0, 'o', 'MarkerFaceColor', 'k'); xlim([-1 1]); ylim([-1 1]); hold on; handles.hline = plot([0 0], [-1 1], 'r-', 'LineWidth', 2); hold off; % Update handles structure guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = LinearDiscriminantAnalysis_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 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) % read data from edit boxes x = str2double(get(handles.edit1, 'String')); y = str2double(get(handles.edit2, 'String')); % add data to data matrix handles.data = [handles.data; x y]; % plot data points axes(handles.axes1); plot(x, y, 'o', 'MarkerFaceColor', 'b'); % update handles structure guidata(hObject, handles); % --- Executes on selection change in popupmenu1. 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) % get selected classifier classifier = get(handles.popupmenu1, 'Value'); % train linear discriminant analysis model if classifier == 1 % train model using all data model = fitcdiscr(handles.data(:, 1:2), handles.data(:, 3)); else % train model using first 80% of data idx = randperm(size(handles.data, 1)); train_idx = idx(1:round(0.8*size(handles.data, 1))); test_idx = idx(round(0.8*size(handles.data, 1))+1:end); model = fitcdiscr(handles.data(train_idx, 1:2), handles.data(train_idx, 3)); end % get decision boundary k = model.Coeffs(1, 2).Const; b = model.Coeffs(1, 2).Linear; x = -1:0.01:1; y = k*x+b; % plot decision boundary axes(handles.axes1); delete(handles.hline); handles.hline = plot(x, y, 'r-', 'LineWidth', 2); % update handles structure guidata(hObject, handles); % --- 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 % add items to popupmenu set(hObject, 'String', {'Linear Discriminant Analysis (All Data)', 'Linear Discriminant Analysis (80% Training Data)'}); % --- Executes during object creation, after setting all properties. function axes1_CreateFcn(hObject, eventdata, handles) % hObject handle to axes1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes1 ``` 您可以将以上代码复制到MATLAB中,然后使用GUIDE工具创建GUI界面。在创建GUI界面时,需要将代码中的组件与GUIDE中的组件对应起来。完成后,您可以运行该程序并测试其功能。 希望这个代码示例能帮助到您。如果您有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值