Fisher线性判别与感知器算法Matlab实现

参考用书:

Fisher线性判别与感知器算法Matlab实现_第1张图片

本文是在学习此书Chapter4时,跑的实验。

4.1.4 Fisher‘s Linear Discriminate


function [w y1 y2 Jw] = FisherLinearDiscriminat(data, label)
% FLD Fisher Linear Discriminant.
% data : D*N data
% label : {+1,-1}
% Reference:M.Bishop Pattern Recognition and Machine Learning p186-p189

% compute means and scatter matrix
%-------------------------------
inx1 = find( label == 1);
inx2 = find( label == -1);
n1 = length(inx1);
n2 = length(inx2);

m1 = mean(data(:,inx1),2);
m2 = mean(data(:,inx2),2);

S1 = (data(:,inx1)-m1*ones(1,n1))*(data(:,inx1)-m1*ones(1,n1))';
S2 = (data(:,inx2)-m2*ones(1,n2))*(data(:,inx2)-m2*ones(1,n2))';
Sw = S1 + S2;

% compute FLD 
%-------------------------------
W = inv(Sw)*(m1-m2);

y1 = W'*m1;  %label=+1
y2 = W'*m2;  %label=-1
w = W;
Jw = (y1-y2)^2/(W'*Sw*W);

Fisher线性判别与感知器算法Matlab实现_第2张图片

4.1.7 The perceptron algorithm 

function [w, mis_class] = perceptron(X,t)
% The perceptron algorithm 
%by LiFeiteng   email:[email protected]
%   X : D*N维输入数据
%   t : {+1,-1}标签
%   
%   w : [w0 w1 w2]   
%   mis_class : 错误分类数据点数

%  对t做简单的检查
if size(unique(t),2)~=2
    return
elseif max(t)~=1
    return
elseif min(t)~=-1
    return
end

[dim num_data] = size(X);
w = ones(dim+1,1);%%w = [w0 w1 w2]'
X = [ones(1,num_data); X];
maxiter = 100000;
mis_class = 0;
iter = 0;

while iter<maxiter
    iter = iter+1;
    y = w'*X;
    label = ones(1, num_data);%{+1,-1}
    label(y<=0) = -1;  
    index = find(label~=t); %错误分类的点
    mis_class = numel(index); %错误分类点的数目   
    if mis_class==0
        break
    end
    for i = 1:mis_class
        w = w + X(:,index(i))*t(index(i));
    end
end
if iter==maxiter
    disp(['达到最大迭代次数' num2str(maxiter)])
end


Fisher线性判别与感知器算法Matlab实现_第3张图片








你可能感兴趣的:(Fisher线性判别与感知器算法Matlab实现)