欧氏距离分类器的Matlab实现
欧氏距离分类器是贝叶斯分类器的退化版本,在样本满足一定条件下成立。
代码如下:
function cls = mahalanobisClassifier(varargin)
[x,m,sigma] = parseInputs(varargin{:}); %分析输入的变量
dis = zeros(size(m,1),1); %欧氏距离
cls = zeros(size(x,1),1); %每个样本所属的类别
for i = 1:size(x,1) %进行分类
for j = 1:size(m,1)
dis(j) = (x(i,:)-m(j,:))/sigma*(x(i,:)-m(j,:))';
end
[~,cls(i)] = min(dis);
end
function [x,m,sigma] = parseInputs(varargin) %用于分析输入的变量的函数
narginchk(2,inf)
validateattributes(varargin{1},{'numeric'},{'nonempty','nonsparse',...
'2d'})
x = varargin{1};
if nargin == 2
validateattributes(varargin{2},{'numeric'},{'nonempty','nonsparse',...
'2d','ncols',size(x,2)})
m = varargin{2};
sigma = eye(size(m,1));
elseif nargin == 3
validateattributes(varargin{2},{'numeric'},{'nonempty','nonsparse',...
'2d','ncols',size(x,2)})
validateattributes(varargin{3},{'numeric'},{'nonempty','nonsparse',...
'2d','nrows',size(varargin{2},1),'ncols',size(varargin{2},1)})
assert(logical(prod(varargin{3}==varargin{3}')))
m = varargin{2};
sigma = varargin{3};
else
n = length(varargin);
m = zeros(n-2,size(x,2));
for k = 2:n-1
validateattributes(varargin{k},{'numeric'},{'nonempty','nonsparse',...
'2d','nrows',1,'ncols',size(m,2)})
m(k-1,:) = varargin{k};
end
validateattributes(varargin{end},{'numeric'},{'nonempty','nonsparse',...
'2d','nrows',size(m,2),'ncols',size(m,2)})
assert(logical(prod(prod(varargin{end}==varargin{end}'))))
sigma = varargin{end};
end
end